【问题标题】:Multiple audio tracks in the same activity同一活动中的多个音轨
【发布时间】:2016-12-15 13:33:37
【问题描述】:

我正在创建一个音频播放应用程序。我目前刚刚添加了两个曲目,但最终我需要添加更多...我目前创建了两个不同的媒体播放器来运行这两个曲目,但是随着曲目数量的增加,使用此过程会导致问题和表现不佳!

有什么方法可以让我更好、更通用地编写代码?

这是java代码

public class ChantsFragment extends Fragment {

    TextView text1, text2
    ImageButton play1, play2, pause1, pause2, repeatoff1, repeatoff2, repeaton1, repeaton2, stop1, stop2;
    MediaPlayer mediaPlayer1, mediaPlayer2;
    Toast on, off;

    public ChantsFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_chants, container, false);


        play1 = (ImageButton) view.findViewById(R.id.play1);
        play2 = (ImageButton) view.findViewById(R.id.play2);
        pause1 = (ImageButton) view.findViewById(R.id.pause1);
        pause2 = (ImageButton) view.findViewById(R.id.pause2);
        repeatoff1 = (ImageButton) view.findViewById(R.id.repeatoff1);
        repeatoff2 = (ImageButton) view.findViewById(R.id.repeatoff2);
        repeaton1 = (ImageButton) view.findViewById(R.id.repeaton1);
        repeaton2 = (ImageButton) view.findViewById(R.id.repeaton2);
        stop1 = (ImageButton) view.findViewById(R.id.stop1);
        stop2 = (ImageButton) view.findViewById(R.id.stop2);

        mediaPlayer1 = MediaPlayer.create(getActivity(), R.raw.audio1);
        mediaPlayer2 = MediaPlayer.create(getActivity(), R.raw.audio2);

        on = Toast.makeText(getActivity(), "The chant will repeat itself", Toast.LENGTH_LONG);
        off = Toast.makeText(getActivity(), "The chant will no longer repeat itself", Toast.LENGTH_LONG);

        //Track 1

        text1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer1 != null && mediaPlayer1.isPlaying()) {
                    text1.setClickable(false);
                }

                if (mediaPlayer2 != null && mediaPlayer2.isPlaying()) {
                    mediaPlayer2.stop();
                    mediaPlayer2.release();
                    mediaPlayer2 = null;
                    play2.setVisibility(View.GONE);
                    pause2.setVisibility(View.GONE);
                    repeatoff2.setVisibility(View.GONE);
                    repeaton2.setVisibility(View.GONE);
                    stop2.setVisibility(View.GONE);
                }

                if (mediaPlayer1 == null) {
                    mediaPlayer1 = MediaPlayer.create(getActivity(), R.raw.audio1);
                } else {
                    text1.setClickable(true);
                    mediaPlayer1.start();
                    play1.setVisibility(View.GONE);
                    pause1.setVisibility(View.VISIBLE);
                    repeatoff1.setVisibility(View.VISIBLE);
                    stop1.setVisibility(View.VISIBLE);
                }

                mediaPlayer1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        play1.setVisibility(View.GONE);
                        pause1.setVisibility(View.GONE);
                        repeatoff1.setVisibility(View.GONE);
                        repeaton1.setVisibility(View.GONE);
                        stop1.setVisibility(View.GONE);
                    }
                });
            }
        });


        play1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                play1.setVisibility(View.GONE);
                pause1.setVisibility(View.VISIBLE);
                mediaPlayer1.start();
            }
        });

        pause1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                play1.setVisibility(View.VISIBLE);
                pause1.setVisibility(View.GONE);
                mediaPlayer1.pause();
            }
        });

        repeatoff1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer1.setLooping(true);
                repeatoff1.setVisibility(View.GONE);
                repeaton1.setVisibility(View.VISIBLE);
                on.show();
                off.cancel();
            }
        });

        repeaton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer1.setLooping(false);
                repeaton1.setVisibility(View.GONE);
                repeatoff1.setVisibility(View.VISIBLE);
                off.show();
                on.cancel();
            }
        });

        stop1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer1.stop();
                mediaPlayer1 = null;
                text1.setClickable(true);
                play1.setVisibility(View.GONE);
                pause1.setVisibility(View.GONE);
                repeatoff1.setVisibility(View.GONE);
                repeaton1.setVisibility(View.GONE);
                stop1.setVisibility(View.GONE);
            }
        });

        //Track 2

        text2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer2 != null && mediaPlayer2.isPlaying()) {
                    text2.setClickable(false);
                }

                if (mediaPlayer1 != null && mediaPlayer1.isPlaying()) {
                    mediaPlayer1.stop();
                    mediaPlayer1.release();
                    mediaPlayer1 = null;
                    play1.setVisibility(View.GONE);
                    pause1.setVisibility(View.GONE);
                    repeatoff1.setVisibility(View.GONE);
                    repeaton1.setVisibility(View.GONE);
                    stop1.setVisibility(View.GONE);
                }

                if (mediaPlayer2 == null) {
                    mediaPlayer2 = MediaPlayer.create(getActivity(), R.raw.audio2);
                } else {
                    text2.setClickable(true);
                    mediaPlayer2.start();
                    play2.setVisibility(View.GONE);
                    pause2.setVisibility(View.VISIBLE);
                    repeatoff2.setVisibility(View.VISIBLE);
                    stop2.setVisibility(View.VISIBLE);
                }

                mediaPlayer2.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        play2.setVisibility(View.GONE);
                        pause2.setVisibility(View.GONE);
                        repeatoff2.setVisibility(View.GONE);
                        repeaton2.setVisibility(View.GONE);
                        stop2.setVisibility(View.GONE);
                    }
                });
            }
        });

        play2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                play2.setVisibility(View.GONE);
                pause2.setVisibility(View.VISIBLE);
                mediaPlayer2.start();
            }
        });

        pause2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                play2.setVisibility(View.VISIBLE);
                pause2.setVisibility(View.GONE);
                mediaPlayer2.pause();
            }
        });

        repeatoff2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer2.setLooping(true);
                repeatoff2.setVisibility(View.GONE);
                repeaton2.setVisibility(View.VISIBLE);
                on.show();
                off.cancel();
            }
        });

        repeaton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer2.setLooping(false);
                repeaton2.setVisibility(View.GONE);
                repeatoff2.setVisibility(View.VISIBLE);
                off.show();
                on.cancel();
            }
        });

        stop2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer2.stop();
                mediaPlayer2 = null;
                text2.setClickable(true);
                play2.setVisibility(View.GONE);
                pause2.setVisibility(View.GONE);
                repeatoff2.setVisibility(View.GONE);
                repeaton2.setVisibility(View.GONE);
                stop2.setVisibility(View.GONE);
            }
        });

        return view;
    }

