目前常用的流媒体协议RTMP、HLS、Http-FLV,其中hls协议的延迟太大,rtmp的协议实现比较复杂,而http-flv基于http协议简单方便,在浏览器上实现播放也非常容易。
此文讲解rtmp客户端拉到rtmp流后,转封装成flv 格式并通过 http服务器发送给客户端的过程。(rtmp格式直接观看门槛比较高,要自定义播放器及设备)
一、rtmp消息格式
rtmp协议不作过多说明。握手完成后,主要传输的是视频和声音数据,
参考 rtmp官方标准规范详细解析 https://www.cnblogs.com/chgaowei/p/5445558.html
如何理解 rtmp 通过 flv 格式推送音视频流(h264/aac),https://zhuanlan.zhihu.com/p/83454344
二、flv格式
flv格式参考:https://blog.csdn.net/weixin_42462202/article/details/88661883
用FlvAnalyzer.exe可以打开一个flv进行查看flv的内部信息, 下载地址https://github.com/zymill/flvAnalyser
软件运行如下图:
三、rtmp转flv
flv header 文件头
flv tag , 一个tag还包含tag header 和 tag body
rtmp一个消息装入一个flv tag是非常容易的事情。
发送flv时要先发送flv header,再发送flv tag
还有一个关键点, AVC sequence header & AAC sequence header ,https://blog.csdn.net/ai2000ai/article/details/85114110
这个是向解码端说明视频和音频的信息,包含分辨率和帧率,音频采样率等等。 非常重要,这个信息只在rtmp client连接到server的时候发送一次,(如果后面server发生改变也会发送),因此rtmp client要将此消息保存下来,在发送flv时,优先发送这个部分。否则会报无解码器信息。
代码示例: https://github.com/PHZ76/rtmp (这里实现的是rtmp服务端接受rtmp push转flv,拉流转flv与此大致过程基本相同)
更多参考:
http-flv详情及与其他流媒体协议的对比: https://www.yanxurui.cc/posts/server/2017-11-25-http-flv/