音视频参数之Profile

前两天发现公司产品 触发 有导入从微信等下载的外部小视频时失败的情况, 触发 导入视频时使用开源库media-for-mobile对视频进行重新编码.media-for-mobile使用android系统接口android.media.MediaExtractor对mp4文件解复用,使用android硬件编解码接口android.media.MediaCodec对视频解码-处理-编码操作,最后通过Android系统APIandroid.media.MediaMuxer将视频写成文件.

反馈的两个有问题视频,一个视频导入时报BufferOverFlowException错误,另一个视频不报错但是导入时进度一直为0%.

经分析出问题的两个视频的Video profile为High,普通视频为Baseline,报BufferOverFlowException错误的视频的Audio profile为HE-AAC,普通视频的Audio profile为LC. 详细了解了一下H264 与AAC profile:

H264各种profile

作为行业标准,H.264编码体系定义了4种不同的Profile(类):Baseline(基线类),Main(主要类), Extended(扩展类)和High Profile(高端类)(它们各自下分成许多个层):

  1. Baseline Profile: 提供I/P帧,仅支持progressive(逐行扫描)和CAVLC;
  2. Extended Profile: 提供I/P/B/SP/SI帧,仅支持progressive(逐行扫描)和CAVLC;
  3. Main Profile: 提供I/P/B帧,支持progressive(逐行扫描)和interlaced(隔行扫描),提供CAVLC或CABAC;
  4. High Profile: (也就是FRExt)在Main Profile基础上新增:8x8 intra prediction(8x8 帧内预测), custom quant(自定义量化), lossless video coding(无损视频编码), 更多的yuv格式(4:4:4…);

H.264在高清中具有最小体积。在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3,相对Xvid、Divx等属于MPEG4编码而言,其体积优势明显,在互联网上,H.264资源处在爆发趋势。而High Profile是H.264解码中的高端类型,拥有最完善的支持程度、最优秀的特性,可以说是高清视频编码中的劳斯莱斯,只有征服了这个优秀的编码,MP4才能将H.264完全掌控,也才能充分享受到高清视频带来的视觉震撼,意义非凡。

针对当前高清是视频会议行业的主流发展趋势,而目前高清普及的主要阻力之一就是带宽的限制。而High Profile H.264技术在同等视频质量的情况下可节省50%的带宽,为客户节省大量的网络带宽成本。据业内专家介绍,此次H.264 High Profile的推出是视频技术的一个巨大进步,其意义不亚于2003年从H.263向H.264过渡的价值。它将为目前正在推广的高清视频通信应用扫清了令人头疼的网络带宽障碍,不仅如此,这些变化对于包括CIF、标清等品质的视频通信应用也同样适用。

鉴于High Profile H.264对于视频会议行业的非凡影响,目前已有国内外厂商尝鲜,宣布其旗下产品全面支持该项技术,包括宝利通、华平、华腾网讯。从这一趋势来看,未来视频会议产品全面支持High Profile H.264也经成为不可逆转的潮流,而高清普及也在技术层面更近了一步。

参考: H264 各种profile

AAC各种profile

AAC历史

如果说目前H.264是视频CODEC的实际霸主,那么AAC就是音频CODEC的女王。主流的音视频格式都是H.264搭配AAC,无论是非实时的媒体文件还是实时的媒体流。 Advanced Audio Coding (AAC) 是一个有损压缩的音频编码集(其实新的编码工具也支持无损)。其设计目标是替代原有MP3编码标准,在与MP3在相似的码率下希望质量优于MP3。这一目标已达到并且由ISO和IEC标准组织标准化在MPEG-2和MPEG-4中。

