rtmp播放器解析接口(视频RTMP推流实践)
对应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();1011 int Open();1213 int SendData(char * data,int dataLength, unsigned int timeStamp,int debug = -1);1415 int IsConnect();1617 int Close();1819private:2021 int InitSockets();2223 void CleanupSockets();2425 int pushSPSPPS(char *sps, int spsLen, char *pps, int ppsLen, int m_stream_id,unsigned int timeStamp);2627 int pushVideoData(char *data, int dataLen, bool keyFrame, int m_stream_id,unsigned int timeStamp);2829 int GetStartPrixLen(char *Pack, int offest);3031 char * rtmpUrl = NULL;3233 RTMP * m_pRtmp = NULL;3435 NALU * CopyNALU(NALU * src);3637 void FreeNALU(NALU * nalu);3839};
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端播放效果
原创文章,作者:admin,如若转载,请注明出处:https://www.qq65hfghe5.com/tg/67143.html