【流媒体FLV封装协议】

 

FLV封装格式介绍及解析

FLV封装格式

FLV(Flash Video)是Adobe公司推出的一种流媒体格式,由于其封装后的音视频文件体积小、封装简单等特点,非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用FLV格式封装的文件后缀为.flv。

FLV封装格式是由一个文件头(flie header)和 文件体(file Body)组成。其中,FLV body由一对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段 排列在Tag之前,占用4个字节。Previous Tag Size记录了前面一个Tag的大小,用于逆向读取处理。FLV header后的第一个Pervious Tag Size的值为0。Tag一般可以分为3种类型:脚本(帧)数据类型、音频数据类型、视频数据。FLV数据以大端序进行存储,在解析时需要注意。一个标准FLV文件结构如下图:

FLV文件的详细内容结构如下图:

FLV文件详细内容结构

FLV header

注:在下面的数据type中,UI表示无符号整形,后面跟的数字表示其长度是多少位。比如UI8,表示无法整形,长度一个字节。UI24是三个字节,UI[8*n]表示多个字节。UB表示位域,UB5表示一个字节的5位。可以参考c中的位域结构体。

FLV头占9个字节,用来标识文件为FLV类型,以及后续存储的音视频流。一个FLV文件,每种类型的tag都属于一个流,也就是一个flv文件最多只有一个音频流,一个视频流,不存在多个独立的音视频流在一个文件的情况。FLV头的结构如下:

 

FLV Body

FLV Header之后,就是FLV File Body.FLV File Body是由一连串的back-pointers + tags构成。Back-pointer表示Previous Tag Size(前一个tag的字节数据长度),占4个字节。

 

FLV Tag

每一个Tag也是由两部分组成:tag header 和 tag data。Tag Header里存放的是当前tag的类型、数据区(tag data)的长度等信息。tag header一般占11个字节的内存空间。FLV tag结构如下:

FLV Tag的类型可以是视频、音频和Script(脚本类型),下面分别介绍这三种Tag类型

Script Tag Data结构(脚本类型、帧类型)

该类型Tag又被称为MetaData Tag,存放一些关于FLV视频和音频的元信息,比如:duration、width、height等。通常该类型Tag会作为FLV文件的第一个tag,并且只有一个,跟在File Header后。该类型Tag DaTa的结构如下所示:

第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。

第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如下表所示。

 

Audio Tag Data结构(音频类型)

音频Tag Data区域开始的第一个字节包含了音频数据的参数信息,从第二个字节开始为音频流数据。结构如下:

Audio Tag Data结构

第一个字节为音频的信息,格式如下:

格式 3,linear PCM,存储原始 PCM 采样点。如果采样位深为 8,采样点数据为无符号型。如果采样位深为 16,采样点数据为小端存储的带符号型。如果是立体声,左右声道采样点交织存放:左-右-左-右-...

格式 0 与格式 3 的不同之处只有一点:格式 0 存储 16 位采样数据,采用的大小端顺序是创建 FLV 文件的平台所使用的大小端顺序。因此,不应使用格式 0,而应使用格式 3。

格式 4 (Nellymoser 16-kHz mono) 和格式 5 (Nellymoser 8 kHz mono),是两种特殊情况, 因为采样率字段无法表示 8 kHz 和 16 kHz。当采样格式是格式 4 或格式 5 时,Flash 播放器会忽略采样率和声音类型两个字段。对于其他采样率的 Nellymoser 格式, 即格式 6,则正常使用采样率和声音类型两个字段。

格式 10,AAC,声音类型应为 1 (立体声) 且采样率应为 3 (44 kHz)。这并不表示 FLV 中的 AAC 音频总是立体声、44 kHz的数据。实际上,Flash 播放器会忽略这两个值,而从已编码的 AAC 位流中提取出声道数和采样率信息。

格式 11,Speex,音频以 16 kHz采样率压缩为单声道,采样率字段值应为 0,采样位深字段值应为 1,声音类型字段值应为 0。

格式 7,8,14 和 15 保留。

第二个字节开始为音频数据。

 

Video Tag Data结构(视频类型)

视频Tag Data开始的第一个字节包含视频数据的参数信息,从第二个字节开始为视频流数据。结构如下:

video Tag Data结构

第二个字节开始为视频数据

AVC VIDEO PACKET

关于下面这块内容有兴趣的话可以结合h264结构来看,不感兴趣的话可以直接跳过。

AVC VIDEO PACKET的结构:

关于CTS:这是一个比较难以理解的概念,需要和pts,dts配合一起理解。

首先,pts(presentation time stamps),dts(decoder timestamps),cts(CompositionTime)的概念:

pts:显示时间,也就是接收方在显示器显示这帧的时间。单位为1/90000 秒。

dts:解码时间,也就是rtp包中传输的时间戳,表明解码的顺序。单位单位为1/90000 秒。——根据后面的理解,pts就是标准中的CompositionTime

cts偏移:cts = (pts - dts) / 90 。cts的单位是毫秒。

pts和dts的时间不一样,应该只出现在含有B帧的情况下,也就是profile main以上。baseline是没有这个问题的,baseline的pts和dts一直相同,所以cts一直为0。

AVC VIDEO PACKET中Data的结构:

参考

https://www.jianshu.com/p/419f99be3989

https://www.cnblogs.com/leisure_chn/p/10662941.html

https://blog.csdn.net/leixiaohua1020/article/details/17934487

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python画统计图代码_Python使用统计函数绘制简单图形实例代码

前言 Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。 用matplotlib绘制一些大家比较熟悉又经常混淆的统计图形,掌握这些统计图形可以对…

javafx css_JavaFX缺少的功能调查:CSS

