音视频八股文(9)-- flv的h264六层结构和aac六层结构

这篇具有很好参考价值的文章主要介绍了音视频八股文(9)-- flv的h264六层结构和aac六层结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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⽂件结构如下图:

音视频八股文(9)-- flv的h264六层结构和aac六层结构

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

音视频八股文(9)-- flv的h264六层结构和aac六层结构

⼤体的解析框架

音视频八股文(9)-- flv的h264六层结构和aac六层结构

FLV header

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

FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流。⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个独⽴的⾳视频流在⼀个⽂件的情况。

00000 1 0 1

FLV头的结构如下:

音视频八股文(9)-- flv的h264六层结构和aac六层结构

FLV Body

音视频八股文(9)-- flv的h264六层结构和aac六层结构

FLV Tag

每⼀个Tag也是由两部分组成:tag header和tag data。Tag Header⾥存放的是当前tag的类型、数据区(tag data)的⻓度等信息。

tag header⼀般占11个字节的内存空间。FLV tag结构如下:

音视频八股文(9)-- flv的h264六层结构和aac六层结构

注意:

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⼜被称为MetaDataTag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、height等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。该类型TagDaTa的结构如下所示(source.200kbps.768x320.flv⽂件为例):

音视频八股文(9)-- flv的h264六层结构和aac六层结构

第⼀个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类型值,表示数组元素的个数。后⾯即为各数组元素的封装,数组元素为元素名称和值组成的对。常⻅的数组元素如下表所示。

音视频八股文(9)-- flv的h264六层结构和aac六层结构

注:Lavf54.63.104即是 Libavformat version 54.63.104. 即是ffmpeg对于库的版本

音视频八股文(9)-- flv的h264六层结构和aac六层结构

Audio Tag Data结构(⾳频类型)

⾳频Tag Data区域开始的:

第⼀个字节包含了⾳频数据的参数信息,

第⼆个字节开始为⾳频流数据。

(这两个字节属于tag的data部分,不是header部分)

第⼀个字节为⾳频的信息(仔细看spec发现对于AAC⽽⾔,⽐较有⽤的字段是SoundFormat),格式如下:

音视频八股文(9)-- flv的h264六层结构和aac六层结构

If the SoundFormat indicates AAC, the SoundType should be set to 1 (stereo) and the
SoundRate should be set to 3 (44 kHz). However, this does not mean that AAC audio in FLV
is always stereo, 44 kHz data. Instead, the Flash Player ignores these values and extracts the
channel and sample rate data is encoded in the AAC bitstream.

音视频八股文(9)-- flv的h264六层结构和aac六层结构

第⼆个字节开始为⾳频数据(需要判断该数据是真正的⾳频数据,还是⾳频config信息)。

音视频八股文(9)-- flv的h264六层结构和aac六层结构

AAC AUDIO DATA

音视频八股文(9)-- flv的h264六层结构和aac六层结构

The AudioSpecificConfig is explained in ISO 14496-3. AAC sequence header存放的是
AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。

《完整版ISO-14496-3(2009-09).pdf 》

如果是AAC数据,如果他是AAC RAW, tag data[3] 开始才是真正的AAC frame data。

音视频八股文(9)-- flv的h264六层结构和aac六层结构

Video Tag Data结构(视频类型)

视频Tag Data开始的:

第⼀个字节包含视频数据的参数信息,

第⼆个字节开始为视频流数据。

第⼀个字节包含视频信息,格式如下:

音视频八股文(9)-- flv的h264六层结构和aac六层结构

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

音视频八股文(9)-- flv的h264六层结构和aac六层结构

AVCVIDEOPACKET

音视频八股文(9)-- flv的h264六层结构和aac六层结构

(1)CompositionTime 单位毫秒

CompositionTime 每个视频tag(整个tag)的第14 ~ 16字节(如果是tag data偏移[2] ~ [4])(表示PTS相对于DTS的偏移值 )。

CompositionTime 单位为ms : 显示时间 = 解码时间(tag的第5 ~ 8字节,位置索引[4] ~ [7])+ CompositionTime

(2)AVCDecoderConfigurationRecord

AVC sequence header就是AVCDecoderConfigurationRecord结构

音视频八股文(9)-- flv的h264六层结构和aac六层结构

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
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…