AAC已被广泛支持并应用到各种设备和系统中 YouTube, iPhone, iPod, iPad, Nintendo DSi, Nintendo 3DS, iTunes,DivX Plus Web Player and PlayStation 3. It is supported on PlayStation Vita,Wii (with the Photo Channel 1.1 update installed), Sony Walkman MP3 series andlater, Android and BlackBerry等等。

  1. 1997年,AAC第一次出现在标准MPEG-2 Part 7,(ISO/IEC 13818-7:1997)。和视频CODEC标准类似,AAC在MPEG-2 Part 7就有三个profiles他们分别是。
    • Low-Complexity profile(AAC-LC / LC-AAC)
    • Main profile (AAC Main)
    • Scalable Sampling Rateprofile (AAC-SSR) 从此可知AAC-LC出现最早,所以AAC-LC的应用最广泛,兼容性最好。
  2. 1999年, AAC从原有标准升级并且合入标准MPEG-4Part 3(ISO/IEC14496-3:1999) 这次升级一个重要变化是引入 Audio Object Types(AOT) 并且把AOT概念合并到profiles中。这时profile也变成4个。
    • Main (which includes most of the MPEG-4 Audio Object Types)
    • Scalable (AAC LC, AAC LTP, CELP, HVXC, TwinVQ, Wavetable Synthesis,TTSI),
    • Speech (CELP, HVXC, TTSI)
    • Low Rate Synthesis (Wavetable Synthesis, TTSI)合成语音。
  3. 2000年,版本更新到2,MPEG-4 AudioVersion 2 (ISO/IEC 14496-3:1999/Amd 1:2000),标准定义了一种新的AOT, 低时延AAC,the low delay AAC(AAC-LD)。
  4. 2001年,标准化High-Efficiency Advanced Audio Coding (HE-AAC) ISO/IEC 14496-3:2001。
  5. 2003年,标准化HE-AAC v2 Profile (AAC LC with SBR and Parametric Stereo) ISO/IEC14496-3:2005
  6. 目前AAC的标准化的版本是 ISO/IEC 14496-3:2009。

从上面标准化历史可知,AAC不在一单纯的一个编码器了,而是一个庞大的音频编码工具集合。

AOT(Audio Object Types)

AOT就是MPEG-4 Audio Object Types的缩写。能力集协商时用的是AOT ID。 也正是由于AAC的AOT繁多,导致识别使用AAC的用户很困扰。 AAC-LC 可认为是AOT为2的AAC。 下表是AOT的对应表。

object type ID Audio Object Type z description
0 Null
1 AAC Main 1999 contains AACLC
2 AAC LC (Low Complexity) 1999 used in the “AAC Profile”.MPEG-4 AAC LC Audio Object Type is based on the MPEG-2 Part7 Low Complexity profile(LC)combined with Perceptual Noise Subsitution(PNS)(define in MPEG-4 part 3 Subpart 4)
3 AAC SSR (Scalable Sample Rate) 1999 Mpeg4 AAC SSR Audio Object Type is based on the MPEG-2 Parg 7 Scalable Sampling Rate profile(SSR)combined with Perceptual Noise Subsitution(PNS)(defined in MPEG-4 Parg 3 Subpart 4)
4 AAC LTP (Long Term Prediction) 1999 contains AAC LC
5 SBR (Spectral Band Replication) 2003 used with AAC LC in the “High Efficiency AAC Profile”(HE-AAC v1)
6 AAC Scalable 1999
7 TwinVQ 1999 audio coding at very low bitrates
8 CELP (Code Excited Linear Prediction) 1999 speech coding
9 HXVC (Harmonic Vector eXcitation Coding) speech coding
10 Reserved
11 Reserved
12 TTSI (Text-To-Speech Interface)
13 Main Synthesis
14 Wavetable Synthesis
15 General MIDI
16 Algorithmic Synthesis and Audio Effects
17 ER (Error Resilient) AAC LC
18 Reserved
19 ER AAC LTP
20 ER AAC Scalable
21 ER TwinVQ
22 ER BSAC (Bit-Sliced Arithmetic Coding)
23 ER AAC LD (Low Delay)
24 ER CELP
25 ER HVXC
26 ER HILN (Harmonic and Individual Lines plus Noise)
27 ER Parametric
28 SSC (SinuSoidal Coding)
29 PS (Parametric Stereo)
30 MPEG Surround
31 (Escape value)
32 Layer-1
33 Layer-2
34 Layer-3
35 DST (Direct Stream Transfer)
36 ALS (Audio Lossless)
37 SLS (Scalable LosslesS)
38 SLS non-core
39 ER AAC ELD (Enhanced Low Delay)
40 SMR (Symbolic Music Representation) Simple
41 SMR Main
42 USAC (Unified Speech and Audio Coding) (no SBR)
43 SAOC (Spatial Audio Object Coding)
44 LD MPEG Surround
45 USAC
MPEG-4 Audio Profile

