最简单的基于librtmp的示例:接收(RTMP保存为FLV)

=====================================================

最简单的基于libRTMP的示例系列文章列表:

最简单的基于librtmp的示例:接收(RTMP保存为FLV)

最简单的基于librtmp的示例:发布(FLV通过RTMP发布)

最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)

=====================================================


本文记录一个基于libRTMP的接收流媒体的程序:Simplest libRTMP Receive。该程序可以将RTMP流保存成本地FLV文件。实际上本文记录的程序就是一个“精简”过的RTMPDump。RTMPDump功能比较多,因而其代码比较复杂导致很多初学者不知从何下手。而本文记录的这个程序只保留了RTMPDump中最核心的函数,更加方便新手入门学习libRTMP。

 

流程图

使用librtmp接收RTMP流的函数执行流程图如下图所示。

流程图中关键函数的作用如下所列:
InitSockets():初始化Socket
RTMP_Alloc():为结构体“RTMP”分配内存。
RTMP_Init():初始化结构体“RTMP”中的成员变量。
RTMP_SetupURL():设置输入的RTMP连接的URL。
RTMP_Connect():建立RTMP连接,创建一个RTMP协议规范中的NetConnection。
RTMP_ConnectStream():创建一个RTMP协议规范中的NetStream。
RTMP_Read():从服务器读取数据。
RTMP_Close():关闭RTMP连接。
RTMP_Free():释放结构体“RTMP”。
CleanupSockets():关闭Socket。
 
其中NetStream和NetConnection是RTMP协议规范中的两个逻辑结构。NetStream建立在NetConnection之上。一个NetConnection可以包含多个NetStream。它们之间的关系如下图所示。

 
 

源代码

[cpp]  view plain copy
  1. /** 
  2.  * Simplest Librtmp Receive 
  3.  * 
  4.  * 雷霄骅,张晖 
  5.  * leixiaohua1020@126.com 
  6.  * zhanghuicuc@gmail.com 
  7.  * 中国传媒大学/数字电视技术 
  8.  * Communication University of China / Digital TV Technology 
  9.  * http://blog.csdn.net/leixiaohua1020 
  10.  * 
  11.  * 本程序用于接收RTMP流媒体并在本地保存成FLV格式的文件。 
  12.  * This program can receive rtmp live stream and save it as local flv file. 
  13.  */  
  14. #include <stdio.h>  
  15. #include "librtmp/rtmp_sys.h"  
  16. #include "librtmp/log.h"  
  17.   
  18. int InitSockets()  
  19. {  
  20.     WORD version;  
  21.     WSADATA wsaData;  
  22.     version = MAKEWORD(1, 1);  
  23.     return (WSAStartup(version, &wsaData) == 0);  
  24. }  
  25.   
  26. void CleanupSockets()  
  27. {  
  28.     WSACleanup();  
  29. }  
  30.   
  31. int main(int argc, char* argv[])  
  32. {  
  33.     InitSockets();  
  34.       
  35.     double duration=-1;  
  36.     int nRead;  
  37.     //is live stream ?  
  38.     bool bLiveStream=true;                
  39.       
  40.       
  41.     int bufsize=1024*1024*10;             
  42.     char *buf=(char*)malloc(bufsize);  
  43.     memset(buf,0,bufsize);  
  44.     long countbufsize=0;  
  45.       
  46.     FILE *fp=fopen("receive.flv","wb");  
  47.     if (!fp){  
  48.         RTMP_LogPrintf("Open File Error.\n");  
  49.         CleanupSockets();  
  50.         return -1;  
  51.     }  
  52.       
  53.     /* set log level */  
  54.     //RTMP_LogLevel loglvl=RTMP_LOGDEBUG;  
  55.     //RTMP_LogSetLevel(loglvl);  
  56.   
  57.     RTMP *rtmp=RTMP_Alloc();  
  58.     RTMP_Init(rtmp);  
  59.     //set connection timeout,default 30s  
  60.     rtmp->Link.timeout=10;     
  61.     // HKS's live URL  
  62.     if(!RTMP_SetupURL(rtmp,"rtmp://live.hkstv.hk.lxdns.com/live/hks"))  
  63.     {  
  64.         RTMP_Log(RTMP_LOGERROR,"SetupURL Err\n");  
  65.         RTMP_Free(rtmp);  
  66.         CleanupSockets();  
  67.         return -1;  
  68.     }  
  69.     if (bLiveStream){  
  70.         rtmp->Link.lFlags|=RTMP_LF_LIVE;  
  71.     }  
  72.       
  73.     //1hour  
  74.     RTMP_SetBufferMS(rtmp, 3600*1000);        
  75.       
  76.     if(!RTMP_Connect(rtmp,NULL)){  
  77.         RTMP_Log(RTMP_LOGERROR,"Connect Err\n");  
  78.         RTMP_Free(rtmp);  
  79.         CleanupSockets();  
  80.         return -1;  
  81.     }  
  82.   
  83.     if(!RTMP_ConnectStream(rtmp,0)){  
  84.         RTMP_Log(RTMP_LOGERROR,"ConnectStream Err\n");  
  85.         RTMP_Close(rtmp);  
  86.         RTMP_Free(rtmp);  
  87.         CleanupSockets();  
  88.         return -1;  
  89.     }  
  90.   
  91.     while(nRead=RTMP_Read(rtmp,buf,bufsize)){  
  92.         fwrite(buf,1,nRead,fp);  
  93.   
  94.         countbufsize+=nRead;  
  95.         RTMP_LogPrintf("Receive: %5dByte, Total: %5.2fkB\n",nRead,countbufsize*1.0/1024);  
  96.     }  
  97.   
  98.     if(fp)  
  99.         fclose(fp);  
  100.   
  101.     if(buf){  
  102.         free(buf);  
  103.     }  
  104.   
  105.     if(rtmp){  
  106.         RTMP_Close(rtmp);  
  107.         RTMP_Free(rtmp);  
  108.         CleanupSockets();  
  109.         rtmp=NULL;  
  110.     }     
  111.     return 0;  
  112. }  


运行结果 

程序运行后,会将URL为“rtmp://live.hkstv.hk.lxdns.com/live/hks”的直播流(实际上是香港卫视)在本地保存为“receive.flv”。保存后的文件使用播放器就可以观看。


下载


Simplest LibRTMP Example
 

项目主页

SourceForge:https://sourceforge.net/projects/simplestlibrtmpexample/

Github:https://github.com/leixiaohua1020/simplest_librtmp_example

开源中国:http://git.oschina.net/leixiaohua1020/simplest_librtmp_example


CSDN下载: http://download.csdn.net/detail/leixiaohua1020/8291757
 
本工程包含了LibRTMP的使用示例,包含如下子工程:
simplest_librtmp_receive: 接收RTMP流媒体并在本地保存成FLV格式的文件。
simplest_librtmp_send_flv: 将FLV格式的视音频文件使用RTMP推送至RTMP流媒体服务器。
simplest_librtmp_send264: 将内存中的H.264数据推送至RTMP流媒体服务器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值