flv封装ffmpeg编码的视音频笔记(二)
来源:互联网 发布:美联储的幕后老板知乎 编辑:程序博客网 时间:2024/06/10 17:33
flv封装ffmpeg编码的视音频笔记(一)不仅分析FLV文件结构及各结构的具体内容,对视频封装也做了具体说明。在上文的基础上,本文将添加音频封装的相关内容。封装音频之前,注意将FLV文件头中的类型标志位设为5,以保证FLV文件中存在音频。
一、音频配置Tag信息
紧接着视频配置Tag的是音频配置Tag,也就是第一个AudioTag,它的标签头数据结构按照上文介绍的填值即可,需要将标签类型的值设为8,表示该Tag是音频相关的。
音频标签数据区的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。
第1个字节的的含义,见表1、表2、表3、表4,数据位从左至右。
表1 前4位表示音频数据的格式
--------------------------
值 含义
--------------------------
0 未压缩
1 ADPCM
2 MP3
5 Nellymoser 8kHz momo
6 Nellymoser
--------------------------
说明:
1.Nellymoser 8kHz 是一个特殊的类型,8kHz采样率在其它格式中不被支持。当音频格式是Nellymoser 8kHz mono的时候,采样精度(见表6)和音频类型(见表7)被忽略了。
2.对于其它的 Nellymoser,采样率,采样精度、音频类型照常。
表2 第5-6位的数值表示采样率
---------------
值 含义
---------------
0 5.5kHz
1 11kHz
2 22kHz
3 44kHz
---------------
表3 第7位表示采样精度
--------------
值 含义
--------------
0 8位
1 16位
--------------
表4 第8位表示音频类型
--------------
值 含义
--------------
0 单声道
1 立体声
--------------
音频配置Tag的数据区结构如表5
表5 音频配置Tag的数据区结构
---------------------------------------
项目 长度(字节) 说明
---------------------------------------
类别 1 值为175,二进制为 10101111表示: 1010(十进制为10)-->AAC 第5-6位 11(十进制为 3)-->44kHz 第7位 1 --> 采样为16位数字 第8位 1 --> 立体声
AAC类型 1 值为0,表示AAC sequence header
音频配置 2 第一个字节为18,第二个字节为16
---------------------------------------
接下来是该Tag的大小。
二、ffmpeg编码得到的AAC数据
AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。他们的结构如下图所示。
每次编码的采样数不超过1024,使用1024个采样编码可得到一包AAC数据。“雷神”的文章说是编码得到的AAC数据有同步字,在实际编码中并没有看到。得到一包AAC数据后,就可以为FLV音频封装做准备了。
三、音频Tag信息
音频Tag的标签头和音频配置Tag的标签头一样,不同的是标签数据区,音频Tag的标签数据区见表6
表6 音频Tag的数据区结构
---------------------------------------
项目 长度(字节) 说明
---------------------------------------
类别 1 值为175,二进制为 10101111表示: 1010(十进制为10)-->AAC 第5-6位 11(十进制为 3)-->44kHz 第7位 1 --> 采样为16位数字 第8位 1 --> 立体声
AAC类型 1 值为1,表示AAC数据
AAC数据 数据实际尺寸
---------------------------------------
填上AAC数据后,别忘了加上音频Tag的大小,依次类推。如此,在上文的基础上可添加能正常播放的FVL音频。
四、音视频同步相关
视频和音频的正常播放,需要确保填入Tag的时间戳是正确的,同时音视频Tag需要“间隔”地加入FLV文件中。一个视频Tag的播放时间大概是41ms,一个音频Tag的播放时间是大概是23ms,所以大部分的FLV文件里一个视频Tag后接二个音频Tag,当然具体需要考虑实际的时间戳。
- flv封装ffmpeg编码的视音频笔记(二)
- flv封装ffmpeg编码的视音频笔记(一)
- FLV学习(二)FLV封装原理
- FLV学习(二)FLV封装原理
- 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)
- 视音频编解码学习工程:FLV封装格式分析器
- 视音频编解码学习工程:FLV封装格式分析器
- 视音频数据处理入门:FLV封装格式解析
- 如何变得更聪明?
- OpenCV中的三种图像数据结构CvMat, IplImage和Mat(二)IplImage
- 苹果电脑mac安装nginx教程
- Android WebView和JavaScript之间的交互
- Redis快速入门
- flv封装ffmpeg编码的视音频笔记(二)
- JDK各个版本的新特性jdk1.5-jdk8
- svn服务器LInux搭建
- 猜字母
- 使用流光法实现物体跟踪
- 包装类的自动装箱,自动拆箱
- ado.net EF CodeOnly/CodeFirst设计模式实例演示
- Android之常用功能代码
- 大衍数列