PDA

View Full Version : librtmp url parsing


pythoneer
06-23-2012, 03:11 AM
Hi, i'm totally new to rtmpdump/librtmp and rtmp also. And it seams that this is my first post so i want to greet everybody :)

I'm trying to build a program for dumping rtmp streamed videos.

The url for such a stream is something like this:
rtmp://cp125301.edgefcs.net/ondemand/mp4:zdf/12/06/120621_1808_hko_vh.mp4

if i am trying to dump this with rtmpdump all seams to be fine
./rtmpdump.linux -r rtmp://cp125301.edgefcs.net/ondemand/mp4:zdf/12/06/120621_1808_hko_vh.mp4 -V -o zdf2.mp4


and in verbose mode its showing me the following extra infos:
DEBUG: Hostname : cp125301.edgefcs.net
DEBUG: Port : 1935
DEBUG: Playpath : mp4:zdf/12/06/120621_1808_hko_vh.mp4
DEBUG: tcUrl : rtmp://cp125301.edgefcs.net:1935/ondemand
DEBUG: app : ondemand



but if i'm using librtmp its seams that the parser is doing some thing different here:

#include "rtmp.h"

#include <stdio.h>

int main()
{
int retVal = 0;

RTMP* r = RTMP_Alloc();

retVal = RTMP_SetupURL(r, "rtmp://cp125301.edgefcs.net/ondemand/mp4:zdf/12/06/120621_1808_hko_vh.mp4");
printf("\n\nhost: %s \nplaypath: %s \ntcUrl: %s \napp: %s\n\n", r->Link.hostname.av_val, r->Link.playpath.av_val,r->Link.tcUrl.av_val, r->Link.app.av_val);

retVal = RTMP_Connect(r, NULL);
printf("connect r: %i\n", retVal);

return 0;
}

output is :
host: cp125301.edgefcs.net/ondemand/mp4:zdf/12/06/120621_1808_hko_vh.mp4
playpath: mp4:zdf/12/06/120621_1808_hko_vh.mp4
tcUrl: rtmp://cp125301.edgefcs.net/ondemand/mp4:zdf/12/06/120621_1808_hko_vh.mp4
app: ondemand/mp4:zdf/12/06/120621_1808_hko_vh.mp4

ERROR: WriteN, RTMP send error 104 (1 bytes)
connect r: 0
ERROR: RTMP_Connect1, handshake failed.

which differs from the values from rtmpdump and might be wrong?

i was trying to correct this by manually set the values in the RTMP record by hand as they appear in rtmpdump.. but maybe i missed something

//manual set hostname
AVal hostname;
hostname.av_val = "cp125301.edgefcs.net";
hostname.av_len = sizeof("cp125301.edgefcs.net");
r->Link.hostname = hostname;

//manual set playpath
AVal playpath;
playpath.av_val = "mp4:zdf/12/06/120621_1808_hko_vh.mp4";
playpath.av_len = sizeof("mp4:zdf/12/06/120621_1808_hko_vh.mp4");
r->Link.playpath = playpath;
// r->Link.playpath0 = playpath;
//
//manual tcUrl
AVal tcUrl;
tcUrl.av_val = "rtmp://cp125301.edgefcs.net:1935/ondemand";
tcUrl.av_len = sizeof("rtmp://cp125301.edgefcs.net:1935/ondemand");
r->Link.tcUrl = tcUrl;

//manuel app
AVal app;
app.av_val = "ondemand";
app.av_len = sizeof("ondemand");
r->Link.app = app;

after all this seams to be not working and i get an error messages:
ERROR: WriteN, RTMP send error 104 (1 bytes)
ERROR: RTMP_Connect1, handshake failed.

someone any suggestions?

regards pythonner

KSV
06-23-2012, 11:14 AM
have you even read the librtmp help (http://rtmpdump.mplayerhq.hu/librtmp.3.html). you need to pass the url in proper format.

"rtmp://cp125301.edgefcs.net/ondemand app=ondemand playpath=mp4:zdf/12/06/120621_1808_hko_vh.mp4"

also you are missing RTMP_Init(). you also need to initialize Winsock.

pythoneer
06-23-2012, 12:28 PM
Thx,

Yes i read it, but im not fully into this weird rtmp uri thing. i missed the RTMP_Init() when i pasted my messy code, but its existing.

regarding winsocks - im developing under linux and also aiming for android. where is the point the sockets come in to play?

after modifying the url as u suggested the program stucks at RTMP_SetupURL with debugger : [Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Single stepping until exit from function RTMP_SetupURL,
which has no line number information.
Quit

KSV
06-23-2012, 01:15 PM
regarding winsocks - im developing under linux and also aiming for android. where is the point the sockets come in to play?

Winsock initialization is only required for windows. are you sure you are using latest version of librtmp because it seems that server is dropping the connection after handshake failure which shouldn't be the case if you are using latest librtmp. Error 104 occurs when connection is closed by remote end.

pythoneer
06-23-2012, 02:27 PM
Winsock initialization is only required for windows. ok thx are you sure you are using latest version of librtmp yes i cloned it from here git://git.ffmpeg.org/rtmpdump

but after i used the correct version of the url from you i get a segmentation fault
#0 0x00007f55fa627071 in RTMP_SetupURL () from /usr/lib/x86_64-linux-gnu/librtmp.so.0

am i messed something up with the 32/64 bit stuff?