Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中将音频从立体声转换为单声道?_Android_Audio_Android Music Player - Fatal编程技术网

如何在Android中将音频从立体声转换为单声道?

如何在Android中将音频从立体声转换为单声道?,android,audio,android-music-player,Android,Audio,Android Music Player,我使用android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI从SD卡加载音乐文件 Intent tmpIntent1 = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); startActivityForResult(tmpIntent1, 0); 在活动结果中 Uri mediaPath =

我使用android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI从SD卡加载音乐文件

Intent tmpIntent1 = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(tmpIntent1, 0);
在活动结果中

Uri mediaPath = Uri.parse(data.getData().toString());
MediaPlayer mp = MediaPlayer.create(this, mediaPath);
mp.start();
现在MediaPlayer以立体声播放音频。有没有办法在应用程序中将选定的音乐/音频文件或输出从立体声转换为单声道

我查找了API和,但没有找到如何将mp3文件音频转换为单声道


像PowerAMP这样的应用程序都有立体声单声道开关,当按下时会立即将输出音频转换为单声道信号,然后再转换回来,它们是如何实现的?

您是否分别加载.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++;
    }
short[]立体样本//从什么地方弄来
//输出阵列,将包含单声道信号
short[]单样本=新的short[立体样本长度/2];
//.wav文件头的长度->44字节
最终int头长度=22;
//附加计数器
int k=0;
对于(int i=0;i标题长度){
单样本[i]=(短)((立体样本[i*2]+立体样本[(i*2)+1])/2);
}
k++;
}
我希望,我能帮助你

致以最良好的祝愿,
G_J

首先,使用编码器将音频文件转换为短数组(short[])。 然后将短数组转换为单声道。 这对我来说非常有效。基本上,我平均了L和R通道。((L+R)/2)

short[]立体采样=sampleBuffer.getBuffer();
short[]monoSamples=新的short[steriosamples.length];
对于(int i=0;i
文件可以是用户设备上的任何音频文件,也可以是mp3。一旦用户选择了文件,我就得到了SD卡上mp3文件的绝对路径。现在如何处理该文件?我正在使用MediaPlayer API播放该文件。我正在构建的是一种音乐播放器,因此欢迎使用除MediaPlayer以外的任何其他API。据我所知,MediaPlayer、SoundPool或AudioTrack都没有提供将播放从立体声更改为单声道的方法。所以我假设,我上面的答案是实现这一目标的唯一途径。如果我错了,请纠正我。如果音频文件也可以是mp3,你必须将它们转换成PCM数据,计算单声道信号并通过AudioTrack播放。你有没有找到解决方案?我也有同样的问题…@dg123不,找不到任何东西!
          short[] stereoSamples = sampleBuffer.getBuffer();
          short[] monoSamples= new short[stereoSamples.length];

          
            for(int i=0; i< monoSamples.length;i+=2){

                 monoSamples[i]= (short) ((pcmChunk[i]+ pcmChunk[i+1])/2);
                monoSamples[i+1]= (short)  ((pcmChunk[i]+ pcmChunk[i+1])/2);

            }