Android - Как определить время буферизации MediaPlayer - PullRequest
34 голосов
/ 17 декабря 2010

Мне здесь не хватает чего-то очевидного, но я не могу найти ничего, что позволило бы мне определить, когда MediaPlayer буферизует звук.Я транслирую интернет-аудио и хочу отобразить индикатор буферизации, но ничего из того, что я пробовал, не позволяет мне знать, когда MediaPlayer прерывает аудио в буфер, поэтому я не могу правильно отобразить индикатор буферизации.Любые подсказки?

Ответы [ 5 ]

55 голосов
/ 11 апреля 2013

Как показано ниже (уровень API ≥ 9):

mp.setOnInfoListener(new OnInfoListener() {

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                loadingDialog.setVisibility(View.VISIBLE);
                break;
            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                loadingDialog.setVisibility(View.GONE);
                break;
        }
        return false;
    }
});

ПРИМЕЧАНИЕ. В Android есть известная ошибка. При воспроизведении потока HLS он просто никогда не вызывает OnInfoListener или OnBuffering. проверить эту ссылку Ошибка OnInfoListener

10 голосов
/ 17 декабря 2010

Хорошо, я чувствую себя немного оправданным. Я проверил приложение Pandora, и оно не отображает индикатор буферизации. Когда музыка прерывается для буферизации, она просто сидит там, как будто ничего не произошло, и пользовательский интерфейс выглядит так, как будто он все еще играет. Поэтому я пришел к выводу, что если вы используете MediaPlayer, просто невозможно определить, временно ли дорожка приостановлена ​​для буферизации.

Однако я заметил, что есть пара констант MediaPlayer, которые могут быть полезны: MEDIA_INFO_BUFFERING_START и MEDIA_INFO_BUFFERING_END. Но они доступны только в API уровня 9+, и документы ничего не говорят о них. Я предполагаю, что они могут быть использованы с OnInfoListener.

Я разочарован, но, по крайней мере, теперь я могу перестать крутить колеса и перейти к чему-то еще.

7 голосов
/ 12 апреля 2011

@ Даниэль, согласно вашему комментарию к ответу @ JRL, вы, вероятно, могли бы заставить это работать, раскручивая поток и ожидая таймаута.

Что-то вроде DetectBufferTimeout.java (не проверено) будет хорошо работать.

Я, однако, согласен, что раскрутка этого отдельного потока - это что-то вроде хака. Возможно, OnBufferingUpdateListener может дать гарантию относительно того, как часто он вызывает onBufferingUpdate() независимо от того, произошло ли изменение в процессе буферизации, поэтому мы можем определить, получаем ли мы одно и то же значение снова и снова.

1 голос
/ 17 декабря 2010

Зарегистрируйте OnBufferingUpdate слушатель.

0 голосов
/ 10 января 2014

Вы можете использовать поток, который проверяет текущую позицию MediaPlayer.Если позиция не меняется, вы можете сделать вывод, что носитель находится в состоянии буферизации.Вот полное руководство, которое я написал: http://www.ottodroid.net/?p=260

...