tag data

Tag Data : Audio Data

1-1:音频头【AudioTagHeader】

–1-4bit,音频格式【SoundFormat】

----0 = Linear PCM, platform endian

----1 = ADPCM

----2 = MP3

----3 = Linear PCM, little endian

----4 = Nellymoser 16 kHz mono

----5 = Nellymoser 8 kHz mono

----6 = Nellymoser

----7 = G.711 A-law logarithmic PCM , reserved

----8 = G.711 mu-law logarithmic PCM , reserved

----9 = reserved

----10 = AAC (supported in Flash Player 9,0,115,0 and higher)

----11 = Speex (supported in Flash Player 10 and higher)

----14 = MP3 8 kHz , reserved

----15 = Device-specific sound , reserved

–5-6bit,采样率【SoundRate】

----0 = 5.5kHz

----1 = 11kHz

----2 = 22kHz

----3 = 44kHz

–7-7bit,位宽,0 = 8bit samples, 1= 16bit samples【SoundSize】

----8-8bit,通道,0 = Mono, 1 = Stereo【SoundType】

[2-2]:AAC音频类型,注,只有在 SoundFormat=AAC 时,才有此数据

–0 = AAC sequence header

–1 = AAC raw

x-x:音频数据

注:SoundFormat

如果 SoundFormat=10 即AAC格式,官方建议使用44.1kHz采样率和双声道,即SoundType=1,SoundRate=3;Flash Player会忽略这两个参数,并从音频比特流中解析获得。

如果 SoundFormat=11 即Speex格式,音频使用压缩的16kHz采样率的单声道,各参数取值为SoundRate=0,SoundSize=1,SoundType=0。

Tag Data : Video Data

1-1:视频头【VideoTagHeader】

–1-4bit,帧类型【FrameType】

----1 = key frame (for AVC, a seekable frame)

----2 = inter frame (for AVC, a non-seekable frame)

----3 = disposable inter frame (H.263 only)

----4 = generated key frame (reserved for server use only)

----5 = video info/command frame

–5-8bit,编码类型【CodecID】

----2 = Sorenson H.263

----3 = Screen video

----4 = On2 VP6

----5 = On2 VP6 with alpha channel

----6 = Screen video version 2

----7 = AVC(H.264)

[2-5]:H.264视频类型,注,只有在 CodecID=AVC 时,才有此数据
AVCPacketType
CompositionTime (ISO 14496-12, 8.15.3)

x-x:视频数据

Tag Data : Script Data

1-1:格式类型【Type】

–0 = Number【DOUBLE】

–1 = Boolean【UI8】

–2 = String【SCRIPTDATASTRING】

–3 = Object【SCRIPTDATAOBJECT】

–4 = MovieClip (reserved, not supported)

–5 = Null

–6 = Undefined

–7 = Reference【UI16】

–8 = ECMA array【SCRIPTDATAECMAARRAY】

–9 = Object end marker

–10 = Strict array【SCRIPTDATASTRICTARRAY】

–11 = Date【SCRIPTDATADATE】

–12 = Long string【SCRIPTDATALONGSTRING】

x-x:

flv视频层次结构,h264视频数据作为参考。

第一层:flv:⼀个⽂件头(file header)和 ⽂件体(file Body)。

第二层:flv body:多个(Previous Tag Size字段 + tag)。

第三层:tag(video):tag header+tag data。

第四层:tag data:1字节的参数信息+AVC VIDEO PACKET。—— 注,只有在 CodecID=AVC 时,才有第五层,否则没有第五层。

第五层:AVC VIDEO PACKET:4字节的视频类型+视频数据。

第六层:视频数据。

flv音频层次结构,aac数据作为参考。

第一层:flv:⼀个⽂件头(file header)和 ⽂件体(file Body)。

第二层:flv body:多个(Previous Tag Size字段 + tag)。

第三层:tag(audio):tag header+tag data。

第四层:tag data:1字节的参数信息+AAC AUDIO PACKET。—— 注,只有在 SoundFormat=AAC 时,才有第五层,否则没有第五层。

第五层:AAC AUDIO PACKET:1字节的音频类型+音频数据。

第六层:音频数据。文章来源地址https://www.toymoban.com/news/detail-429870.html

