最簡單的基於librtmp的樣本:接收(RTMP儲存為FLV),librtmprtmp

來源:互聯網
上載者:User

最簡單的基於librtmp的樣本:接收(RTMP儲存為FLV),librtmprtmp
本文記錄一個基於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。它們之間的關係如所示。

 
 
原始碼

/** * Simplest Librtmp Receive * * 雷霄驊,張暉 * leixiaohua1020@126.com * zhanghuicuc@gmail.com * 中國傳媒大學/數字電視技術 * Communication University of China / Digital TV Technology * http://blog.csdn.net/leixiaohua1020 * * 本程式用於接收RTMP流媒體並在本地儲存成FLV格式的檔案。 * This program can receive rtmp live stream and save it as local flv file. */#include <stdio.h>#include "librtmp/rtmp_sys.h"#include "librtmp/log.h" int InitSockets(){         WORD version;         WSADATA wsaData;         version = MAKEWORD(1, 1);         return (WSAStartup(version, &wsaData) == 0);} void CleanupSockets(){         WSACleanup();} int main(int argc, char* argv[]){         InitSockets();                 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_LogLevel loglvl=RTMP_LOGDEBUG;         //RTMP_LogSetLevel(loglvl);          RTMP *rtmp=RTMP_Alloc();         RTMP_Init(rtmp);         //set connection timeout,default 30s         rtmp->Link.timeout=10;          // HKS's live URL         if(!RTMP_SetupURL(rtmp,"rtmp://live.hkstv.hk.lxdns.com/live/hks"))         {                   RTMP_Log(RTMP_LOGERROR,"SetupURL Err\n");                   RTMP_Free(rtmp);                   CleanupSockets();                   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);                   CleanupSockets();                   return -1;         }          if(!RTMP_ConnectStream(rtmp,0)){                   RTMP_Log(RTMP_LOGERROR,"ConnectStream Err\n");                   RTMP_Free(rtmp);                   RTMP_Close(rtmp);                   CleanupSockets();                   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);                   CleanupSockets();                   rtmp=NULL;         }                return 0;}

 
下載
Simplest LibRTMP Example
 
SourceForge項目地址:https://sourceforge.net/projects/simplestlibrtmpexample/
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流媒體伺服器。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.