視頻RTMP推流實踐「rtmp播放器解析介面」

對應RTMP推流,業界有很多開源方案。如使用FFMPEG推流,librtmp(rtmp-dump),gstream推流。由於ffmpeg和gstreamer比較龐大,僅僅用來推流,有大炮打蚊子之嫌。針對客戶端特別是瘦客戶端,使用librtmp(rtmp-dump)方案更加精簡,更加高效。

本方案基本思路:視頻RTMP推流實踐

RTMP視頻推流流程

1. 下載並編譯librtmp。

下載地址:
http://rtmpdump.mplayerhq.hu/download/

編譯後產生一個librtmp.so 庫

2. 調用librtmp,封裝一個視頻層Wrapper_RtmpLib.cpp,該類定義如下:

 1class Wrapper_RtmpLib
 2
 3{
 4
 5public:
 6
 7       Wrapper_RtmpLib(char * url);
 8
 9       ~Wrapper_RtmpLib();
10
11      int Open();
12
13      int SendData(char * data,int dataLength, unsigned int timeStamp,int debug = -1);
14
15      int IsConnect();
16
17      int Close();
18
19private:
20
21     int InitSockets();
22
23     void CleanupSockets();
24
25     int pushSPSPPS(char *sps, int spsLen, char *pps, int ppsLen, int m_stream_id,unsigned int timeStamp);
26
27     int pushVideoData(char *data, int dataLen, bool keyFrame, int m_stream_id,unsigned int timeStamp);
28
29     int GetStartPrixLen(char *Pack, int offest);
30
31     char * rtmpUrl = NULL;
32
33     RTMP * m_pRtmp = NULL;
34
35     NALU * CopyNALU(NALU * src);
36
37     void FreeNALU(NALU * nalu);
38
39};

3. Wrapper_RtmpLib對外提供RTMP推流介面。

基本使用步驟:

1. 定義一個Wrapper_RtmpLib對象test

2. Test.open(),與伺服器建立rtmp信令相關連接

3. int SendData(char * data,int dataLength, unsigned int timeStamp,int debug = -1);發送RTMP數據

注意data,必須是一個完整的NAL單元。所以應用程序調該介面前必須解析出NAL單元。

下面是一個h264裸文件推送RTMP過程。

基本思路如下:

讀文件—-解析NAL單元—利用 SendData發送一個完成的NAL單元完成推流

編譯main.cpp Wrapper_RtmpLib.cpp 並鏈接librtmp.so生成可執行文件h2642rtmp.視頻RTMP推流實踐

編譯生成可執行文件

運行可執行程序推流

./h264tortmp avc.h264 rtmp://192.168.1.226:8085/live/1830562240700540100 25

使用該方案注意:

1. SendData 必須是一個完整的NAL單元。如果是文件需要解析或網路流必須解析出NAL單元

2. 時間戳採用間隔時間。即時間戳按每幀時間間隔遞增,可能因為網路抖動或者1000/幀率不是幀率會存在累計誤差。該demo因為不存在音視頻同步,時間戳影響不大。

3.如果是雲主機,在雲主機內不能推公網IP,而要推內網IP 192.168.1.226,客戶端訪問需要外網IP。

客戶端播放效果如下:視頻RTMP推流實踐

RTMP流web端播放效果

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/275148.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-17 14:20
下一篇 2024-12-17 14:20

相關推薦

發表回復

登錄後才能評論