斜面能够实现无缝音频循环,直到日期在Android [英] Cant able to achieve Gapless audio looping till date on Android

查看:145
本文介绍了斜面能够实现无缝音频循环,直到日期在Android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经试过几乎所有的方法,但我没能实现循环单轨10-15秒的持续时间之间的无缝音频播放。

我试过

步骤和失败的:

  1. 不同格式的音频文件 MP3播放 的.wav .OGG 使用 setLooping(真)

      MediaPlayer的MP1 = MediaPlayer.create(MainActivity.this,R.raw.track1);
    mp1.setLooping(真正的);
    mp1.start();
     

  2. 创建了两个mediaplayers,另一条使用后循环1 setOnCompletionListener 无间隙同样无法循环。

  3. 使用 setNextMediaPlayer(nextmp)部分如何工作的,但只有两个循环是可能的。我们必须prepare和完成previous两个循环后再次启动。

      mp1.start();
    mp1.setNextMediaPlayer(MP2);
     

  4. 更新: 的@Jeff米克森的回答结果: <一href="http://stackoverflow.com/questions/29753960/mediaplayer-looping-stops-with-an-error-android">Mediaplayer循环停止,一个错误的Andr​​oid 。 杰夫米克森工作正常,但仅用于后10或20的循环,由于一些垃圾收集发出Mediaplayers停止紧接离开原木如下面贴。真的有种,我困在这里形成2年。先谢谢了。

      E / MediaPlayer的(24311):错误(1,-38)
    E / MediaPlayer的(23256):错误(1,-1007)
    E / MediaPlayer的(23546):错误(1,-2147483648)
     

解决方案

从测试,我都做了,该解决方案能正常工作,超过150圈与13秒160 kbps的MP3没有任何问题:

 公共类LoopMediaPlayer {

    公共静态最终字符串变量= LoopMediaPlayer.class.getSimpleName();

    民营背景mContext = NULL;
    私人诠释mResId = 0;
    私人诠释mCounter = 1;

    私人MediaPlayer的mCurrentPlayer = NULL;
    私人MediaPlayer的mNextPlayer = NULL;

    公共静态LoopMediaPlayer创建(上下文的背景下,诠释渣油){
        返回新LoopMediaPlayer(背景下,渣油);
    }

    私人LoopMediaPlayer(上下文的背景下,INT渣油){
        mContext =背景;
        mResId =渣油;

        mCurrentPlayer = MediaPlayer.create(mContext,mResId);
        mCurrentPlayer.setOn preparedListener(新MediaPlayer.On preparedListener(){
            @覆盖
            在prepared公共无效(MediaPlayer的媒体播放器){
                mCurrentPlayer.start();
            }
        });

        createNextMediaPlayer();
    }

    私人无效createNextMediaPlayer(){
        mNextPlayer = MediaPlayer.create(mContext,mResId);
        mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
        mCurrentPlayer.setOnCompletionListener(onCompletionListener);
    }

    私人MediaPlayer.OnCompletionListener onCompletionListener =新MediaPlayer.OnCompletionListener(){
        @覆盖
        公共无效onCompletion(MediaPlayer的媒体播放器){
            mediaPlayer.release();
            mCurrentPlayer = mNextPlayer;

            createNextMediaPlayer();

            Log.d(TAG,的String.Format(河套#%D,++ mCounter));
        }
    };
}
 

要使用 LoopMediaPlayer 您只需拨打:

  LoopMediaPlayer.create(背景下,R.raw.sample);
 

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

Steps I've tried and failed :

  1. Different audio file formats .mp3 .wav .ogg using setLooping(true):

    MediaPlayer mp1 = MediaPlayer.create(MainActivity.this, R.raw.track1);
    mp1.setLooping(true);
    mp1.start();
    

  2. Creating two mediaplayers and looping one after another using setOnCompletionListenersame failed to loop without gaps.

  3. Using setNextMediaPlayer(nextmp) some how it works but only two loops is possible. We have to prepare and start again after the completion of previous two loops.

    mp1.start();
    mp1.setNextMediaPlayer(mp2);
    

  4. Update: Result of @Jeff Mixon answer: Mediaplayer looping stops with an error Android. Jeff Mixon works fine but only for 10 or 20 loops after that, due to some garbage collection issue the Mediaplayers stops immediately leaving the logs as posted below. I'm really kind of stuck here form 2 years. Thanks in advance.

    E/MediaPlayer(24311): error (1, -38)
    E/MediaPlayer(23256): Error(1,-1007)
    E/MediaPlayer(23546): Error (1,-2147483648)
    

解决方案

From the test that I have done, this solution works fine, over 150 loops with a 13 seconds 160 kbps MP3 without any problem:

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

To use LoopMediaPlayer you can just call:

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

这篇关于斜面能够实现无缝音频循环,直到日期在Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