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():初始化SocketRTMP_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個介面函式的使用方法如下。可以看出介面比較簡單。

/** * Simplest Librtmp Send 264 * * 雷霄驊,張暉 * [email protected] * [email protected] * 中國傳媒大學/數字電視技術 * Communication University of China / Digital TV Technology * http://blog.csdn.net/leixiaohua1020 * * 本程式用於將記憶體中的H.264資料推送至RTMP流媒體伺服器。 * This program can send local h264 stream to net server as rtmp live stream. */
#include <stdio.h>#include "librtmp_send264.h"FILE *fp_send1;//讀檔案的回撥函式//we use this callback function to read data from bufferint read_buffer1(unsigned char *buf, int buf_size )if(!feof(fp_send1)){  int true_size=fread(buf,1,buf_size,fp_send1);  return true_size; }else{  return -1; }}int main(int argc, char* argv[]){ fp_send1 = fopen("cuc_ieschool.h264", "rb"); //初始化並連線到伺服器 RTMP264_Connect("rtmp://localhost/publishlive/livestream");  //傳送 RTMP264_Send(read_buffer1); //斷開連線並釋放相關資源 RTMP264_Close(); return 0;}
介面函式內部的程式碼比較多,不再詳細記錄。

下載

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