MPEG-4在音频编码方向对音频能力集合的描述称为Audio Profiles,音频能力描述基于AOT image

  1. MPEG-2 AAC LC: Advanced Audio Coding Low-Complexity,(AAC-LC / LC-AAC)格式是MPEG-2格式,设计用于数字电视。AAC-LC用于存储空间和计算能力有限的情况。这种类型没有使用预测和增益控制这两种工具,瞬时噪声整形的阶数也比较低。 AAC-LC是充分利用心理声学原理,对人类对音频信号的感知存在不相干性和统计冗余的特性,最大程度的减少用于表达信号的比特数据 ,实现音频信号快速有效地压缩,而不再追求输出信号和原始信号相似度。 AAC-LC的重要技术点有如下一些。
  • Temporal Noise Shaping:瞬时噪声整形是用来控制量化噪声的瞬时形态,解决掩蔽阈值和量化噪声的错误匹配的问题。TNS利用时频对偶性,即时域平稳的信号会在频域上变比剧烈,而频域平稳的信号会在时域上变化剧烈。对时域的瞬态信号可以对频谱系数进行预测编码。对频谱系数进行预测,可以及时调节量化器以适应输入信号的时域状态,可以有效的控制量化噪声,
  • Intensity Stereo:利用心理声学原理提高编码效率的一种方法。由于人耳对高频信号的相位不敏感,只要信号的能量和频谱相似,在感知上没有什么区别,所以当一对声道的信号相关性较高时,可以对高频部分进行一定的处理,只在一个声道中编码传输数据,而不会影响解码后的重建音质。 AAC-LC把6kHz作为声强立体声处理的起始频率,在这个频率上的都进行声强立体声处理。计算出左右声道各个子带的能量和总能量,然后计算左声道能量和总能量的比值并换算成一个强度因子,按照这个强度因子对了带内的所有频谱进行左右声道求和并归一化,右声道的数据则全部置零,这样只需要对左声道数据进行量化编码。
  • Perceptual Noise Substitution:感知噪声替代用于频谱成分分类似噪声(功率谱密度是均匀的)时,用人造噪声代替。当判断某个频带需要进行感知噪声替代后,只用把该频带的能量作为参数编码传输,而不需要对子带内的频谱值进行编码,解码时解出子带能量和随机矢量生成函数产生的类似噪声。 Middle/Side:立体声编码,是利用一对声道的信号之间的相关性去冗余,降低编码比特率的方法。AAC-LD编码器中对左右声道的数据相关性较大时,可以用Middle=(L+R)/ 2,Side = (L-R)/2来代替左右声道的数据进行编码。这样能量集中在一个声道数据中,而另外一个声道只要少量比特数据,这样实现了数据压缩。
  1. MPEG-2 AAC Main: 主规格
  2. MPEG-2 AAC SSR: 可变采样率规格(Scaleable Sample Rate)
  3. MPEG-4 AAC LC: 低复杂度规格(Low Complexity)——现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件
  4. MPEG-4 AAC Main: 主规格 ——包含了除增益控制之外的全部功能,其音质最好
  5. MPEG-4 AAC SSR: 可变采样率规格(Scaleable Sample Rate)
  6. MPEG-4 AAC LTP: 长时期预测规格(Long Term Predicition)
  7. MPEG-4 AAC LD: AAC是感知型音频编解码器,可以在较低的比特率下提供很高质量的主观音质。但是这样的编解码器在低比特率下的算法延时往往超过100ms,所以并不适合实时的双向通信。而基于G.722的语音编解码方案因为其较小的算法延时而适合于双向通信。但是这种基于语音的编解码方案只能针对语音信号提供较好的主观质量,并不适合更为复杂的音频信号,而且即使在很高的比特率下,该编解码方案给出的结果也很难达到良好的音质。 常用的感知音频编码器的延时包括:
  • Framing delay:进行块变换需要的块长;
  • Filterbank delay:分析-综合滤波器所需要的延时;
  • Look-ahead delay for block switching:块切换为检测瞬态而需要的延时;
  • Use of bit reservoir:比特池大小相对于平均比特率所需要的延时。 总延时计算公式: image 如下面的AAC-LC为例: iamge 在AAC-LD中,为了减少延时,将原来的1024的帧长改为512;没有了窗切换功能,减少了为进行窗切换所需要的前瞻延时;同时为了增强对瞬态信号的编码质量,引入了窗型切换机制,窗型包括一般的SINE窗和一个少重叠的窗,该窗与后面的窗有很少的重叠,这样通过对TNS工具的优化来消除瞬态信号产生的预回声效应。 MPEG-4 Low Delay Audio Coder (AAC-LD)是直接源于MPEG-2 AAC,并且结合了感知音频编码和双向通信必须的低延时要求。它可以保证最大的20ms的算法延时和包括语音和音乐的信号的很好的音质。现在的MPEG-4 AAC LD支持最大采样率48kHz,最大声道数目是2(可以扩展为多声道)。
  1. MPEG-4 AAC HE: 高效率规格(High Efficiency)—–这种规格适合用于低码率编码,有Nero ACC 编码器支持

