【问题标题】:Android's Media Player: Why is an audio loop not staying synced with metronome playing at the same BPM?Android 的媒体播放器:为什么音频循环不能与以相同 BPM 播放的节拍器保持同步?
【发布时间】:2017-01-30 18:06:05
【问题描述】:

我正在使用 Android 的 MediaPlayer 循环播放音频文件。我将媒体播放器设置为循环播放

mMediaPlayer.setLooping(true);

多次重复后,循环开始的时间比它应该做的早,但是在几个循环之后,应用程序播放的循环开始得太早了。

我读过其他人抱怨这个问题。

我在 Android 4.4 和 Android 6 上都重现了这个问题

这是一个用于重现问题的最小 Android 项目: https://drive.google.com/open?id=0B9FRLIzBQgR1WWdMU29ZcHdsMXc

【问题讨论】:

    标签: android audio android-mediaplayer


    【解决方案1】:

    在我的项目中,我遇到了同样的问题,我在某处找到了他的解决方案,我不记得确切的位置。但在这里我做了什么:

    您可以尝试使用处理程序将搜索设置为在文件结束前 x 毫秒开始

    loopTimer = new Timer();
    loopTask = new TimerTask() {               
        @Override public void run() {
            mMediaPlayer.seekTo(0);
        }
    };
    long waitingTime = mMediaPlayer.getDuration()-mLoopingPreview;
    loopTimer.schedule(loopTask, waitingTime, waitingTime);
    

    现在只需将mLoopingPreview 设置为某个合理的时间值。我正在使用 80 毫秒。

    【讨论】:

    • 感谢您的回答。它稍微改善了一些情况,但在重复文件之前似乎仍然有轻微的淡出。你也注意到了吗?任何解决方法?
    • 尝试将 mLoopingTime 增加到更高的值,例如 110 @matdev
    • 或尝试减少它。什么都适合你。
    • @matdev 你能改进它吗?因为我认为你的音乐文件的开始或结束应该有更多的延迟。
    • 事实上我已经意识到循环播放的时间比它应该做的要早(见更新的问题)。按照您的建议缩短循环无济于事
    【解决方案2】:

    我也遇到过这个问题...在Mediaplayer

    有几个解决方案:

    1.使用ogg格式的声音文件(https://en.wikipedia.org/wiki/.ogg)

    2.可以使用 soundpool,它有一个循环和缓存设施来播放媒体 (https://developer.android.com/reference/android/media/SoundPool.html)

    3.您也可以使用以下类:它会在第一个媒体播放器完成后立即初始化一个新的媒体播放器..因此延迟不太明显

        public class LoopMediaPlayer {
    
        public static final String TAG = LoopMediaPlayer.class.getSimpleName();
    
        private Context mContext = null;
        private int mResId = 0;
        private int mCounter = 1;
    
        private MediaPlayer mCurrentPlayer = null;
        private MediaPlayer mNextPlayer = null;
    
        public static LoopMediaPlayer create(Context context, int resId) {
            return new LoopMediaPlayer(context, resId);
        }
    
        private LoopMediaPlayer(Context context, int resId) {
            mContext = context;
            mResId = resId;
    
            mCurrentPlayer = MediaPlayer.create(mContext, mResId);
            mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mCurrentPlayer.start();
                }
            });
    
            createNextMediaPlayer();
        }
    
        private void createNextMediaPlayer() {
            mNextPlayer = MediaPlayer.create(mContext, mResId);
            mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
            mCurrentPlayer.setOnCompletionListener(onCompletionListener);
        }
    
        private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.release();
                mCurrentPlayer = mNextPlayer;
    
                createNextMediaPlayer();
    
                Log.d(TAG, String.format("Loop #%d", ++mCounter));
            }
        };
    }
    

    使用它只需调用

    LoopMediaPlayer.create(context, R.raw.sound_file_name);
    

    而不是mp.setLooping(true);

    【讨论】:

    • 1.use ogg format sound file。我们不应该限制用户在我们的应用中使用这种特定格式。
    • 如果声音文件位于应用程序的原始文件夹中...最好使用 ogg 而不是 mp3 进行无缝声音循环...我的意思是
    • 是的,这是真的。同意
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多