外地車在上海需要注意什么(上海開(kāi)外地車注意事項(xiàng))
2024-08-28
更新時(shí)間:2024-08-28 09:00:11作者:佚名
對(duì)應(yīng)RTMP推流,業(yè)界有很多開(kāi)源方案。如使用FFMPEG推流,librtmp(rtmp-dump),gstream推流。由于ffmpeg和gstreamer比較龐大,僅僅用來(lái)推流,有大炮打蚊子之嫌。針對(duì)客戶端特別是瘦客戶端,使用librtmp(rtmp-dump)方案更加精簡(jiǎn),更加高效。
本方案基本思路:
RTMP視頻推流流程
1. 下載并編譯librtmp。
下載地址:
http://rtmpdump.mplayerhq.hu/download/
編譯后產(chǎn)生一個(gè)librtmp.so 庫(kù)
2. 調(diào)用librtmp,封裝一個(gè)視頻層Wrapper_RtmpLib.cpp,該類定義如下:
1classWrapper_RtmpLib 2 3{ 4 5public: 6 7Wrapper_RtmpLib(char*url); 8 9~Wrapper_RtmpLib();1011intOpen();1213intSendData(char*data,intdataLength,unsignedinttimeStamp,intdebug=-1);1415intIsConnect();1617intClose();1819private:2021intInitSockets();2223voidCleanupSockets();2425intpushSPSPPS(char*sps,intspsLen,char*pps,intppsLen,intm_stream_id,unsignedinttimeStamp);2627intpushVideoData(char*data,intdataLen,boolkeyFrame,intm_stream_id,unsignedinttimeStamp);2829intGetStartPrixLen(char*Pack,intoffest);3031char*rtmpUrl=NULL;3233RTMP*m_pRtmp=NULL;3435NALU*CopyNALU(NALU*src);3637voidFreeNALU(NALU*nalu);3839};
3. Wrapper_RtmpLib對(duì)外提供RTMP推流接口。
基本使用步驟:
1. 定義一個(gè)Wrapper_RtmpLib對(duì)象test
2. Test.open(),與服務(wù)器建立rtmp信令相關(guān)連接
3. int SendData(char * data,int dataLength, unsigned int timeStamp,int debug = -1);發(fā)送RTMP數(shù)據(jù)
注意data,必須是一個(gè)完整的NAL單元。所以應(yīng)用程序調(diào)該接口前必須解析出NAL單元。
下面是一個(gè)h264裸文件推送RTMP過(guò)程。
基本思路如下:
讀文件—-解析NAL單元—利用 SendData發(fā)送一個(gè)完成的NAL單元完成推流
編譯main.cpp Wrapper_RtmpLib.cpp 并鏈接librtmp.so生成可執(zhí)行文件h2642rtmp.
編譯生成可執(zhí)行文件
運(yùn)行可執(zhí)行程序推流
./h264tortmp avc.h264 rtmp://192.168.1.226:8085/live/1830562240700540100 25
使用該方案注意:
1. SendData 必須是一個(gè)完整的NAL單元。如果是文件需要解析或網(wǎng)絡(luò)流必須解析出NAL單元
2. 時(shí)間戳采用間隔時(shí)間。即時(shí)間戳按每幀時(shí)間間隔遞增,可能因?yàn)榫W(wǎng)絡(luò)抖動(dòng)或者1000/幀率不是幀率會(huì)存在累計(jì)誤差。該demo因?yàn)椴淮嬖谝粢曨l同步,時(shí)間戳影響不大。
3.如果是云主機(jī),在云主機(jī)內(nèi)不能推公網(wǎng)IP,而要推內(nèi)網(wǎng)IP 192.168.1.226,客戶端訪問(wèn)需要外網(wǎng)IP。
客戶端播放效果如下:
RTMP流web端播放效果