2015-05-28 44 views
2

我的Android應用程序使用MediaCodec解碼音頻流並使用AudioTrack播放它。使用戴爾Venue 3830(英特爾處理器,Kitkat OS)進行測試時,它的播放效果不錯,但使用三星GT-S7582(Armv7處理器,JellyBean OS)進行測試時,會產生怪異的巨響。有什麼方法可以克服這種噪音嗎?Android AudioTrack奇怪的三星手機噪音

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

回答

2

一般情況下,你可能想建立AudioTrack只有當你已經得到了來自解碼器INFO_OUTPUT_FORMAT_CHANGED,並使用信息從MediaFormatMediaCodec.getOutputFormat設置參數。例如。對於AAC,即使文件本身是單聲道的,一些解碼器也可以將其解碼爲立體聲。 (但是這不會產生很大的噪音,它只會使聲音慢兩倍。)

由於您正在解碼AMR-NB,而不是AAC,因此可能無法在立體聲中返回,但您可能仍希望檢查輸出MediaFormat以查看解碼器是否以某種意外格式返回數據。

您也可以使用MediaCodecList來尋找另一個解碼器,而不是依靠MediaCodec.createDecoderByType,它只是選擇第一個解碼器。在大多數設備上,都有谷歌SW解碼器,但是一些設備也可以有一個硬件解碼器,它可能會有不同的表現。通過在列表中手動迭代並優先選擇以OMX.google(例如OMX.google.amrnb.decoder)爲開頭的值,您可能會獲得更多可預測的行爲。 (對於視頻而言,除非是唯一的選擇,否則通常不會使用軟件編解碼器,因爲兩者在性能上存在巨大差異,但對於音頻來說,在大多數情況下,差異不應該太大。)