最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)——雷神經典
阿新 • • 發佈:2019-02-20
=====================================================
最簡單的基於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個介面函式的使用方法如下。可以看出介面比較簡單。
- /**
- * 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 buffer
- int 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流媒體伺服器。