我的Android应用程序使用MediaCodec解码音频流并使用AudioTrack播放。当使用戴尔Venue 3830(英特尔处理器,Kitkat OS)进行测试时,它的播放效果很好,但在使用三星GT-S7582(Armv7处理器,JellyBean OS)进行测试时,会产生奇怪的巨响。有没有办法克服这种噪音?
Mediacodec解码器配置
String mimeType = "audio/3gpp";
AudioDecoder = MediaCodec.createDecoderByType(mimeType);
MediaFormat mMediaFormat = new MediaFormat();
mMediaFormat = MediaFormat.createAudioFormat(mimeType,sampleRate,1);
AudioDecoder.configure(mMediaFormat,null, null, 0);
AudioDecoder.start();
AudioTrack配置
mAudioTrack = new AudioTrack(
AudioManager.STREAM_VOICE_CALL,
sampleRate,
AudioFormat.CHANNEL_OUT_MONO ,
AudioFormat.ENCODING_PCM_16BIT,
AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT)*8,
AudioTrack.MODE_STREAM);
答案 0 :(得分:2)
通常,您可能只想在解码器中获得AudioTrack
后设置INFO_OUTPUT_FORMAT_CHANGED
,并使用来自MediaFormat
MediaCodec.getOutputFormat
设置参数的信息。例如。对于AAC,即使文件本身是单声道,一些解码器也可以将其解码为立体声。 (但这不会产生很大的噪音,只会让它听起来慢两倍。)
由于你正在解码AMR-NB,而不是AAC,它可能不会在立体声中返回,但你可能仍然想检查输出MediaFormat
以查看解码器是否以某种意外的格式返回数据。 / p>
你也可以使用MediaCodecList
来寻找另一个解码器,而不是依赖于只挑选第一个解码器的MediaCodec.createDecoderByType
。在大多数设备上,有谷歌SW解码器,但有些设备也可能有硬件解码器,可能会有不同的行为。通过手动迭代列表并优先选择以OMX.google
开头的那些(在您的情况下为OMX.google.amrnb.decoder
),您可能会获得更可预测的行为。 (对于视频,人们通常不想使用SW编解码器,除非它们是唯一的选择,因为两者之间的性能差异很大,但对于音频而言,差异在大多数情况下并不重要。)< / p>