在同一个活动中播放两个音频文件

3
MediaPlayer instrumental = new MediaPlayer();
MediaPlayer vocal = new MediaPlayer();

当我点击播放按钮时,我希望这两个对象能够独立工作。

这两个实例应该分别播放。

声音应该有自己的进度条,可以显示其音频的音量而不影响伴奏的音量。

可以将此问题视为使用不同的音量控件运行两个音频。


你能添加你的问题/问题吗? - Al_th
啊,我正试图在伴奏和人声一起播放。但是对于人声音频,我应该通过进度条来控制它的音量。 - ceosilvajr
2个回答

2
您可以使用MediaPlayer的setVolume()方法来控制音频。例如:
MediaPlayer mp = new MediaPlayer();
...
mp.setVolume(1, 1);

这些参数是用于左右声道。要修改这些值,请尝试按照本文所述计算值:https://dev59.com/iG435IYBdhLWcg3wyzMJ#12075910


1
这可以通过在您的 MediaPlayer 实例上设置单独的音频流类型来完成。我不知道这是否会产生任何意想不到的后果,我猜你应该为音乐使用 STREAM_MUSIC ...但它有效。
seek1 = (SeekBar) findViewById(R.id.seek1);
seek2 = (SeekBar) findViewById(R.id.seek2);

seek1.setOnSeekBarChangeListener(this);
seek2.setOnSeekBarChangeListener(this);

am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

seek1.setMax(am.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
seek2.setProgress(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL));

// Set up your MediaPlayers
// Call the following lines before onPrepare()

instrumental.setAudioStreamType(AudioManager.STREAM_MUSIC);
vocal.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

稍后在您的onSeekBarChangeListener中。
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    if (seekBar.equals(seek1)) {
        am.setStreamVolume(AudioManager.STREAM_MUSIC, seekBar.getProgress(), 0);
    }
    else {
        am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, seekBar.getProgress(), 0);
    }

}

谢谢你的回复,Ken先生。但是我的问题是要调整assets中另一个音频文件中的人声音量。 - ceosilvajr
1
这个会做那个。我现在已经在我的手机上运行了它。使用来自资产的2个音频文件。和2个滑块控制2个独立的流。你试过了吗?有什么问题? - Ken Wolf
使用AudioManager.STREAM_VOICE_CALL安全吗?因为我有一个录音功能,需要同时录制我的声音和播放这两个音频。 - ceosilvajr
1
据我所知,这是安全的。我不知道你如何控制两个不同的音量流。你需要不同的流。你可以尝试另一个。警报等。 - Ken Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接