How receive rtsp stream from ip camera in Delphi firemonkey (10.1 Berlin) [on hold]

  

I am searching for a way or component that can receive
RTSP stream from a IP surveillance camera.
I would bee able to compile and run the Delphi Firemonkey app on Android.

To achieve this tried with Indy TIdTCPClient and performed some commands
found here:RTSP

Seems to start working but I have very often “Connection closed gracefully”
errors, and Bad request 400 error.
If working I am not sure how implement the stream reading. Tried to use the TIdIOHandlerStream with TidTCPCLient which has the OnGetStreams event, but then I receive always “Connection closed gracefully” error.

Many thanks for any help!

Here the test app source code:

unit UnitVideoIP;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, FMX.ScrollBox, FMX.Memo, IdIOHandler;

type
TForm1 = class(TForm)

Client: TIdTCPClient;
Memo1: TMemo;

botOptions: TButton;
botDescribe: TButton;
botSetup: TButton;
botPlay: TButton;

procedure botOptionsClick(Sender: TObject);
procedure botDescribeClick(Sender: TObject);
procedure botSetupClick(Sender: TObject);
procedure botPlayClick(Sender: TObject);

end;

var
Form1: TForm1;

implementation

{$R *.fmx}
//————————————————–GET OPTIONS —-
procedure TForm1.botOptionsClick(Sender: TObject);
var s: string;
begin
if client.Connected=false then Client.Connect; // client is TIdTCPClient

Client.IOHandler.Writeln(‘OPTIONS * RTSP/1.0’);
Client.IOHandler.Writeln(‘CSeq: 1’);
Client.IOHandler.Writeln(”);

s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
{—— Server response ——-
RTSP/1.0 200 OK
CSeq: 0
Server: HiIpcam/V100R003 VodServer/1.0.0
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY
}
end;
//————————————————–DESCRIBE COMMAND —-
procedure TForm1.botDescribeClick(Sender: TObject);
var s: string;
begin
if client.Connected=false then Client.Connect;

Client.IOHandler.Writeln(‘DESCRIBE rtsp://admin:admin@192.168.1.200/ucast/12 RTSP/1.0’);
Client.IOHandler.Writeln(‘CSeq: 2’);
Client.IOHandler.Writeln(”);

s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);

{—— Server response ——-
RTSP/1.0 200 OK
CSeq: 2
Server: HiIpcam/V100R003 VodServer/1.0.0
Content-Type: application/sdp
Content-Length: 379

v=0
o=StreamingServer 3433055887 1360307302917838 IN IP4 192.168.1.200
s=
}
// by calling more lines I get “Connection closed gracefully”
end;
//————————————————–SETUP COMMAND —-
procedure TForm1.botSetupClick(Sender: TObject);
var s: string;
begin
if client.Connected=false then Client.Connect;

Client.IOHandler.Writeln(‘SETUP rtsp://admin:admin@192.168.1.200/ucast/12 RTSP/1.0’);
Client.IOHandler.Writeln(‘CSeq: 3’);
Client.IOHandler.Writeln(‘Transport: RTP/AVP;unicast;client_port=8000-8001;server_port=9000-9001;ssrc=1234ABCD’);
Client.IOHandler.Writeln(‘Session: 12345678’);
Client.IOHandler.Writeln(”);

s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);

{—— Server reponse ——-
Content-Base: rtsp://admin:admin@192.168.1.200/ucast/12/

v=0
o=StreamingServer 3433055887 1360307302917838 IN IP4 192.168.1.200

// BUT MORE OFTEN GET FOLLOWING ANSWER

RTSP/1.0 406 Not Acceptable
CSeq: 3
Server: HiIpcam/V100R003 VodServer/1.0.0
Require: Transport settings of rtp/udp;client_port=nnnn.
}
end;
//————————————————– PLAY Command ——-
procedure TForm1.botPlayClick(Sender: TObject);
var s: string;
begin
if client.Connected=false then Client.Connect;

Client.IOHandler.Writeln(‘PLAY rtsp://admin:admin@192.168.1.200/ucast/12 RTSP/1.0’);
Client.IOHandler.Writeln(‘CSeq: 4’);
Client.IOHandler.Writeln(”);

s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
s := Client.IOHandler.ReadLn; Memo1.Lines.Add(s);
{—— Server reponse ——-
RTSP/1.0 400 Bad Request
CSeq: 4
}
end;

end.

Comments are closed.