编辑

我目前已着手向应用程序添加大约 10 首曲目。我希望在选择另一首曲目时在当前曲目(如果正在播放)上停止播放,并且使用媒体播放器执行相同操作意味着分别检查是否有 9 个媒体播放器正在播放! (当然,除非我完全错过了另一种方法来做到这一点)

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    嗯,对于一次播放多个音频文件,SoundPool 似乎是您的最佳选择,主要是因为它更轻量级并且您可以控制流的数量。您可以创建一个新的SoundPool 实例:

    SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 100); // 10 = maxStreams, 100 = quality
    

    然后您可以开始将不同的声音加载到其中:

    int soundId1 = soundPool.load(context, R.raw.audio1, 1);
    int soundId2 = soundPool.load(context, R.raw.audio2, 1);
    ...
    

    您可以控制播放:

    int idBeingPlayed = soundPool.play (soundID, 1, 1, 1, -1, 1); // volume params, returns the streamId
    

    其他控件:

    soundPool.pause(streamID);
    soundPool.resume(streamID);
    

    欲了解更多信息,请访问offfical docs。希望这会有所帮助!

    【讨论】:

    • 我尝试使用声音池,但我面临的问题是它不允许我检查当前是否正在播放声音。如果您浏览我上面的代码,我希望在选择另一首曲目时停止播放特定曲目,这是我能够通过媒体播放器实现的。我目前将添加大约 10 首曲目,当我选择另一首曲目时,我希望播放停止在当前曲目(如果正在播放)!并且使用媒体播放器来做这将意味着非常长的代码行,如果我需要在代码中添加一个新曲目,那将是一团糟!
    • 在我上面的代码中的playcall 中,我还保存了idBeingPlayed 变量。在对另一个 ID 调用 play 之前调用 soundPool.pause(idBeingPlayed); 不会停止当前的播放吗?
    • 如果我在没有实际播放的情况下调用暂停或停止,则会引发 NullPointer 异常并且应用程序崩溃
    • 因此,您要确保这些变量在访问它们之前已正确初始化。只是在您的用例中,使用MediaPlayer 独立地重新初始化十个音轨可能有点繁重
    • 正是媒体播放器是不可行的。这也与我正在使用的布局有关,我第一次没有使用播放按钮来播放曲目。点击曲目的文字/名称时播放曲目,因此需要检查当前是否正在播放另一个歌曲并停止它,否则会导致同时播放两个曲目等问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多