到了这里,关于音视频八股文(9)-- flv的h264六层结构和aac六层结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频八股文(6)-- ffmpeg大体介绍和内存模型

    • 容器/文件(Conainer/File):即特定格式的多媒体文件, 比如mp4、flv、mkv等。 • 媒体流(Stream):表示时间轴上的一段连续数据,如一 段声音数据、一段视频数据或一段字幕数据,可以是压缩 的,也可以是非压缩的,压缩的数据需要关联特定的编解 码器(有些码流音频

    2023年04月27日
    浏览(48)
  • 音视频八股文(7)-- 音频aac adts三层结构

    AAC(Advanced Audio Coding)是一种现代的音频编码技术,用于数字音频的传输和存储领域。AAC是MPEG-2和MPEG-4标准中的一部分,可提供更高质量的音频数据,并且相比于MP3等旧有音频格式,AAC需要更少的比特率。 AAC通过使用一些高级的音频编码算法来实现更好的声音质量和更低的压

    2024年02月06日
    浏览(58)
  • 什么叫面试八股文,一篇文章带你入门音视频(1),使用指南

    版税方式:按个收取 备注:WMA的全称是Windows Media Audio,它是微软公司推出的与MP3格式齐名的一种新的音频格式。由于WMA在压缩比和音质方面都超过了MP3,更是远胜于RA(Real Audio),即使在较低的采样频率下也能产生较好的音质,再加上WMA有微软的Windows Media Player做其强大的后盾

    2024年04月25日
    浏览(64)
  • 音视频八股文(11)-- ffmpeg avio 内存输入和内存输出。内存输出有完整代码,网上很少有的。

    avio是FFmpeg中的一个模块,用于实现多种输入输出方式的封装。 avio提供了一系列API,可以将数据从内存读取到缓冲区中,也可以将缓冲区中的数据写入到内存中。其实现依赖于IOContext结构体,该结构体定义了当前输入/输出事件的状态、数据、回调函数等信息,并支持通过自定

    2024年02月03日
    浏览(49)
  • 音视频——视频流H264编码格式

    我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用 宏快 来发送数据是 杂乱无章 的,就好像在没有 集装箱 出现之前,货物总是随意被堆放到船上。 上货(编码),下货是非

    2024年02月15日
    浏览(60)
  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(87)
  • RK3568平台开发系列讲解(音视频篇)H264 的编码结构

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢视频编码的码流结构其实就是指视频经过编码之后得到的二进制数据是怎么组织的,换句话说,就是编码后的码流我们怎么将一帧帧编码后的图像数据分离出来,以及在二进制码流数据中,哪一块数

    2024年02月09日
    浏览(68)
  • 【音视频处理】转编码H264 to H265,FFmpeg,代码分享讲解

    大家好,欢迎来到停止重构的频道。 本期我们讨论音视频文件 转编码 ,如将视频H264转H265等。 内容中所提及的 代码都会放在GitHub ,感兴趣的小伙伴可以到GitHub下载。 我们按这样的顺序展开讨论:​ 1、  编码的作用  2、  转编码的工作原理 3、  编解码器安装  4、  示

    2024年02月11日
    浏览(53)
  • 音视频知识:MPEG-4、H264、MP4、AAC之间的关系

    MPEG-4 一种编码标准。是国际标准化组织 (ISO) 主要针对消费类应用,已经针对运动图像压缩定义的标准。MPEG(Moving Picture Experts Group)标准包括 MPEG1、MPEG2与 MPEG4。 MPEG-4标准目前分为27个部分,统称为ISO/IEC14496国际标准。其中第10部分(ISO/IEC 14496-10)就是熟悉的高级视频编码

    2024年02月14日
    浏览(68)
  • Linux Qt5.15.2 编译QWebEngine源码支持音视频H264

    默认自带的QWebEngine 因版权问题不支持音视频功能,需要自己编译源码以支持。 平台:Linux(UOS V20 1050) Qt:5.15.2 下载 Qt 5.15.2 对应版本源码,使用镜像网站或者Qt Maintenance Tool工具下载。 配置 Qt 环境变量 将以下内容追加到bashrc文件后 刷新使其生效 这个阶段可以预先安装所

    2024年02月05日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包