代码之家  ›  专栏  ›  技术社区  ›  Catalin Morosan

如何逐个播放音频文件

  •  3
  • Catalin Morosan  · 技术社区  · 14 年前

    我的应用程序的资产目录中有多个音频文件。当用户单击某个按钮时,我希望按一定的顺序逐个播放这些文件。音频文件之间不应该有任何明显的延迟。实现这一目标的最佳方法是什么?

    我想用 MediaPlayer 对象和 OnCompletionListener 但是,那意味着我必须创造很多 OnCompletionListener(完成侦听器) 因为我需要知道下一个音频文件是什么。我是错过了什么,还是有更好的方法?

    3 回复  |  直到 10 年前
        1
  •  3
  •   Jorgesys    14 年前

    你走对了,不需要太多的OnCompletionListener。

    //define a variable to be used as index.
    int audioindex = 0;
    //Extract the files into an array
    String[] files = null;
    files = assetManager.list("audiofiles");
    

    然后在OnCompletionListener中。

     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
         }
    });
    
        2
  •  1
  •   viv    13 年前

    检查一下,这些类可以一个接一个地播放MP3 URL,我大致在某个时间点创建了它们,并且可以调整为从资产播放……

    https://github.com/vivdub/AndroidMediaplayer

        3
  •  0
  •   Hamid Zandi    10 年前

    在res目录中创建原始文件夹并将声音文件放在那里

    现在。。。使用这样的播放媒体

    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;
        }
    }