1. 程式人生 > >最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)——雷神經典

最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)——雷神經典

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

最簡單的基於libRTMP的示例系列文章列表:

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


本文記錄一個基於libRTMP的釋出H.264碼流的程式。該程式可以將H.264資料釋出到RTMP流媒體伺服器。目前這個例子還不是很穩定,下一步還有待修改。

本程式使用回撥函式作為輸入,通過自定義的回撥函式,可以傳送本地的檔案或者記憶體中的資料。


函式呼叫結構圖

本程式的函式呼叫結構圖如下所示。

  整個程式包含3個介面函式:
RTMP264_Connect():建立RTMP連線。
RTMP264_Send():傳送資料。
RTMP264_Close():關閉RTMP連線。
按照順序呼叫上述3個介面函式就可以完成H.264碼流的傳送。

結構圖中關鍵函式的作用如下所列。

RTMP264_Connect()中包含以下函式:
InitSockets():初始化Socket
RTMP_Alloc():為結構體“RTMP”分配記憶體。
RTMP_Init():初始化結構體“RTMP”中的成員變數。
RTMP_SetupURL():設定輸入的RTMP連線的URL。
RTMP_EnableWrite():釋出流的時候必須要使用。如果不使用則代表接收流。
RTMP_Connect():建立RTMP連線,建立一個RTMP協議規範中的NetConnection。
RTMP_ConnectStream():建立一個RTMP協議規範中的NetStream。

RTMP264_Send()中包含以下函式:
ReadFirstNaluFromBuf():從記憶體中讀取出第一個NAL單元。
ReadOneNaluFromBuf():從記憶體中讀取出一個NAL單元。
h264_decode_sps():解碼SPS,獲取視訊的寬,高,幀率資訊。
SendH264Packet():傳送一個NAL單元。

SendH264Packet()中包含以下函式:
SendVideoSpsPps():如果是關鍵幀,則在傳送該幀之前先發送SPS和PPS。
SendPacket():組裝一個RTMPPacket,呼叫RTMP_SendPacket()傳送出去。
RTMP_SendPacket():傳送一個RTMP資料RTMPPacket。

RTMP264_Close()中包含以下函式:
RTMP_Close():關閉RTMP連線。
RTMP_Free():釋放結構體“RTMP”。
CleanupSockets():關閉Socket。

原始碼

程式提供的3個介面函式的使用方法如下。可以看出介面比較簡單。

  1. /** 
  2.  * Simplest Librtmp Send 264 
  3.  * 
  4.  * 雷霄驊,張暉 
  5.  * [email protected] 
  6.  * [email protected] 
  7.  * 中國傳媒大學/數字電視技術 
  8.  * Communication University of China / Digital TV Technology
     
  9.  * http://blog.csdn.net/leixiaohua1020 
  10.  * 
  11.  * 本程式用於將記憶體中的H.264資料推送至RTMP流媒體伺服器。 
  12.  * This program can send local h264 stream to net server as rtmp live stream. 
  13.  */
  14. #include <stdio.h>
  15. #include "librtmp_send264.h"
  16. FILE *fp_send1;  
  17. //讀檔案的回撥函式
  18. //we use this callback function to read data from buffer
  19. int read_buffer1(unsigned char *buf, int buf_size ){  
  20.     if(!feof(fp_send1)){  
  21.         int true_size=fread(buf,1,buf_size,fp_send1);  
  22.         return true_size;  
  23.     }else{  
  24.         return -1;  
  25.     }  
  26. }  
  27. int main(int argc, char* argv[])  
  28. {  
  29.     fp_send1 = fopen("cuc_ieschool.h264""rb");  
  30.     //初始化並連線到伺服器
  31.     RTMP264_Connect("rtmp://localhost/publishlive/livestream");  
  32.     //傳送
  33.     RTMP264_Send(read_buffer1);  
  34.     //斷開連線並釋放相關資源
  35.     RTMP264_Close();  
  36.     return 0;  
  37. }  

介面函式內部的程式碼比較多,不再詳細記錄。

下載

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流媒體伺服器。