简体   繁体   English

如何同时调节两个媒体播放器的音量?

[英]How to adjust the volume of two media players simultaneously?

I am running two media players simultaneously to play two different sounds, one is audio recording and second one is music. 我同时运行两个媒体播放器来播放两种不同的声音,一种是录音,第二种是音乐。 I am controlling the volume of both through two seekbars. 我通过两个搜索栏控制两者的音量。 The problem is, volume of one media player is controlled at once. 问题是,一次控制一个媒体播放器的音量。 When one media player is released, volume of other media player can be adjusted. 释放一个媒体播放器时,可以调节另一媒体播放器的音量。 I want to adjust SIMULTANEOUSLY Here's my implementation. 我想同时进行调整这是我的实现。

 public void setMediaPLayers() {
    mediaPlayer = new MediaPlayer(); //TO PLAY VOICE RECORDING
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

    try {
        mediaPlayer.setDataSource(AudioSavePathInDevice); //VOICE RECORDING FILE PATH
        mediaPlayer.prepare();
        mediaPlayer.start();

    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer2 = MediaPlayer.create(getActivity(), R.raw.sunnysideup); //FOR MUSIC FILE
    mediaPlayer2.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer2.start();
}

In seekbars, i am using audio manager to adjust volumes. 在搜寻栏中,我正在使用音频管理器来调整音量。 In music seekbar, volume is adjusted through, 在音乐搜寻栏中,可以通过以下方式调节音量:

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0); // i = seekbar progress

Code for changing the volume of recording seekbar is, 用于更改录制搜寻栏音量的代码是,

audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, i, 0); // i = seekbar progress

Here's the solution to play 2 media players simultaneously and control their volume through seekbars. 这是同时播放2个媒体播放器并通过搜索栏控制其音量的解决方案。

Create Variables 创建变量

MediaPlayer mpOne = null;
MediaPlayer mpTwo = null;
SeekBar seekBarOne, seekBarTwo;

//Path to mp3 file stored in device
String FILE_PATH_ONE = Environment.getExternalStorageDirectory().getPath() + "/music_one.mp3";
String FILE_PATH_TWO = Environment.getExternalStorageDirectory().getPath() + "/music_two.mp3";

Function to intialize and start media players: 初始化和启动媒体播放器的功能:

public void setMediaPlayers() {
    mpOne = new MediaPlayer();
    mpTwo = new MediaPlayer();


    try {
        mpOne.setDataSource(FILE_PATH_ONE);
        mpTwo.setDataSource(FILE_PATH_TWO);
        mpOne.prepare();
        mpTwo.prepare();
        mpOne.start();
        mpTwo.start();

    } catch (IOException e) {
        e.printStackTrace();
    }

}

Create SeekBarChangeListener to get the current progress. 创建SeekBarChangeListener以获取当前进度。

SeekBar.OnSeekBarChangeListener seekBarOneListener = new SeekBar.OnSeekBarChangeListener() {

    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

        //Lets assume, seekbar's maximum progress is 10.
        //i is the progress of seekbar between 0 to 10.

        float volume = i * 0.10f;

        //Set the volume if media player is  not null
        if (null != mpOne)
            //volume is the float number between 0.0 and 1.0
            mpOne.setVolume(volume, volume);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
};

SeekBar.OnSeekBarChangeListener seekBarTwoListener = new SeekBar.OnSeekBarChangeListener() {

    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

        //Lets assume, seekbar's maximum progress is 10.
        //i is the progress of seekbar between 0 to 10.

        float volume = i * 0.10f;

        //Set the volume if media player is  not null
        if (null != mpTwo)
            //volume is the float number between 0.0 and 1.0
            mpTwo.setVolume(volume, volume);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
};

In activity or fragment 活动中或片段中

seekBarOne = (SeekBar) v.findViewById(R.id.seekBar1);
seekBarTwo = (SeekBar) v.findViewById(R.id.seekBar2);

seekBarOne.setOnSeekBarChangeListener(seekBarOneListener);
seekBarTwo.setOnSeekBarChangeListener(seekBarTwoListener);

//Start media players
setMediaPlayers();

//Completion listeners for releasing media players on completion.
mpOne.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {

            mpOne.reset();
            mpOne.release();
            mpOne = null;
        }
    });
 mpTwo.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {

            mpTwo.reset();
            mpTwo.release();
            mpTwo = null;
        }
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM