2013-03-20 4 views
3

Я пытаюсь многократно воспроизводить аудио непрерывно, без пробелов. Я пробовал,Gapless Воспроизведение с android MediaPlayer

mediaplayer.setLooping(true); 

Но это дает промежуток времени между повторами. И попробовал это,

mediaplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) 
    { 
     mediaplayer.start(); 
    } 
}); 

Это также дает пробел. Я пробовал с другим аудиоформатом. Но ни один способ не работал для меня. Есть ли другой способ в андроиде?

+0

Я думаю, что медиа-файл ur может содержать от 2 до 3 секунд ** без музыки ** в начале или в конце медиафайла. Так что у тебя такое ощущение, что есть пробел ... –

+0

Нет, сэр, я проверил его. Медиаплеер дает пробел, файл в порядке. – asish

ответ

0

Возможно, MediaPlayer переназначает данные с сервера (или даже самого устройства), это может занять несколько секунд. Только если буферизация завершена, она снова начинает воспроизводиться.
Если вы хотите обойти это, вы можете использовать AFAIK только второй MediaPlayer, который начинает буферизацию медиафайла незадолго до того, как первый перестанет играть. Затем вы можете запустить второй на OnCompletionListener.

7

Когда воспроизведение закончится, двигатель игрока проверяет, завершены ли все дорожки и как только они сделаны, он проверит флаг looping. На основании флага looping, seek до 0 секунд. Как часть поиска, движок проигрывателя будет считывать данные из определенной позиции и запускать воспроизведение.

Задержка может быть связано с seek реализации вместе с задержкой, введенной средыхранения, как sdcard отдельно от повторной инициализации всех дорожек и перезапустить их. Следовательно, к тому времени, когда игрок вернется в исходную позицию, есть определенная задержка.

Базовым зацикливание реализации можно найти в этой функции AwesomePlayer::onStreamDone, как показано здесь: http://androidxref.com/4.2.2_r1/xref/frameworks/av/media/libstagefright/AwesomePlayer.cpp#834

EDIT 1:

Для реализации истинного gapless playback, вы могли бы также рассмотреть возможность setNextMediaPlayer().