【问题标题】:Playing audio files one after another一个接一个地播放音频文件
【发布时间】:2023-04-01 12:08:02
【问题描述】:

我有一个这样的音频文件列表,

int music_numbers[] = { R.raw.one, R.raw.two, R.raw.three, R.raw.four,
            R.raw.five, R.raw.six, R.raw.seven, R.raw.eight, R.raw.nine };

我需要一个一个地玩这个——当我向这个 play_numbers 方法发送 100 时——我打算按数字玩..

我已经做到了 - 但我无法一个接一个地做到这一点..

private void _play_numbers(final String i) {
    // TODO Auto-generated method stub

    mPlayer = MediaPlayer.create(PlayFileActivity.this, R.raw.payment);
    mPlayer.start();

    mPlayer.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            // TODO Auto-generated method stub
            mPlayer.stop();
            myDigit = i.charAt(1) + "";

            _function_play_file(Integer.parseInt(myDigit));

        }

    });

}

在 _function_play_file - 我有这个

void _function_play_file(int files) {

        switch (files) {
        case 0:
            mPlayer = MediaPlayer.create(this, music_numbers[0]);
            mPlayer.start();
        case 1:
            mPlayer = MediaPlayer.create(this, music_numbers[1]);
            mPlayer.start();
        case 2:
            mPlayer = MediaPlayer.create(this, music_numbers[2]);
            mPlayer.start();
        case 3:
            mPlayer = MediaPlayer.create(this, music_numbers[3]);
            mPlayer.start();
        case 4:
            mPlayer = MediaPlayer.create(this, music_numbers[4]);
            mPlayer.start();
        case 5:
            mPlayer = MediaPlayer.create(this, music_numbers[5]);
            mPlayer.start();
        case 6:
            mPlayer = MediaPlayer.create(this, music_numbers[6]);
            mPlayer.start();
        case 7:
            mPlayer = MediaPlayer.create(this, music_numbers[7]);
            mPlayer.start();
        case 8:
            mPlayer = MediaPlayer.create(this, music_numbers[8]);
            mPlayer.start();
        case 9:
            mPlayer = MediaPlayer.create(this, music_numbers[9]);
            mPlayer.start();
        case 10:
            mPlayer = MediaPlayer.create(this, music_numbers[10]);
            mPlayer.start();

        }
    }

【问题讨论】:

标签: android android-mediaplayer


【解决方案1】:

您需要为每个设置一个 onCompletionListener 并在完成时启动下一个。

mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
{
    @Override
    public void onCompletion(MediaPlayer mp) 
    {
         // Code to start the next audio in the sequence
    }
});

实现这一点的最佳方法是创建一个实现 OnCompletionListener 的类,该类处理 onCompletion 并接收下一个要播放的文件。这样你就可以在你的代码中很好地实例化它。 当然,不要忘记休息;在上述情况下。

【讨论】:

  • 那么如果我想一个接一个地播放20个文件,我是否必须将setOnCompletionListener嵌套在另一个内部20次?
【解决方案2】:

使用队列来保存要播放的号码。

private void _play_numbers(final String i) {
    // e.g '100': put '1', '0', '0' in a Queue after converting to digits
    Queue queue = new LinkedList();
    //Use the add method to add items.

    myDigit = // remove next digit from queue..

    _function_play_file(myDigit);
}

void _function_play_file(int files) {
     switch(files) {
       case 0:
        mPlayer = MediaPlayer.create(PlayFileActivity.this, R.raw.payment);
        mPlayer.setOnCompletionListener(completeListener );
        mPlayer.start();
        break;
 .....
 }

OnCompletionListener completeListener = new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.release();
        myDigit = // remove next digit from queue..
        if (myDigit != -1)  // if queue is not empty..
            _function_play_file(myDigit);
    }
});

}

