最近自己动手将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个字节表示元素值的类型;后面跟着是对应值,占用的字节数取决于值的类型。

以下的(tag->key,tag->value)不一定在所有flv文件中出现,依据不同版本有所不同。

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文件格式,以结束本文档。

FLV文件(H264 + AAC)格式超详细分析相关推荐

  1. 交流信号采集电路设计(超详细分析)

    交流信号采集电路设计(超详细分析) 背景:我当时也有疑问,单片机ADC不是只能采集直流信号么,那么有哪些办法可以转换后给单片机.现在弄懂了些皮毛,和大家分享. 一.交流变压取样 对于AC220V,首先 ...

  2. flv封装H264+AAC[附完整代码]

    一. 概述 总体来说比较简单这里就不详述了,参考官方文档即可<Video File Format Specification Version 10>,其中aac和h264的sequence ...

  3. 人肉解析系列(一)————FLV-java你所关心的,我这里都有。附源码。非FFmpeg相关,纯java人肉解析。手写FLV。H264 AAC转FLV

    第一次写博客,不知道有没有什么潜规则.总之呢,是好是坏都已经在落笔的那一刻开始了. 说起直播,各位都不陌生,毕竟国内这几年直播,短视频等视频行业大火,让所有程序员对直播都能如数家珍,随口便能讲出几种协 ...

  4. Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程(内涵完整文件和代码) 相关链接:: 超详细--CNN卷积神经网络教程(零基础到实战) 大白话pytorch基本知识点及语法+项目实战 文章目录 基 ...

  5. 熊猫烧香_汇编级_超详细分析

    1.样本概况1.1 应用程序信息1.2 分析环境及工具1.3 分析目标2.具体分析过程2.1 主函数2.2 分析sub_40819c 2.2.2 存在Desktop_.ini文件则删除2.2.3 读取 ...

  6. jprofiler分析dump文件_内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)...

    点击上方 "Java指南者"关注, 星标或置顶一起成长 免费送 1024GB 精品学习资源 来源:https://zhanghan.blog.csdn.net/article/de ...

  7. 超详细分析Windows变慢原因及解决方法

    谁都希望计算机一开机就可以立即进入Windows 系统而不用等待,或者是系统在使用的时候不会越来越慢,但由于种种原因常常使这些愿望不能实现,甚至一开机就死机或者用着用着就越来越慢的情况也经常发生.其实 ...

  8. linux_NandFlash_driver_超详细分析 .

    分类: Linux 驱动 Nand 驱动 2011-11-06 23:16 474人阅读 评论(0) 收藏 举报 今天学习了NandFlash的驱动,硬件操作非常简单,就是这个linux下的驱动比较复 ...

  9. 转载 骏马金龙第9章 Linux进程和信号超详细分析

    本文原创地址:骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7058920.html 9.1 进程简单说明 进程是一个非常复杂的概念,涉及的内容也非常非常多.在这 ...

最新文章

  1. Python-4 两个变量相互交换
  2. 对如何使用WaveDrom画波形图的研究(案例分解分析)
  3. 自己做的几个小软件(数学工具和游戏),用C/C#制作,用到许多相关的C#技术细节,可以免费提供下载,感兴趣的,来看一下...
  4. AC日记——Periodic RMQ Problem codeforces 803G
  5. linux目录规范及简单说明
  6. Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记...
  7. LeetCode 378. 有序矩阵中第K小的元素(二分查找)
  8. 腾跃计算机二级vfp培训,计算机二级:在VFP中实现进度条
  9. 2020年,我们该如何学习WEB 前端开发
  10. HT for Web 中Painter的介绍及用法
  11. 凸优化第五章对偶 作业题
  12. Atitit 命令指令的分类与权限 IMAP协议为例子 目录 1. 指令的作用的权限吧。 全局命令 未认证状态命令 未认证状态命令 选中状态指令 2 1.1. 1.在任何状态下都有效的指令(全局命
  13. 如何安装树莓派摄像头模块
  14. size-constrained-clustering
  15. 干部身份、三方协议、派遣证(转)
  16. vhg电路是什么意思_over是什么意思?
  17. ps动作保存不覆盖原文件_Photoshop从入门到精通:图像的基本操作,新建打开保存关闭文件...
  18. 2022年CPU天梯图(7月更新)
  19. EtherNet IP /Modbus 网关ENB-302MI
  20. 高数 | chx和shx分别是什么

热门文章

  1. 写论文CAJ如何提取文字?
  2. DCC:Deep continuous clustering
  3. java web 实践项目(搭建web留言系统)
  4. mmsegmentation教程2:如何修改loss函数、指定训练策略、修改评价指标、指定iterators进行val指标输出
  5. ps怎么抠图?教你怎么用钢笔工具抠图
  6. 【信号与系统】Multisim 仿真连续时间系统的时域分析
  7. 手机OTG 我的世界_怎么用手机把小说下载到mp3
  8. “第四产业”升级,中软国际“蝶变”
  9. 编程语言:C语言网络资源
  10. 《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a(a\le 10^9)a(a≤10 9 ) 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除2向下取整)第几天变为1