三星手机中的Android AudioTrack奇怪的噪音

时间:2015-05-28 12:04:47

标签: android audio mediacodec audiotrack

我的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);

1 个答案:

答案 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>