一个简单的RTMP服务器实现 --- RTMP与FLV
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结构如下图:
- 在RTMP中,我们常见的Header第一byte为0x17 和 0x27.分别代表关键帧(key帧或者AVC sequence header)和其他帧。
- 在Header的第一字节中,假如CodecID == 7,那么Header会多出4个字节。他们分别是AVCPacketType(1byte)和CompositionTime(3bytes)。
- 对于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)
- 当AVCPacketType == 1的时候,后面跟随的数据即为h264的nalu(非pps和sps)
AVCDecoderConfigurationRecord
AVCDecoderConfigurationRecord (AVC sequence header)是一个重要的结构,为啥这样说,因为这种类型的VideoTag数据头后,存放的数据包含sps和pps。其结构如下图所示:
这里简单说明一下:结构图中所示的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包。
后记
总结:
- 发送音视频之前需要发送音视频配置tag,比如AVC sequence header
- 在发送音视频tag之前,必须发送onMetaData tag
参考文献
- 无
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
一个简单的RTMP服务器实现 --- RTMP与FLV的更多相关文章
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- 一个简单的web服务器
写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...
- [置顶] 在Ubuntu下实现一个简单的Web服务器
要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...
- Tomcat剖析(二):一个简单的Servlet服务器
Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...
- Tomcat剖析(一):一个简单的Web服务器
Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...
- 自己模拟的一个简单的web服务器
首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...
- java实现一个简单的Web服务器
注:本段内容来源于<JAVA 实现 简单的 HTTP服务器> 1. HTTP所有状态码 状态码 状态码英文名称 中文描述 100 Continue 继续.客户端应继续其请求 101 Swi ...
- 响应式编程笔记三:一个简单的HTTP服务器
# 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...
- 转:【专题十二】实现一个简单的FTP服务器
引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...
- 使用gitblit搭建一个简单的局域网服务器
使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...
随机推荐
- Nexus系列:简介和安装(Windows、Linux)以及反向代理Nexus
目录 简介 安装 Windows Linux Nexus相关命令 Nginx反向代理Nexus 简介 Sonatype Nexus是一个Maven仓库管理器,可以节省网络带宽并加速项目搭建的进程.它可 ...
- (数据科学学习手札158)基于martin为在线地图快速构建精灵图服务
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,martin作为快速发展中的新 ...
- 关于Delphi TabOrder 更快捷的设置 方法
今天才发现 delphi IDE 有设置 TabOrder 的 更加 快捷的方法,以前 总觉的 设计 起来 好麻烦.现在 终于 解放了.... ---------------------------- ...
- Linux--Vi编辑命令(插入、替换、命令行模式、撤销)
1.进入插入模式(6个命令) [i] 从目前光标所在处插入 [I] 从目前光标 [a] 从当前光标所在的下一个字符处开始插入 [A] 从光标所在行的最后一个字符处开始插入 [o] 英文小写字母o,在目 ...
- 使用OBS Studio软件进行桌面录屏
操作系统 :Windows10_x64 OBS Studio是开源免费的录屏和直播软件,支持Windows.macOS及Linux操作系统. 这里记录下桌面录屏和桌面区域录屏的使用,也方便我后续查阅( ...
- CentOS7环境源码安装python3.9
操作系统 : CentOS7.6.1810_x64 Python 版本 : 3.9.12 1.获取源代码 python官方网址: https://www.python.org/ 源码下载地址: 或者直 ...
- push竟比concat快上数百倍?记一个concat在十万级数据引发的性能问题
壹 ❀ 引 公司产品一直在做企业项目研发工具,所以我们自己当然也会用自己的产品去管理公司大小项目,但在此之前,项目管理体验上一直存在一个卡顿问题.比如我刚登录上账号,在项目里随便到处点点到处跳转页面, ...
- JS Leetcode 154. 寻找旋转排序数组中的最小值 II 题解分析
壹 ❀ 引 早在10个月前,也就是去年,我记录了JS leetcode 寻找旋转排序数组中的最小值 题解分析,你不得不了解的二分法一题,那么这篇文章记录它的升级版,来自LeetCode154. 寻找旋 ...
- Typora关于 插入图片 居中 靠左 靠右设置
style="float: left;" <img src="C:\Users\mlx\AppData\Roaming\Typora\typora-user-ima ...
- eclipse解决maven不自动下载jar包问题
今天在eclipse中import一个maven项目,由于我手工中断了相关pom.xml中配置的jar包下载. 导致项目找不到一些jar包.具体错误见下图: 原因就是有些jar包下载没有完成导致的. ...