=================================================================
音视频入门基础:FLV专题系列文章:
音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件
音视频入门基础:FLV专题(3)——FLV header简介
音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现
音视频入门基础:FLV专题(6)——FFmpeg源码中,解码FLV header的实现
音视频入门基础:FLV专题(7)——Tag header简介
音视频入门基础:FLV专题(8)——FFmpeg源码中,解码Tag header的实现
音视频入门基础:FLV专题(9)——Script Tag简介
音视频入门基础:FLV专题(10)——Script Tag实例分析
音视频入门基础:FLV专题(11)——FFmpeg源码中,解析SCRIPTDATASTRING类型的ScriptDataValue的实现
音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现
音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现
音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现
音视频入门基础:FLV专题(15)——Video Tag简介
音视频入门基础:FLV专题(16)——FFmpeg源码中,解码Video Tag的VideoTagHeader的实现
音视频入门基础:FLV专题(17)——FFmpeg源码中,提取Video Tag的VIDEODATA的实现
音视频入门基础:FLV专题(18)——Audio Tag简介
音视频入门基础:FLV专题(19)——FFmpeg源码中,解码Audio Tag的AudioTagHeader,并提取AUDIODATA的实现
音视频入门基础:FLV专题(20)——FFmpeg源码中,获取FLV文件major_brand、minor_version、compatible_brands、encoder、Duration的实现
音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)
音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)
音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)
音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现
音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
=================================================================
一、引言
根据《video_file_format_spec_v10_1.pdf》第75页,如果某个Tag的Tag header中的TagType值为8,表示该Tag为Audio Tag:
这时StreamID之后紧接着的就是AudioTagHeader,也就是说这时Tag header之后的就是AudioTagHeader:
然后这时如果Filter的值不为1,表示未加密,不需要预处理。则AudioTagHeader之后紧接着的就AUDIODATA:
所以,
1.当某个Tag的Tag header中的TagType属性的值为8时,该Tag为Audio Tag;
2.未加密的情况下,一个Audio Tag = Tag header + AudioTagHeader + AUDIODATA。
二、AudioTagHeader
根据《video_file_format_spec_v10_1.pdf》第76页,AudioTagHeader包含的属性如下:
其中:
SoundFormat:占4位(8位等于1个字节),音频的压缩编码格式。
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
8:G.711 mu-law logarithmic PCM
9:reserved
10:AAC
11:Speex
14:MP3 8 kHz
15:Device-specific sound
SoundRate:占2位,音频采样频率。
0:5.5 kHz
1:11 kHz
2:22 kHz
3:44 kHz
SoundSize:占1位,即Bit depth(又叫位深度、位元深度、采样深度、采样位数、采样格式)。
0:8位
1:16位
该属性仅适用于未压缩的格式,Bit depth对于PCM编码是固定的,但对于有损压缩编解码器(如MP3和AAC),它是在编码期间计算的,并且可以因采样而异,具体可以参考:《音视频入门基础:AAC专题(3)——AAC的ADTS格式简介》。
SoundType:占1位,音频声道数目。
0:单声道
1:立体声
AACPacketType:占1字节,AAC数据包的类型。仅当FLV文件中的音频为AAC格式时,才有该属性。
值为0表示该AudioTag包含AAC sequence header,即包含audioObjectType属性为AAC格式时的AudioSpecificConfig;
值为1表示该AudioTag包含一帧AAC音频压缩数据。
所以当FLV文件中的音频不为AAC格式时,AudioTagHeader总共占1字节(SoundFormat + SoundRate + SoundSize + SoundType总共1字节);当FLV文件中的音频为AAC格式时,AudioTagHeader总共占2字节(SoundFormat + SoundRate + SoundSize + SoundType + AACPacketType总共2字节)。
从上面的介绍可以看到,AudioTagHeader指定了音频的压缩编码格式、音频采样频率、采样位数、音频声道数目等格式。
但是《video_file_format_spec_v10_1.pdf》第77页写道:“如果音频压缩编码格式为AAC,则SoundType属性的值应为1(立体声),SoundRate属性的值应为3 (44khz)。
然而,这并不意味着AAC音频在FLV中总是立体声,44khz。相反,Flash播放器会忽略这些值并在AAC比特流中提取信道和采样率数据编码。”
也就是会说,播放器在处理 AAC 音频时,需要忽略 AudioTagHeader 中的音频参数,而使用 AudioSpecificConfig的参数来初始化解码器:
三、AUDIODATA
根据《video_file_format_spec_v10_1.pdf》第77页,FLV文件未加密时,AUDIODATA为AudioTagBody:
四、AudioTagBody
根据《video_file_format_spec_v10_1.pdf》第77页,当FLV文件的音频压缩编码格式为AAC时,AudioTagBody为AACAUDIODATA:
五、AACAUDIODATA
根据《video_file_format_spec_v10_1.pdf》第77页,当AACPacketType值为0时,AACAUDIODATA为AudioSpecificConfig;当AACPacketType值为1时,AACAUDIODATA包含一帧AAC音频压缩数据:
六、AudioSpecificConfig
MPEG-4包括一个以统一方式处理不同音频格式组的系统。每种格式都用一个唯一的音频对象类型(Audio Object Type, 简称AOT)来表示。所有Audio Object Type共享的通用格式全局header称为音频特定配置(Audio Specific Config)。简单来讲Audio Specific Config是MPEG-4音频的全局header,该header包含了音频编码器的重要信息,比如编码器类别,音频频率,音频通道数等。具体可以参考:《音视频入门基础:AAC专题(11)——AudioSpecificConfig简介》。