音视频基础(七)---FLV

FLV格式分析

FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。

FLV封装格式是由⼀个⽂件头(file 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 heeader

注:在下⾯的数据type中,UI表示⽆符号整形,后⾯跟的数字表示其⻓度是多少位。⽐如UI8,表示⽆符号整形,⻓度⼀个字节。UI24是三个字节,UI[8*n]表示多个字节。UB表示位域,UB5表示⼀个字节的5位。可以参考c中的位域结构体。FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流。⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个独⽴的⾳视频流在⼀个⽂件的情况。
00000 1 0 1
在这里插入图片描述

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

tag header⼀般占11个字节的内存空间。FLV tag结构如下:
在这里插入图片描述
注意:

  1. flv⽂件中Timestamp和TimestampExtended拼出来的是dts。也就是解码时间。
    Timestamp和TimestampExtended拼出来dts单位为ms。(如果不存在B帧,当然dts等于pts)
  2. CompositionTime 表示PTS相对于DTS的偏移值, 在每个视频tag的第14~16字节 。
    显示时间(pts) = 解码时间(tag的第5~8字节) + CompositionTime
    CompositionTime的单位也是ms
    Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂件中通常只有⼀个元数据,⾳频tag和视频tag就是⾳视频信息了,采样、声道、频率,编码等
    信息

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

该类型Tag⼜被称为MetaData Tag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、height等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。该类型TagDaTa的结构如下所示(source.200kbps.768x320.flv⽂件为例):
在这里插入图片描述
第⼀个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类型值,表示数组元素的个数。后⾯即为各数组元素的封装,数组元素为元素名称和值组成的对。常⻅的数组元素如下表所示。
在这里插入图片描述
注:Lavf54.63.104即是 Libavformat version 54.63.104. 即是ffmpeg对于库的版本
在这里插入图片描述
在这里插入图片描述

Audio Tag Data结构(⾳频类型)

⾳频Tag Data区域开始的:

  • 第⼀个字节包含了⾳频数据的参数信息,
  • 第⼆个字节开始为⾳频流数据。
    (这两个字节属于tag的data部分,不是header部分)
    第⼀个字节为⾳频的信息(仔细看spec发现对于AAC⽽⾔,⽐较有⽤的字段是SoundFormat),格式如下:
    在这里插入图片描述
    第⼆个字节开始为⾳频数据(需要判断该数据是真正的⾳频数据,还是⾳频config信息)。
    在这里插入图片描述
    AAC AUDIO DATA
    在这里插入图片描述
    The AudioSpecificConfig is explained in ISO 14496-3. AAC sequence header存放的是
    AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。
    如果是AAC数据,如果他是AAC RAW, tag data[3] 开始才是真正的AAC frame data。
    在这里插入图片描述

Video Tag Data结构(视频类型)

视频Tag Data开始的:
第⼀个字节包含视频数据的参数信息,
第⼆个字节开始为视频流数据。

第⼀个字节包含视频信息,格式如下:
在这里插入图片描述

第⼆个字节开始为视频数据
在这里插入图片描述

AVCVIDEOPACKET在这里插入图片描述
(1)CompositionTime 单位毫秒
CompositionTime 每个视频tag(整个tag)的第14~16字节(如果是tag data偏移[3]~[5],[0],[1][2:AVCPackettype] )(表示PTS相对于DTS的偏移值 )。CompositionTime 单位为ms : 显示时间 = 解码时间(tag的第58字节,位置索引[4][7])

  • CompositionTime
    (2)AVCDecoderConfigurationRecord
    AVC sequence header就是AVCDecoderConfigurationRecord结构,该结构在标准⽂档“ISO-14496-15 AVC file format
    在这里插入图片描述

FLV时间戳计算

题记:时间戳将每⼀秒分成90000份,即将每⼀毫秒分成90份 在flv中直接存储的都是毫秒级 在TS存储
的是时间戳级
其中TS、flv⼀般按照编码顺序排列
⼀个视频tag⼀般只包含⼀帧视频的码流
其中视频tag的时间戳对应的是解码时间戳(DTS/90)
当前序列:
编码顺序 I P P B B B…
对应帧号 0 1 5 3 2 4…
flv对每⼀个tag都规定了它将要播放的时间戳
每个时间戳都可以对应转换特性的时间
其中script(脚本)、video(视频)、audio(⾳频)的第⼀个tag的时间戳值都为0
时间戳占4个字节 其中第四个字节是⾼位 前三个字节是低位(每个tag的5~8字节)

如6E 8D A8 01 = 0x 01 6E 8D A8 = 24022440

CompositionTime 每个视频tag的第14~16字节(表示PTS相对于DTS的偏移值 )
CompositionTime 单位为ms 显示时间 = 解码时间(tag的第5~8字节) + CompositionTime
例如(注意显示时间最后⼀个字节是⾼位)
tag0 (脚本) :时间戳为0
tag1 (视频) :第⼀个视频时间戳 值为0 ⽆CompositionTime (头信息)
tag2 (⾳频) :第⼀个⾳频时间戳 值为0
tag3 (视频) :00 00 00 00 值:0 00:00:00:00 (解码时间) CompositionTime:0x 00 00 50
值:80 00:00:00:80 I帧 显示时间: 00:00:00: 80 poc=0
tag4 (视频) :00 00 28 00 值:40 00:00:00:40 (解码时间) CompositionTime:0x 00 00 50
值:80 00:00:00:80 P帧 显示时间: 00:00:00: 120 poc=1
tag5 (视频) :00 00 50 00 值:80 00:00:00:80 (显示时间) CompositionTime:0x 00 00 C8
值:200 00:00:00:200 P帧 显示时间: 00:00:00: 280 poc=5
14
tag6 (⾳频) :00 00 50 00 值:80 00:00:00:80(显示时间)
tag7 (⾳频) :00 00 67 00 值:103 00:00:00:103(显示时间)
tag8 (视频) :00 00 78 00 值:120 00:00:00:120 (解码时间) CompositionTime:0x 00 00 50
值:80 00:00:00:80 B帧 显示时间: 00:00:00: 200 poc=3
tag9 (⾳频) :00 00 7E 00 值:126 00:00:00:126(显示时间)
tag10 (⾳频) :00 00 96 00 值:150 00:00:00:150(显示时间)
tag11 (视频) :00 00 A0 00 值:160 00:00:00:160(解码时间) CompositionTime:0x 00 00 00
值:00 00:00:00:00 b帧 显示时间: 00:00:00: 160 poc=2
tag12 (⾳频) :00 00 AD 00 值:173 00:00:00:173(显示时间)
tag13 (⾳频) :00 00 C4 00 值:196 00:00:00:196(显示时间)
tag14(视频) :00 00 C8 00 值:200 00:00:00:200(解码时间) CompositionTime:0x 00 00 28
值:40 00:00:00:40 b帧 显示时间: 00:00:00: 240 poc=4我们可以看到 每个视频tag相差约
40ms 刚好是25fps视频 每帧视频的播放时⻓
在上例中,我们会看到按照解码时间排列
编码顺序 I P P B B B…
对应帧号 0 1 5 3 2 4…

  • 20
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx-1.19.3-http-flv是一种基于Nginx服务器的HTTP-FLV流媒体协议模块。HTTP-FLV指的是基于HTTP协议传输的FLV格式视频流。下面是对nginx-1.19.3-http-flv的简要说明: Nginx是一个轻量级的高性能Web服务器,常用于反向代理、负载均衡和HTTP缓存等。而nginx-1.19.3-http-flv是基于Nginx的一个开源模块,用于支持HTTP-FLV流媒体协议。 HTTP-FLV是一种用于在Web上通过HTTP协议传输的流媒体协议。它的特点是可以通过HTTP协议直接发送FLV格式音视频数据流到客户端,而无需使用RTMP等专有协议。这使得HTTP-FLV在Web端播放视频时非常方便,并且能够兼容现有的HTTP基础设施,如CDN、防火墙等。 Nginx的http-flv模块允许将FLV格式音视频文件转为HTTP-FLV流,通过HTTP协议传输到客户端。它可以作为一个流媒体服务器,接收FLV数据流的输入,并通过HTTP-FLV的方式将数据流分发给客户端。 Nginx提供了高性能的数据传输和处理能力,能够有效地处理大量的并发请求。通过使用nginx-1.19.3-http-flv模块,可以方便地搭建一个高性能的HTTP-FLV流媒体服务器,实现优质的视频传输和播放体验。 使用nginx-1.19.3-http-flv模块,可以在Web端实现基于FLV格式的实时音视频传输和播放。这对于直播、互动视频和在线教育等领域非常有用。同时,nginx-1.19.3-http-flv也可以与其他模块(如HLS模块、RTMP模块)配合使用,实现更丰富的流媒体服务。总之,nginx-1.19.3-http-flv提供了一种高效、稳定和灵活的流媒体解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值