FLV文件(H264 AAC)格式超详细分析

最近自己动手将H264视频流和AAC音频流合成flv文件,但是没有采用开源的ffmpeg的api来处理音视频流。方法就是模仿ffmpeg中libavformat/flvenc.c 文件写代码来完成音视频的flv格式封装。在这个封装过程中,需要非常清楚flv文件格式。网上有关flv文件格式的资料非常多,不过大部分资料是互相转载或者缺乏足够详细的信息(例如:AVDecoderConfigurationRecord和 AudioSpecificConfig的生成)。
因此我就以ffmpeg中libavformat/flvenc.c为基础分析flv文件的构成,详细分析flv文件中每个字节的含义。以下每个方格代表一个字节。其中的数字都是16进制表示(省略0x),格中的字符也可以用相应的16进制数字替代,用字符表示有时候更为直观。假定flv文件同时含有视频和音频。

接下来就是Metadata的具体数据,由两个AMF包组成。

Metadata元素个数暂定为12个 = 音频5个 视频5个 2个(duration和filesize)。 后面还可能会加入其它元素,因此会返回来修改此值。metadata元素的顺序不固定,此处采用ffmpeg中的顺序。
第二个AMF包中各数组元素封装形式为:前两个字节是元素名称的长度;后面跟着长度为L的字符串;第L 3个字节表示元素值的类型;后面跟着是对应值,占用的字节数取决于值的类型。

Remark:以上将flv官方文档的metadata信息写入了Script Tag中。但是在做flv文件合成的时候,发现网上有的flv文件将keyframes信息隐藏在Script Tag中。后来通过网络查一些资料,发现keyframes几乎是一个非官方的标准,也就是民间标准。
两个常用的操作metadata的工具是flvtool2和FLVMDI, 都是把keyframes作为一个默认的元信息项目。在FLVMDI的主页(http://www.buraks.com/flvmdi/)上有描述:
keyframes: (Object) This object is added only if you specify the /k switch. ‘keyframes’ is known to FLVMDI and if /k switch is not specified, ‘keyframes’ object will be deleted.
‘keyframes’ object has 2 arrays: ‘filepositions’ and ‘times’. Both arrays have the same number of elements, which is equal to the number of key frames in the FLV. Values in times array are in ‘seconds’. Each correspond to the timestamp of the n’th key frame. Values in filepositions array are in ‘bytes’. Each correspond to the fileposition of the nth key frame video tag (which starts with byte tag type 9).
也就是说keyframes中包含着2个内容 ‘filepositions’ and 'times’分别指的是关键帧的文件位置和关键帧的PTS。通过keyframes可以建立起自己的Index,然后再seek和快进快退的操作中,快速有效的跳转到你想要找的关键帧位置进行处理。

到此为止已经介绍完flv文件格式,flv格式还是比较简单的,header部分很简洁,body部分都是由一个个tag组成,tag的话也就三种,脚本tag一般只有一个。最后用一个简单的图来概括flv文件格式,以结束本文档。

来源:https://www.icode9.com/content-4-782201.html

(0)

相关推荐

  • DASH简介及使用方法(FFmpeg, MP4Box)

    引入XXXX后,(对照竞品)网页端的视频观看体验存在以下问题: 1. 切换画质(1080P/高清/标清)时,播放器会黑屏,并回退到关键帧重新播放. 2. 不能根据网络状况自适应调整码率(YouTube ...

  • ffmpeg 之 dash

    ffmpeg 之 dash

  • Node-Media-Server开源流行Nodejs流媒体服务器

    简介 Node-Media-Server一个 Node.js 实现的RTMP/HTTP/WebSocket/HLS/DASH流媒体服务器. 开源github地址: https://github.com ...

  • 手把手搭建RTSP流媒体服务器

    0.引言 本文主要讲解如何搭建RTSP流媒体服务器的过程,使用开源项目ZLMediaKit.通过这个开源项目,推RTSP流到服务器,然后拉流端可以拉取RTSP.RTMP等流. ZLMediaKit码云 ...

  • 《FFmpeg Basics》中文版-14-元数据和字幕

    写在前面如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑也可以关注我的简书账户:张芳涛,我后期会发布更多的音视频以及图像处理方面的文章.正文媒体文件中的元数据包含艺术家,作者,日期,流派,发布者 ...

  • 使用ffmpeg根据开始和结束时间剪切视频

    本文翻译自:Cutting the videos based on start and end time using ffmpeg I tried to cut the video using the ...

  • 干货 | 六类合规条款超详细分析

    导读:合规管理被认为是与业务管理.财务管理并驾齐驱的企业管理三大支柱之一.合规管理是企业稳健经营运行的内在要求,也是防范违规风险的基本前提.本文将对六类合规条款进行分析,让企业家能够加强合规管理,提升 ...

  • 超详细分析Bootloader到内核的启动流程(万字长文)

    https://m.toutiao.com/is/Jq5Jr8C/ @[TOC] Bootloader启动流程分析   Bootloader的启动过程可以分为单阶段.多阶段两种.通常多阶段的 Boot ...

  • 心理学考研 | 实验心理学大题超详细分析报告(文末福利)

    编者按:以下内容是咱们萧宵老师的实验大题分析报告,萧老师将大题类型.难度,需重点掌握的内容进行了总结,大家一定要认真看哦~ 实验设计题目的分值高.难度大.出题灵活,着重考察实验设计的思维逻辑能力.实际 ...

  • 你给格力海岸打几分?超详细分析来了

    格力海岸一直都是珠海高新区超热门的项目,目前6期一手在售,但单价已经去到三万六到四万,令不少朋友都迟迟不敢下手,而小编今天想为大家介绍的是格力海岸一二期的二手,一二期早在2015-16年竣工,楼龄较新 ...

  • 文献综述撰写超详细教程及案例分析

    第一部分   什么是综述? 文献综述是在对文献进行阅读.选择.比较.分类.分析和综合的基础上,研究者用自己的语言对某一问题的研究状况进行综合叙述的情报研究成果.文献的搜集.整理.分析都为文献综述的撰写 ...

  • 超详细——地震相的定义、识别标志与分析方法

    识别最下方二维码,回复"地震相",获取本文word文档. 1.定义 不同沉积体系的各级界面.岩性及几何特征在地震剖面上的综合表现. 地震相分析就是识别每个层序内独特的地震反射波组特 ...

  • 录音、偷拍证据是否具有法律效力?从案例分析到司法解释,超详细!

    法务之家出品 小编:很多朋友在法务之家公众号内询问"录音""偷拍"取证的证据是否具有法律效力?这样的行为是否违法?为此小编今天特推送一期有关"录音&q ...

  • 初中地理|超详细的经纬线判读和分析方法,附例题解析!

    关于经纬度问题,一直以来是都是同学们学习的难点,做起来感觉最头疼. 而它又是初中地理的第一章,容易使学生对地理学习产生畏难情绪,以致放弃对整个地理科目的进一步学习. 为了帮同学们拿下这个难关,颜老师这 ...

  • Mac使用磁盘工具创建(dmg)映像文件超详细步骤

    .dmg 是苹果的磁盘映像格式文件.它是一种容器格式,类似于一种「压缩包」.也可以理解成一个「虚拟磁盘」.有时候我们在网页下载的 Mac 软件会下载到这种 .dmg 格式文件.我们也可以利用「磁盘工具 ...