14496-3标准,里面定义的profile除了上述的一些规格,还有如Scalable 、 TwinVQ、 CELP、 HVXC等更多其他的profile。

目前听到用的比较多的应该是LC和HE(适合低码率)。流行的Nero AAC的命令行编码程序就支持LC,HE,HEv2这三种,试用后,用MediaInfo分析了编码后的AAC音频,发现规格显示都是LC,当时就感到奇怪,不是说支持三种规格吗?然后才又查资料发现,原来HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+SBR+PS技术,难怪用MediaInfo分析后,HE规格的文件即显示:

1
2
3
格式简介:LC
格式设置,SBR:是
格式设置,PS:否
关于HE与HEv2
  • HE:“high efficiency”(高效性)。HE-AAC v1(又称AACPlusV1,SBR)用容器的方法加了原AAC(LC)+SBR技术。SBR其实代表的是Spectral Band Replication(频段复制)。简单概括一下,音乐的主要频谱集中在低频段,高频段幅度很小(但很重要,决定了音质),如果对整个频段编码,要么为了保护高频造成低频段编码过细以致文件巨大,要么为了保存了低频的主要成分而失去高频成分以致丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解了一对矛盾

  • HEv2 它用容器的方法包含了HE-AAC v1和PS技术。PS指“parametric stereo”(参数立体声)。这个其实好理解,原来的立体声文件,文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方 这样,HEv1和HEv2用个图简单表示下就是:(图中的AAC即指的是原来的AAC-LC) image 由于NERO AAC编码后产生的是经过MP4容器封装后的,而我们的decoder需要处理的是未经封装的AAC流,因此还需要处理从MP4封装格式中extract出AAC流的步骤;哦,这里提到了MP4容器封装,就再把我看到的一些关于MP4容器的心得插入在此也说下:

其实.mp4格式规范是MPEG4 Part 1标准定义的。但是这个格式本身相当通用,并不是只能用来存贮MPEG4视频格式。举个例子,一个.mp4文件中包含的可能是H.263的视频轨及AMR的音频轨。这样它和MPEG4视频压缩算法就半点边都沾不上。但它绝对是一个合法的.mp4文件。从这个意义上讲,.mp4是一个独立的封包格式。也许它的原始设计意图是仅用于MPEG4,但事实上大家觉得它很好用,已经把它扩展成可以包容其它格式了。现在市场上比如某产品号称“支持MP4播放”,到底是什么意思呢?如果它是指可以播放.mp4这种文件,那里面的音频和视频格式它能支持多少种组合呢?没说清楚吧。举个极端的例子,假设一台设备仅支持“视频为未压缩YUV以及不带音频轨的.mp4文件,但它的文件名确实可以是.mp4,是不是也可以在盒子上印上“支持MP4”呢?那么,买回去,复制一个网上下载的.mp4文件(MPEG4视频和AAC音频应该是个比较流行的组合),结果却发现根本不能播放。就算不举这么极端的例子,一般.mp4文件中常见的视频音频格式也有多种,一个产品要做到支持所有的格式是很难的。所以,如果要准确的描述,应该写清楚类似“支持视频格式为MPEG4或H.264/AVC,音频为AMR或AAC的*.mp4文件”。其实更严格一些,还应该写清楚MPEG4支持到哪种profile, AMR是NB还是WB,AAC是LC还是HE等更多细节。当然,这种误导型的说明应该在减少,不过如果有比较确切的格式需求,最好还是先搞清楚这些细节。看到网上还有人说到N73,其实只支持视频为MPEG4 Simple Profile / Advanced Simple Profile及H.263 Profile 0 & 3,音频为AMR-NB/WB或者AAC-LC, HE-AAC的mp4文件。如果你放一个视频格式为H.264/AVC的mp4上去,是无法播放出画面来的。

在网上找了一些工具,如MP4UI,MP4BOX,Yamb(mp4box的GUI程序),采用它们进行extract操作后发现,原来的SBR和PS等信息咋没有了,都变成LC规格的AAC文件啦。好容易准备的测试流,难道还是不能用?于是一番苦寻发现,可能是SBR和PS等信息在ADTS头中是无法体现的,所以分析ADTS格式头的AAC,就无法判别是否是HE和HEv2啦。但是我总觉得SBR和PS等技术信息在AAC流中应该还是存在的。因为我还在一个国外的论坛上看到这么几句话:There’s no requirement for MP4 with AAC to have SBR indicated in the headers. It’s still correct not to have it marked and have SBR or PS data in the stream anyway. Likewise, decoding a frame and not seeing any SBR or PS info doesn’t mean you can’t find it further up in the stream anyway(我理解就是说SBR OR PS信息不一定在Header中有,但是并不意味着你不能进一步在stream中发现它)。

