2013-06-28 82 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进行播放。 –

相关问题