Not able to achieve Gapless audio looping so far on Android

后端 未结 9 1905
走了就别回头了
走了就别回头了 2020-11-28 06:05

I have tried almost every method but I\'ve failed to achieve gapless audio playback between looping a single track with a duration of 10-15 seconds.

Steps I\'ve trie

9条回答
  •  醉话见心
    2020-11-28 06:53

    CODE-REad's LoopMediaPlayer example is great, but if you use the new MediaPlayer() method of creating the MediaPlayer (like I do for using File or AssetFileDescriptor datasources) rather than the MediaPlayer.Create() method then you must be careful to

    1. Call the setOnCompletionListener method AFTER .start() or it will not fire.
    2. Fully .prepare() or .prepareAsync() the mNextPlayer before calling .setNextMediaPlayer on the mCurrentPlayer or it will fail to play the mNextPlayer. This means calling .start, setOnCompletionListener, and .setNextMediaPlayer in the onPreparedListener as shown below.

    I have modified his code to use the new MediaPlayer() method to create the player and also added the ability to set datasource from AssetFileDescriptor and a File. I hope this saves someone some time.

    public class LoopMediaPlayer {
    
        private static final String TAG = LoopMediaPlayer.class.getSimpleName();
    
        private Context mContext = null;
        private int mResId   = 0;
        private int mCounter = 1;
        private AssetFileDescriptor mAfd = null;
        private File mFile = null;
    
        private MediaPlayer mCurrentPlayer = null;
        private MediaPlayer mNextPlayer    = null;
    
        public static LoopMediaPlayer create(Context context, int resId) {
            return new LoopMediaPlayer(context, resId);
        }
    
        public LoopMediaPlayer(Context context, File file){
            mContext = context;
            mFile = file;
    
            try {
                mCurrentPlayer = new MediaPlayer();
                mCurrentPlayer.setLooping(false);
                mCurrentPlayer.setDataSource(file.getAbsolutePath());
                mCurrentPlayer.prepareAsync();
                mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mCurrentPlayer.start();
                        mCurrentPlayer.setOnCompletionListener(onCompletionListener);
                        createNextMediaPlayer();
                    }
                });
            } catch (Exception e) {
                Log.e("media", e.getLocalizedMessage());
            }
        }
    
        public LoopMediaPlayer(Context context, AssetFileDescriptor afd){
            mAfd =  afd;
            mContext = context;
    
            try {
                mCurrentPlayer = new MediaPlayer();
                mCurrentPlayer.setLooping(false);
                mCurrentPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                mCurrentPlayer.prepareAsync();
                mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mCurrentPlayer.start();
                        mCurrentPlayer.setOnCompletionListener(onCompletionListener);
                        createNextMediaPlayer();
                    }
                });
    
            } catch (Exception e) {
                Log.e("media", e.getLocalizedMessage());
            }
        }
    
        private LoopMediaPlayer(Context context, int resId) {
            mContext = context;
            mResId   = resId;
    
            mCurrentPlayer = MediaPlayer.create(mContext, mResId);
            mCurrentPlayer.setLooping(false);
            mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mCurrentPlayer.start();
                    mCurrentPlayer.setOnCompletionListener(onCompletionListener);
                    createNextMediaPlayer();
                }
            });
            mCurrentPlayer.prepareAsync();
        }
    
        private void createNextMediaPlayer() {
            try{
                if(mAfd != null){
                    mNextPlayer = new MediaPlayer();
                    mNextPlayer.setDataSource(mAfd.getFileDescriptor(), mAfd.getStartOffset(), mAfd.getLength());
                    mNextPlayer.prepareAsync();
                    mNextPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
                        }
                    });
                }
                else if(mFile!=null){
                    mNextPlayer = new MediaPlayer();
                    mNextPlayer.setDataSource(mFile.getAbsolutePath());
                    mNextPlayer.prepareAsync();
                    mNextPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
                        }
                    });
                }
                else {
                    mNextPlayer = MediaPlayer.create(mContext, mResId);
                    mNextPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
                        }
                    });
                }
            } catch (Exception e) {
    
            }
        }
    
        private final MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.release();
                mCurrentPlayer = mNextPlayer;
                mCurrentPlayer.setOnCompletionListener(onCompletionListener);
                createNextMediaPlayer();
                Log.d("LoopMediaPlayer", String.format("Loop #%d", ++mCounter));
            }
        };
        // code-read additions:
        public boolean isPlaying() throws IllegalStateException {
            return mCurrentPlayer.isPlaying();
        }
    
        public void setVolume(float leftVolume, float rightVolume) {
            mCurrentPlayer.setVolume(leftVolume, rightVolume);
        }
    
        public void start() throws IllegalStateException {
            mCurrentPlayer.start();
        }
    
        public void stop() throws IllegalStateException {
            mCurrentPlayer.stop();
        }
    
        public void pause() throws IllegalStateException {
            mCurrentPlayer.pause();
        }
    
        public void release() {
            mCurrentPlayer.release();
            mNextPlayer.release();
        }
    
        public void reset() {
            mCurrentPlayer.reset();
        }
    }
    

提交回复
热议问题