HE-AAC的.mp4码流,经过extract出AAC(ADTS)后,44.1KHZ的变成了22.05KHZ。HEv2-AAC的.mp4码流,经过extract出AAC(ADTS)后,不但44.1KHZ的变成了22.05KHZ(一半),连2channels也变成了1channels,这个问题更奇怪了,在论坛上找,发现也有人有此问题:“I get 22050Hz, 1 channel for audio that is in fact 44100Hz, 2channels and having both SBR and PS”。

后来看到MSDN中的AAC Decoder的描述中有这么一小段话: The media type gives the sample rate and number of channels prior to the application of spectral band replication (SBR) and parametric stereo (PS) tools, if present. The effect of the SBR tool is to double the decoded sample rate relative to the core AAC-LC sample rate. The effect of the PS tool is to decode stereo from a mono-channel core AAC-LC stream. 我的理解是AAC的decoder如果支持SBR和PS,会将AAC-HEV1(SBR)中的sample rate提高一倍,而会将AAC-HEV2(SBR+PS)中不仅sample rate提高一倍,单声道也提高至双声道了。结合前面提到的SBR(频段复制)和PS(参数立体声)技术的简单介绍,好像觉得这样是有点儿道理的哦~~ 用IPP example提供的解码工具simple_player简单试了下,对于44.1khz,stereo的HEv2-AAC的.mp4码流,经过extract出22.05KHZ,mono 的AAC(ADTS)后,再使用simple_player进行音频解码测试,解完后,果然发现又恢复了44.1khz和stereo。(但目前也测试了好几种extract出的HE和HEv2的aac码流,有的能将sample rate和channel 又double回来,有的又不能,这个具体原因是不是由于Ipp example提供的解码器的问题还不确定)。

另外,用simple_player如果直接decoder编码出的经过封装的.mp4格式的AAC音频的话,发现:其它都正常,只AAC-HEv2格式的.mp4音频解码后变成了单声道。难道是解码器中的PS tools没能发挥作用?初步估计应该是IPP 的那个小解码器的问题吧。

AAC封装格式

image 以常用的两个格式为例:

  • ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
  • ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。 简单说,ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,具体的组织结构在这里就不详说了。

参考: AAC的各种规格

AAC格式和M4A格式

AAC(Advanced Audio Coding),中文称为“高级音频编码”,出现于1997年,基于 MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony(索尼)等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC 重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。AAC编码的主要扩展名有三种:

  • .AAC - 使用MPEG-2 Audio Transport Stream( ADTS,参见MPEG-2 )容器,区别于使用MPEG-4容器的MP4/M4A格式,属于传统的AAC编码(FAAC默认的封装,但FAAC亦可输出 MPEG-4 封装的AAC)
  • .MP4 - 使用了MPEG-4 Part 14(第14部分)的简化版即3GPP Media Release 6 Basic (3gp6,参见3GP ) 进行封装的AAC编码(Nero AAC 编码器仅能输出MPEG-4封装的AAC);
  • .M4A - 为了区别纯音频MP4文件和包含视频的MP4文件而由苹果(Apple)公司使用的扩展名,Apple iTunes 对纯音频MP4文件采用了”.M4A”命名。M4A的本质和音频MP4相同,故音频MP4文件亦可直接更改扩展名为M4A。是 MPEG-4 Audio 标准容器,而 AAC 作为一个容器是 MPEG-2 标准的。现在的 AAC-LC 就是以前制定的 MPEG-2 时代的 AAC 的更名延续,而 MPEG-4 时代的 AAC 叫 AAC-HE .AAC-LC 可以用 AAC (ADTS) 作容器也可以用 MP4 做容器,两者可以用 MP4Box 的一个命令直接转换,而 AAC-HE 只能用 MP4 做容器。
Sampling Frequencies

