對應RTMP推流,業界有很多開源方案。如使用FFMPEG推流,librtmp(rtmp-dump),gstream推流。由于ffmpeg和gstreamer比較龐大,僅僅用來推流,有大炮打蚊子之嫌。針對客戶端特別是瘦客戶端,使用librtmp(rtmp-dump)方案更加精簡,更加高效。
本方案基本思路:
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.
編譯生成可執行文件
運行可執行程序推流
./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流web端播放效果
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。