javafx css在“ 缺少的功能调查”系列的最后一篇文章中,我说过这篇文章是关于CSS和FXML中缺少的功能。 现在事实证明,调查提交的内容不包含任何有效的FXML问题。 因此,我将仅关注CSS。 这些是报告CSS功能缺失: 完全CSS支持–当前…

linux系统打开m3u8文件,M3U8 文件扩展名: 它是什么以及如何打开它?

M3U8 疑难解答打开 M3U8 文件过程中所遇到的常见问题Microsoft Windows Media Player 已删除尝试打开 M3U8 文件时,您收到错误 “无法打开 M3U8 文件类型”。 通常,%%os%% 中会出现这种情况,因为 Microsoft Windows Media Player 未安装在你的…

FFmpeg NDK跨平台交叉编译

1.首先选择Windows平台安装好环境 windows搭建gcc开发环境(msys2) 2.创建一个通用脚本 basepath$(cd dirname $0; pwd) echo ${basepath} cd ${basepath}/ffmpeg-4.3.1#可以根据平台的不同进行修改 ANDROID_NDK_HOME/c/msys64/home/android-ndk-r21b-windows-x86_64/android…

r语言 C4.5 剪枝是用什么算法_决策树,逻辑回归,PCA算法面经

目录决策树简述决策树原理?为什么要对决策树进行减枝?如何进行减枝?简述决策树的生成策略PCA简述主成分分析PCA工作原理,以及PCA的优缺点?PCA中有第一主成分、第二主成分,它们分别是什么,又是如…

视图中::text_新CalendarFX视图:MonthGridView!

视图中::text我和我的团队最近开始为CalendarFX创建新视图,其最初目标是在垂直栏中显示整年。 该视图的名称是MonthGridView。 与往常一样,编码时目标略有变化。 该视图现在可以显示任意数量的月份,并且可以在前面或后面添加额外的月份。 现在…

linux关闭远程服务器,linux – 远程主机关闭SSH连接

我有问题连接SSH到远程主机,但只在我的家庭网络(提供商).如果我在另一个网络(我在同一个城市的朋友 – 不同的提供商),连接工作完美. Ping到服务器(在我家)工作.这个问题我只有这个服务器.如果我尝试从家庭网络连接到其他主机,它可以工作.我该怎么办?nichubuntu:/et…

面向对象开发的五大基本原则

单一职责 开闭原则 替换原则 接口隔离 依赖倒置

python取前三位_python3 获取前几个高频列表元素

python3 获取前几个高频列表元素 2020-11-20 --- 讲解对象:python3 获取前几个高频列表元素 作者:融水公子 rsgz Python3教程 most_common(N) 作用:可以返回指定数量的出现频率最高的几个列表元素 参数:指定返回元素的数量 返回前…

cassandra_Spring Boot Cassandra的第一步

cassandra如果您想通过Spring Boot开始使用Cassandra NoSQL数据库,最好的资源可能是此处提供的Cassandra示例以及Spring数据Cassandra文档 。 通过实际在本地安装Cassandra并对其进行基本测试,我将采取一些绕过的方式,我的目标是在下一篇博客…

linux 内核 性能,Linux内核十个版本性能对比

【IT168 评论】从2008年1月底至今,Linux Kernel系统内核已经先后升级了十次,版本号也从2.6.24上升到2.6.33,并且下个版本2.6.34也已进入开发阶段。今天我们就看看过去两年内这十个版本在性能上有何差异。测试平台是一套工作站系统&#xff0c…

python字符串split_python字符串之split

函数:split() Python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串。通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list) os.path.split():…

应用程序缓存_应用程序模块和实体缓存

应用程序缓存任何具有ADF业务组件基础知识的ADF开发人员都应该熟悉下图: 它代表运行时ADF业务组件的核心构建块。 有一个包含视图对象实例的根应用程序模块实例。 视图对象实例可能由存储在实体集合或换句话说就是实体缓存中的实体对象备份。 根应用程序模块可能还…

虚拟linux输入命令没有权限,Linux命令_vi_权限管理

3.2、vi的高级使用* 查找在命令模式下,输入/xxx,就可以查找到xxx* 快速切换行在命令模式下,输入:num,就可以快速切换到num行* 设置显示行号在命令模式下,输入:set nu,就可以显示行号注:设置不显…

【开源项目】超级播放器1.0

面向对象开发的五大基本原则 单一职责 各个模块相对独立,优点一:在修改其中某个模块的时候不会对其他模块造成影响;优点二:可以对各个模块进行单独的测试;例如解封装模块和解码模块相互独立设计。 开闭原则 对扩展…

python字符串排序_Python-如何对字符串列表进行排序?

小编典典 基本答案: mylist ["b", "C", "A"] mylist.sort() 这会修改你的原始列表(即就地排序)。要获得列表的排序副本,而无需更改原始副本,请使用以下sorted()函数: for x…

jsp界面自动生成文件注释_实施注释界面

jsp界面自动生成文件注释对于Java开发人员而言,每天都需要使用注释。 如果没有其他简单的Override注释,那该响了。 创建注释要复杂一些。 在运行时通过反射使用“自制”注释或在编译时调用注释处理器也是一种复杂性。 但是我们很少“实现”注释接口。 暗…

linux c 数据写入硬盘分区,Linux操作篇之分区/磁盘扩容(一)

在实际工作中,系统的运行会产生大量的日志 、临时、以及生产文件等数据。所以对磁盘空间也是有一定要求的。但在前期工作中,可能不会需要太大的空间,但是随着后期的使用,存储空间需求很大。这个时候进行扩容就可以了。一般情况下&…

js mztreeview 双击事件_Mac下的Node.js安装教程

前言更多详情,请访问我的 个人博客。什么是Node.jsNodeJS官网上的介绍:Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model …