在windows下利用RTMP接收数据的代码有很多的例子可以参考,但是在Linux下利用rtmp协议接收数据,例子特别少。在无计可用的情况下,只能自己写代码了。
在写代码之前需要做一点事情,去rtmp官网上下载rtmpdump的代码包。
利用命令:
wget http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz
效果图如下:
接下来解压包。
利用命令:
tar -xf rtmpdump-2.3.tgz
cd rtmpdump-2.3
make && make install
这里会生成库文件:
librtmp.so librtmp.so.0
接下来是使用的是以下代码实现接收rtmp的数据。
rmtp_client.c代码如下:
#include <stdio.h>
#include <stdbool.h>
#include "rtmp_sys.h"
#include "log.h"
int main(int argc, char* argv[])
{
double duration=-1;
int nRead;
//is live stream
bool bLiveStream=true;
int bufsize=1024*1024*10;
char *buf=(char*)malloc(bufsize);
memset(buf,0,bufsize);
long countbufsize=0;
FILE *fp=fopen("receive.flv","wb");
if (!fp){
RTMP_LogPrintf("Open File Error.\n");
// CleanupSockets();
return -1;
}
/* set log level */
RTMP *rtmp=RTMP_Alloc();
RTMP_Init(rtmp);
rtmp->Link.timeout=10;
if(!RTMP_SetupURL(rtmp,"rtmp://192.168.1.123/vod/stream"))
{
RTMP_Log(RTMP_LOGERROR,"SetupURL Err\n");
RTMP_Free(rtmp);
return -1;
}
if (bLiveStream){
rtmp->Link.lFlags|=RTMP_LF_LIVE;
}
//1hour
RTMP_SetBufferMS(rtmp, 3600*1000);
if(!RTMP_Connect(rtmp,NULL)){
RTMP_Log(RTMP_LOGERROR,"Connect Err\n");
RTMP_Free(rtmp);
return -1;
}
if(!RTMP_ConnectStream(rtmp,0)){
RTMP_Log(RTMP_LOGERROR,"ConnectStream Err\n");
RTMP_Close(rtmp);
RTMP_Free(rtmp);
return -1;
}
while(nRead=RTMP_Read(rtmp,buf,bufsize)){
fwrite(buf,1,nRead,fp);
countbufsize+=nRead;
RTMP_LogPrintf("Receive: %5dByte, Total: %5.2fkB\n",nRead,countbufsize*1.0/1024);
}
if(fp)
fclose(fp);
if(buf)
{
free(buf);
}
if(rtmp)
{
RTMP_Close(rtmp);
RTMP_Free(rtmp);
rtmp=NULL;
}
return 0;
}
其中的头文件,都是在rtmpdump里面有的源码。
然后编译的时候是用:
gcc client_rtmp.c -o client_rtmp -lrtmp
然后生成了client_rtmp可执行文件。
可以接收的数据如下效果如下:
在linux中的rmtp的socket机制已经在库内部实现了,不需要再进行自己初始化和释放。