首页 > 其他分享 >一个简单的RTMP服务器实现 --- RTMP与FLV

一个简单的RTMP服务器实现 --- RTMP与FLV

时间:2023-02-11 17:34:37浏览次数:62  
标签:sequence 音视频 --- header RTMP FLV AVC

PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=076)
  本文发布于 2019-01-07 16:29:06,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=076)

环境说明

  无

背景


  参考前置文章:《一个简单的RTMP服务器实现 --- H264编码》https://blog.csdn.net/u011728480/article/details/85770696





前置知识

  《一个简单的RTMP服务器实现 --- H264编码》:https://blog.csdn.net/u011728480/article/details/85770696





FLV 简介


  Adobe 公司推出一种格式(Flash Video),由于其文件后缀为.flv。

  本文为何要介绍这种视频格式呢?因为在RTMP传输音视频过程中,有人发现:发送的音视频包结构和flv的文件格式部分内容非常相似。现在的网络上,有许多介绍FLV文件结构的文章,因此我不重复制造轮子。我这里只介绍RTMP中需要的FLV知识,其他内容不做说明。

  如果我们想要通过RTMP发送音视频,必须了解部分flv的封装格式。





RTMP 中我用过的FLV相关知识




FLV 文件结构简述

  FLV 文件 = FLVFileHeader + FLVFileBody
(说明:FLV文件由文件头和文件体构成)

  FLVFileBody = $$ PreviousTAGSize_0 + \sum_{k=1}^n{((TAG )_k + (PreviousTAGSize)_k)}$$
(说明:文件体由N个TAG和N+1个TAGsize构成,其中previousTagsize0值固定为零。其中previoustagsize代表前面一个tag的大小。)

  一句话来说,一个FLV文件:FLV文件头 + PreviousTagSize0 + TAG1 + PreviousTagSize1 + ... ... ... ... + TAGn + PreviousTagSizen



FLV Tag说明

  在RTMP中,所需要通过RTMP协议传输的音视频数据结构就是FLV中音视频的TAG结构。

  这里,只着重介绍Flv中VideoTag结构,并稍微介绍一下ScriptTag。至于AudioTag结构,我的服务器中没有实现,我也没有使用。同时,你只要会了RTMP推送VideoTag结构,那么你类比一下,就会用RTMP推送AudioTag结构。



FLV Video Tag

  VideoTag = VideoTagHeader+ VideoData

  其中VideoTagHeader结构如下图:

  1. 在RTMP中,我们常见的Header第一byte为0x17 和 0x27.分别代表关键帧(key帧或者AVC sequence header)和其他帧。
  2. 在Header的第一字节中,假如CodecID == 7,那么Header会多出4个字节。他们分别是AVCPacketType(1byte)和CompositionTime(3bytes)。
rep_img
  1. 对于AVCPacketType(一字节),有如下定义:
The following values are defined:
0 = AVC sequence header(AVC sequence header及其重要,代表后面的数据是AVCDecoderConfigurationRecord)
1 = AVC NALU (具体的视频数据,关于NALU,可参考前置文章)
2 = AVC end of sequence (lower level NALU sequence ender is
not required or supported)
  1. 当AVCPacketType == 1的时候,后面跟随的数据即为h264的nalu(非pps和sps)


AVCDecoderConfigurationRecord

  AVCDecoderConfigurationRecord (AVC sequence header)是一个重要的结构,为啥这样说,因为这种类型的VideoTag数据头后,存放的数据包含sps和pps。其结构如下图所示:

rep_img

  这里简单说明一下:结构图中所示的numOfSequenceParameterSets后,有两个字节的是sequenceParameterSetLength。之后存储的是h264中sps的NALU。pps 同理。

  前文我说了,RTMP传输的是VideoTag,但是如果你传输第一个VideoTag不是AVCDecoderConfigurationRecord 的话,那么你的视频是不能够被相关RTMP播放器解码的,因为sps和pps是 初始化h264解码器的重要参数。

注意咯:rtmp传输的第一个videotag一定要传输AVC sequence header这种类型的包。同时再提示一波,传输音频的时候也是如此。



FLV Script Tag(onMetaData)

  ScriptTag是用来发送一些控制属性的。

  其中onMetaData这种tag包含了一些视频的属性,在RTMP中,需要在传输音频和视频之前发送这个onMetaData包。

rep_img




后记


总结:

  1. 发送音视频之前需要发送音视频配置tag,比如AVC sequence header
  2. 在发送音视频tag之前,必须发送onMetaData tag

参考文献




打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
qrc_img

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

标签:sequence,音视频,---,header,RTMP,FLV,AVC
From: https://www.cnblogs.com/Iflyinsky/p/17112173.html

相关文章