2013-06-28 83 views
1

我使用android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI意圖從SD卡加載音樂文件。如何在Android中將音頻從立體聲轉換爲單聲道?

Intent tmpIntent1 = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(tmpIntent1, 0); 

和onActivityResult

Uri mediaPath = Uri.parse(data.getData().toString()); 
MediaPlayer mp = MediaPlayer.create(this, mediaPath); 
mp.start(); 

現在的MediaPlayer播放的立體聲音頻。有什麼方法可以將應用程序中選定的音樂/音頻文件或輸出從立體聲轉換爲單聲道?

我擡頭看了SoundPoolAudioTrack的API,但沒有找到如何將mp3文件轉換爲單聲道。

像PowerAMP這樣的應用程序有那些立體聲< - >單聲道開關,當按下立即將輸出音頻轉換爲單聲道信號,然後再回來,他們如何做到這一點?

+0

你有沒有想過找出解決方案呢?我有同樣的問題... – dg123

+0

@ dg123 nope,找不到任何東西! –

回答

2

你是否分別加載.wav文件PCM數據?如果是這樣,那麼你可以輕鬆地讀取每個通道的每個採樣,疊加它們並將它們除以通道的數量以獲得單聲道信號。

如果存儲在交錯簽署短褲的形式,你的立體聲信號,計算得到的單聲道信號的代碼可能是這樣的:

short[] stereoSamples;//get them from somewhere 

    //output array, which will contain the mono signal 
    short[] monoSamples= new short[stereoSamples.length/2]; 
    //length of the .wav-file header-> 44 bytes 
    final int HEADER_LENGTH=22; 

    //additional counter 
    int k=0; 


    for(int i=0; i< monoSamples.length;i++){ 
     //skip the header andsuperpose the samples of the left and right channel 
     if(k>HEADER_LENGTH){ 
     monoSamples[i]= (short) ((stereoSamples[i*2]+ stereoSamples[(i*2)+1])/2); 
     } 
     k++; 
    } 

我希望,我能幫助你。

此致敬禮, G_J

+0

文件可以是用戶設備上的任何**音頻文件,也可以是mp3。一旦用戶選擇了該文件,我就可以獲得SD卡上mp3文件的絕對路徑。我現在如何處理文件?我正在使用MediaPlayer API播放該文件。我正在構建的是一種音樂播放器,因此歡迎任何使用MediaPlayer以外的其他API的建議。 –

+0

據我所知,MediaPlayer,SoundPool和AudioTrack都沒有提供一種方法將立體聲轉換爲單聲道。所以我想,上面的答案是實現這一目標的唯一方法。如我錯了請糾正我。 如果音響文件也可以是mp3,那麼您必須將它們轉換爲PCM數據,計算單聲道信號並通過AudioTrack進行播放。 –

相關問題