There are 13 supported frequencies:

  • 0: 96000 Hz
  • 1: 88200 Hz
  • 2: 64000 Hz
  • 3: 48000 Hz
  • 4: 44100 Hz
  • 5: 32000 Hz
  • 6: 24000 Hz
  • 7: 22050 Hz
  • 8: 16000 Hz
  • 9: 12000 Hz
  • 10: 11025 Hz
  • 11: 8000 Hz
  • 12: 7350 Hz
  • 13: Reserved
  • 14: Reserved
  • 15: frequency is written explictly
Channel Configurations

These are the channel configurations:

  • 0: Defined in AOT Specifc Config
  • 1: 1 channel: front-center
  • 2: 2 channels: front-left, front-right
  • 3: 3 channels: front-center, front-left, front-right
  • 4: 4 channels: front-center, front-left, front-right, back-center
  • 5: 5 channels: front-center, front-left, front-right, back-left, back-right
  • 6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
  • 7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
  • 8-15: Reserved
术语说明
  • AAC: Advanced Audio Coding 高级音频编码
  • AAC LC: AAC with Low Complexity AAC的低复杂度配置
  • AAC plus: 也叫HE-AAC, AAC+,MPEG4 AAC LC加入SBR模块后形成的一个AAC版本
  • MPEG:Motion Picture Expert Group
  • IMDCT:反离散余弦变换
  • ADIF:Audio Data Interchange Format 音频数据交换格式
  • ADTS:Audio Data Transport Stream 音频数据传输流
  • SCE: Single Channel Element单通道元素
  • CPE: Channel Pair Element 双通道元素
  • CCE: Coupling Channel Element 藕合通道元素
  • DSE: Data Stream Element 数据流元素
  • PCE: Program Config Element 程序配置元素
  • FIL: Fill Element 填充元素
  • ICS: Individual Channel Stream 独立通道流
  • PNS: Perceptual Noise Substitution 知觉噪声替换
  • SBR: Spectral Band Replication 频段复制
  • TNS: Temporal Noise Shaping 瞬时噪声整形
  • ch:channel 通道
最后

AAC-LC 是什么格式?和 AAC 有什么区别? AAC是标准化在MPEG2和MPEG4的音频编码集合的总称。 AAC-LC是标准化AAC中AOT为2的一种音频编解码,它的特点是运算复杂度低,对内存占用小,标准化的时间早,对通性好,兼容性好,使用广。不足是算法时延高,不利于实时的音频通讯。

问题原因分析

首先BufferOverFlowException问题,由于音频采用AAC-HE导致MediaExtractor解析出的音频采样率为本身采样率的一半,同时创建出的解码OutputBuffer的大小是编码InputBuffer的2倍,而media-for-mobile开源项目直接将从解码器OutputBuffer取出的数据塞入编码器InputBuffer中,2倍的数据放入一倍的Buffer导致溢出,暂时的解决办法手动指定编码器InputBuffer max-size为一个较大值(10*1024).同时,由于MediaExtractor不能获取正确的audio profile,也无法确认获取到的采样率是否不正确采样率的一半,所以采用ffmpeg接口获取profile,但是ffmpeg调用avcodec_open2获取到的profile为-99,而且采样率依然为正常采样率一半,只有在解码一帧音频后才能得到正确的profile与采样率.

其次,转码进度不增加的问题,主要是High的H264视频,media-for-mobile使用一个MediaExtractor一次抽取音视频帧,如果是音频则交音频解码器,如果为视频则交视频解码器,解码后将解码帧转交编码器,编码后将数据写入MediaMuxer,将数据写入MediaMuxer的前提是吊用过addTrack,将音视频track加入到Muxer中,而addTrack需要在音视频解码若干帧后产生INFO_OUTPUT_FORMAT_CHANGED,若没有addTrack会导致编码后数据如法写入Muxer,卡死编码器,Baseline视频只需要少量帧就可以产生INFO_OUTPUT_FORMAT_CHANGED,但High视频产生INFO_OUTPUT_FORMAT_CHANGED需要更多的帧,而media-for-mobile中,MediaExtractor首先一直获取到的是音频数据,音频一直解码编码,但是输出的muxer时,videotrack未被添加,所以无法将音频编码器的数据写入muxer,音频解码器被卡死,而mediasource一直被产生的audio数据无法被消费,无法获取到视频数据导致视频INFO_OUTPUT_FORMAT_CHANGED一直无法产生,最终产生死锁,导致audio等待video的INFO_OUTPUT_FORMAT_CHANGED,video等待audio被读完后读到video解码产生INFO_OUTPUT_FORMAT_CHANGED.

最后将audio和video使用两个MediaExtractor各读取各自内容.

坚持原创技术分享,您的支持将鼓励我继续创作!