问题描述
在处理视频转码时,也对音频做了转码。不知为何项目代码里使用了AAC HE
的输出格式:
MediaFormat outputFormat = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, samplerate, channelCount);
outputFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
outputFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
sampleRate
和channelCount
则是从Extractor
中选取音频轨道后,读取出来的值。网上很多的转码库中,音频的转码输出基本都是AAC LC
,也就是AACObjectLC
。
那这里使用HE输出,就会遇到个问题:
如果原视频的音轨的格式是AAC LC 48kHz
的,那么此时转码后的音频会变成AAC LC SBR 48kHz
(AAC LC SBR
就是AAC HE
),没问题,视频播放正常,音频播放也正常。而此时,如果将这个转码后的视频或音频再去走一遍转码流程,也就是AAC HE
转AAC HE
,简单猜测是不会有问题的。但此时就出现了异常,AAC LC SBR 48kHz
的音频再次转码后,就变成了AAC LC SBR 24kHz
,采样率变成了原来的一半,音频duration变成了2倍,声音变成了慢速播放。
问题原因
原因出在对采样率的获取上,当AAC LC SBR 48kHz
的音频,经过Extractor
提取后,从中获取到的采样率,就只有24kHz
了。所以,后面设置outputformat
时,设置的采样率就不对了。那为什么获取到的采样率只有一半?
RFC6416中对SBR模式进行了说明.
The core codec sampling rate is the default audio codec sampling
rate. When SBR is used, typically the double value of the core codec
sampling rate will be regarded as the definitive sampling rate (i.e.,
the decoder's output sampling rate)
另外,通过MediaCodec解码器,对音频进行解码,在解码器的回调中,获取的sampleRate就是正确的48kHz
:
@Override
public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
}
因此后续需要设置给音频编码器的sampleRate,要么主动乘2,要么从解码器中获取到正确的sampleRate。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END