【讨论】:

    【解决方案3】:

    此代码适用于我,但我将音频文件放在 assets 文件夹中:

    //define a variable to be used as index.
    int audioindex = 0;
    //Extract the files into an array
    String[] files = null;
    files = assetManager.list("audiofiles");
    mp.setOnCompletionListener(new OnCompletionListener(){
        // @Override
        public void onCompletion(MediaPlayer arg0) {
        // File has ended, play the next one.
       FunctionPlayFile(files[audioindex]);
       audioindex+=1; //increment the index to get the next audiofile
         }
    });
    

    【讨论】:

      【解决方案4】:

      这是在继续循环中播放歌曲的工作代码

      public class MainActivity extends Activity 
      {
          private int[] tracks = {R.raw.explosion,R.raw.pianothingy_one,R.raw.car_horn_x};
          int mCompleted = 0;
      
       public void onCreate(Bundle savedInstanceState) 
       {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
      
       MediaPlayer mp = MediaPlayer.create(this, tracks[0]);
       mp.setOnCompletionListener(new OnCompletionListener() 
       {
           @Override
           public void onCompletion(MediaPlayer mp)
           {
               mCompleted++;
               mp.reset();
               if (mCompleted < tracks.length) 
               {
                   try
                   {
                       AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
                       if (afd != null) 
                       {
                           mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                           afd.close();
                           mp.prepare();
                           mp.start();
                       }
                   }
                   catch (Exception ex) 
                   {
                      ex.printStackTrace();
                   }
      
               } 
               else if (mCompleted>=tracks.length) 
               {
                   mCompleted =0;
                   try
                   {
                       AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
                       if (afd != null) 
                       {
                           mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                           afd.close();
                           mp.prepare();
                           mp.start();
                       }
                   }
                   catch (Exception ex) 
                   {
                      ex.printStackTrace();
                   }
               }
               else
               {
                   mCompleted=0;
                    mp.release();
                    mp = null;
               }
      
           }
       });
      
       mp.start(); 
      

      【讨论】:

        【解决方案5】:

        像这样使用 PlayMedia

        int[] soundIDs = {R.raw.yes, R.raw.eat};
        PlayMedia playAudio = new PlayMedia(context,soundIDs);
        playAudio.execute();
        

        并像这样定义 PlayMedia 类

        import android.content.Context;
        import android.media.MediaPlayer;
        import android.media.MediaPlayer.OnCompletionListener;
        import android.os.AsyncTask;
        import android.util.Log;
        
        public class PlayMedia extends AsyncTask<Void, Void, Void> {
        
            private static final String LOG_TAG = PlayMedia.class.getSimpleName();
        
            Context context;
            private MediaPlayer mediaPlayer;
            int[] soundIDs;
            int idx =1;
        
            public PlayMedia(MediaPlayer mediaPlayer) {
                this.mediaPlayer = mediaPlayer;
            }
            public PlayMedia(final Context context, final int[] soundIDs) {
                this.context = context;
                this.soundIDs=soundIDs;
                mediaPlayer = MediaPlayer.create(context,soundIDs[0]);
                setNextMediaForMediaPlayer(mediaPlayer);
            }
        
            public void setNextMediaForMediaPlayer(MediaPlayer player){
                player.setOnCompletionListener(new OnCompletionListener() {         
                    public void onCompletion(MediaPlayer mp) {
                        if(soundIDs.length>idx){
                            mp.release();
                            mp = MediaPlayer.create(context,soundIDs[idx]);
                            setNextMediaForMediaPlayer(mp);
                            mp.start();
                            idx+=1;
                        }               
                    }
                });
            }
        
            @Override
            protected Void doInBackground(Void... params) {
                try {
                    mediaPlayer.start();
                } catch (IllegalArgumentException e) {
                    Log.e(LOG_TAG, "", e);
                } catch (SecurityException e) {
                    Log.e(LOG_TAG, "", e);
                } catch (IllegalStateException e) {
                    Log.e(LOG_TAG, "", e);
                }
        
                return null;
            }
        }
        

        【讨论】:

          【解决方案6】:

          对我来说,问题是我没有先打电话给mediaPlayer.reset(),而是打电话给mediaPlayer.prepare()

          现在一切都好。

          【讨论】:

            【解决方案7】:
             MediaPlayer mediaplayer = new MediaPlayer();                                
                setSound(file );    
                try {
                if(mediaplayer != null)
                    {
                        mediaplayer.stop();
                        mediaplayer.release();
                        }
                        mediaplayer.setDataSource(getResources().openRawResourceFd(file)
                                                         .getFileDescriptor());
                        mediaplayer.prepare();  
                        mediaplayer = MediaPlayer.create(getBaseContext(), now); 
                        mediaplayer.start();                     
                        mediaplayer.setLooping(false);
                        mediaplayer.setLooping(true); //sequence playing                    
            
                        }   catch (NullPointerException e) {                         
                                e.printStackTrace();
                   }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-10-08
              • 1970-01-01
              相关资源
              最近更新 更多