【问题标题】:loop sound files in android?在android中循环声音文件?
【发布时间】:2014-07-15 22:51:55
【问题描述】:

此代码在初始循环中运行良好。但是,一旦我停止并再次点击循环按钮,文件就会混淆并无序播放。任何人都知道出了什么问题?任何帮助将不胜感激。

public class OneExp extends ActionBarActivity {

private ListView lv; 
private ArrayAdapter<String> arrayAdapter;
private MediaPlayer mp;
private MediaPlayer mp2;
int[] myAudio = {R.raw.e_1101, R.raw.e_1102, R.raw.e_1103, R.raw.e_1104, R.raw.e_1105,
        R.raw.e_1106, R.raw.e_1107, R.raw.e_1108, R.raw.e_1109, R.raw.e_1110, R.raw.e_1111};
int mCompleted = 0;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.one_exp);

    Button btnLoop = (Button) findViewById(R.id.button1);
    Button btnStop = (Button) findViewById(R.id.button2);

    btnStop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (mp2 != null) {

                if (mp2.isPlaying()) {
                    mp2.stop();

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

    btnLoop.setOnClickListener(new OnClickListener() {



        @Override
        public void onClick(View arg0) {

            mp2 = MediaPlayer.create(getBaseContext(), myAudio[0]);
            mp2.setOnCompletionListener(new OnCompletionListener() 
            {
                @Override
                public void onCompletion(MediaPlayer mp2)
                {
                    mCompleted++;
                    mp2.reset();
                    if (mCompleted < myAudio.length) 
                    {
                        try
                        {
                            AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
                            if (afd != null) 
                            {
                                mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                                afd.close();
                                mp2.prepare();
                                mp2.start();
                            }
                        }
                        catch (Exception ex) 
                        {
                           ex.printStackTrace();
                        }

                    } 
                    else if (mCompleted>=myAudio.length) 
                    {
                        mCompleted =0;
                        try
                        {
                            AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
                            if (afd != null) 
                            {
                                mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                                afd.close();
                                mp2.prepare();
                                mp2.start();
                            }
                        }
                        catch (Exception ex) 
                        {
                           ex.printStackTrace();
                        }
                    }
                    else
                    {
                        mCompleted=0;
                         mp2.release();
                         mp2 = null;
                    }

                }
            });


            mp2.start();  

        }

    });

【问题讨论】:

    标签: android audio android-mediaplayer


    【解决方案1】:

    看看http://developer.android.com/reference/android/media/MediaPlayer.html#setLooping(boolean

    既然可以轻松使用 start()、stop()、pause() 和 setLooping(true),为什么还要使用这么多代码?

    据我所知,没有必要检查音频的长度。

    当您调用 pause() 并稍后调用 start() 时,您的音频将继续原处。

    仅当您完全完成文件时才调用 release/reset。

    【讨论】:

    • 我想循环一系列文件,而不仅仅是一个。您如何设置一个循环,例如连续三个文件并重复所有三个文件,直到我按下停止?
    • 我会做一个普通的 FOR() 循环。如果只有 3 个文件,那么它们将同时停止,不会有任何明显的延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2021-04-14
    相关资源
    最近更新 更多