델파이로 윈도우, 안드로이드, ISO, 리룩스 등 멀티 플랫폼 개발을 지원한다. 하지만 나처럼 비 전공자에게는 넘어야 할 산이 많다.
이번에는 IP카메라를 안드로이드 폰에서 영상을 실시간으로 볼 수있는 앱을 개발하려고 한다.
요즘 대세인 ChatGPT 에게 물어보자
결론부터 말하면 안된다.
(물론 나보다 능력이 좋은 사람은 어떻게든 수정해서 할 수 있을지 모르겠다.)
되는 방법만 보고 싶으면 아래 빨간 글씨부터 보면 된다.
나 : 델파이 안드로이드 IP카메라 연결
ChatGPT :
안드로이드 애플리케이션에서 IP 카메라에 연결하려면 일반적으로 다음 단계를 수행해야 합니다.
- IP 카메라의 IP 주소 및 포트 번호 확인
- IP 카메라의 IP 주소 및 포트 번호를 알아야 안드로이드 애플리케이션에서 IP 카메라와 통신할 수 있습니다. 이 정보는 일반적으로 IP 카메라의 사용 설명서나 설정 메뉴에서 확인할 수 있습니다.
- 안드로이드 애플리케이션에서 IP 카메라 연결
- 안드로이드에서 IP 카메라에 연결하려면 소켓을 열어서 IP 카메라와 통신해야 합니다. 이를 위해서는 안드로이드 애플리케이션에서 소켓 연결 코드를 작성해야 합니다. 예를 들어, Socket 클래스를 사용하여 IP 주소와 포트 번호를 지정하여 소켓을 열 수 있습니다.
- 데이터 수신 및 처리
- 안드로이드 애플리케이션에서 IP 카메라와 연결하고 나면, IP 카메라에서 전송되는 데이터를 수신하고 처리할 수 있습니다. 이를 위해서는 안드로이드 애플리케이션에서 데이터 수신 및 처리 코드를 작성해야 합니다. 예를 들어, BufferedInputStream 클래스를 사용하여 데이터를 수신하고 BitmapFactory 클래스를 사용하여 비트맵 이미지로 변환할 수 있습니다.
- 안드로이드 애플리케이션에서 카메라 영상 표시
- 안드로이드 애플리케이션에서 IP 카메라와 연결하고 데이터를 수신하면, 이를 화면에 표시할 수 있습니다. 이를 위해서는 안드로이드 애플리케이션에서 이미지뷰 등의 UI 요소를 사용하여 비트맵 이미지를 화면에 표시하는 코드를 작성해야 합니다.
위 단계들을 참고하여, 안드로이드에서 IP 카메라와 연결하는 예제 코드를 작성할 수 있습니다. 다만, 실제 IP 카메라와 연결하는 경우에는 IP 카메라의 모델 및 설정에 따라 세부적인 작업이 달라질 수 있습니다.
나 : 델파이 코드로 만들어줘
ChatGPT
아래는 델파이로 IP 카메라와 연결하여 영상을 화면에 표시하는 예제 코드입니다. 이 코드는 Indy 컴포넌트를 사용하여 구현되었으며, FMX 프레임워크를 기반으로 합니다.
unit MainForm;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, FMX.Objects;
type
TForm1 = class(TForm)
ImageView: TImageView;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FIdHTTP: TIdHTTP;
FIdTCPClient: TIdTCPClient;
FBitmap: TBitmap;
procedure OnHTTPWork(ASender: TObject; AWorkMode: TWorkMode; ABytesDone: Int64);
procedure OnHTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
public
{ Public declarations }
end;
var
Form1: TForm1;
const
IP_ADDRESS = '192.168.0.100'; // IP 카메라의 IP 주소
PORT = 8080; // IP 카메라의 포트 번호
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
FIdHTTP := TIdHTTP.Create(nil);
FIdTCPClient := TIdTCPClient.Create(nil);
FBitmap := TBitmap.Create;
FIdTCPClient.Host := IP_ADDRESS;
FIdTCPClient.Port := PORT;
FIdTCPClient.ConnectTimeout := 5000;
FIdTCPClient.Connect;
FIdHTTP.OnWork := OnHTTPWork;
FIdHTTP.OnWorkEnd := OnHTTPWorkEnd;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FIdTCPClient.Disconnect;
FIdTCPClient.Free;
FIdHTTP.Free;
FBitmap.Free;
end;
procedure TForm1.OnHTTPWork(ASender: TObject; AWorkMode: TWorkMode; ABytesDone: Int64);
begin
// do nothing
end;
procedure TForm1.OnHTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
// 비트맵 이미지로 변환
FBitmap.LoadFromStream(FIdHTTP.Response.ContentStream);
// UI 스레드에서 이미지뷰 업데이트
TThread.Synchronize(nil,
procedure
begin
ImageView.Bitmap := FBitmap;
end);
// 재요청
FIdHTTP.Get('http://' + FIdTCPClient.Host + ':' + IntToStr(FIdTCPClient.Port) + '/?action=stream');
end;
end.
그럴싸 하다. 이제 만들어 보자
음...역시 안된다.
사실 이런 시도를 수차례 하였다. (ONVIF 방법을 써서 만들어줘~, RTSP를 써서 만들어 줘~ 등등)
이놈의 프로그램 개발은 그냥 쉽게 넘어가는 법이 없다.
그래도 https://github.com/Laex 여기에 있는 자료가 제일 믿음이 가고 잘 되어 있다. 하지만, 윈도우 환경에서만 실행이 되고 안드로이드에서는 여러 문제가 발생하여 잘 안됬다. 잘되시는 분이 계시다면 알려주시면 얼마나 좋을까요?~
여러 차례 시도한 방법을 모두 기술할 수는 없으니, 성공한 것만 적어보겠다.
[VCL Player 컴포넌트 사용]
돈안들이고 개발하는 것은 쉽지 않다. 그래서 컴포넌트를 열심히 찾았다. 아래 사이트에서 Trial 버전을 받아서 설치하여 테스트 해보았다. 가격은 $299
http://www.flashavconverter.com/content/vlc-player-ios-android-delphi-component
카메라는 사무실에서 쓰고 있던 Tapo c210이다.
준비 사항
1. C210의 IP주소와 Username과 Password : Tapo 전용 앱에서 설정할 수 있다.(자세한 사항은 메뉴얼 참조)
2. VLC Player 컴포넌트 : 별거 없다. 다운받아서 압출 풀고 ext 파일 실행(사용 델파이 버전은 11.2)
3. C:\문서\VLC_Mobile_Trial 폴더에 파일이 설치되는데 안에 Sources가 있다. path에 폴더 추가
4. Example 열기
"C:\문서\VLC_Mobile_Trial\Examples\D10\Android\2DPlayer" 에서 안드로이드 예제를 델파이에서 열기.
위의 첫번째 칸은 파일을 재생하는 것이고, 두번째 칸에서 url을 넣어서 실행이 가능하다.
테스트 URL - rtsp://ID:PW@192.168.0.2/stream1
ID와 PW는 Tapo 앱에서 설정한 것이고, stream1은 Tapo C210 메뉴얼에서 rtsp 프로토콜을 확인한 것이다. IP 카메라에 따라 다르니 메뉴얼을 참고 해야 한다.
갤럭시 S22 울트라와 연결하여 디버깅하니 에러가 발생했다.
이거 해결하는것도 쉽지 않을 것 같았다... 폭풍검색..
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask"
android:exported ="True"
>
targetSdkVersion 31이상은 android:exported 를 표시해줘야 한다.
android:exported ="True"
이렇게 해서 화면에 실시간 스트리밍하기 성공이다. (근데 딜레이가 2~3초 있네... 카메라가 느린건가??)
'delphi' 카테고리의 다른 글
Stringgrid의 셀의 폰트와 정렬 (0) | 2023.03.08 |
---|---|
HPF & LPF (0) | 2023.03.08 |
Delphi 11.2 FireMonkey Low Code App Wizard - Error (0) | 2023.03.08 |
Delphi Tips #1 (0) | 2023.03.07 |
The advantages of Delphi compared to Python (0) | 2023.03.07 |