Подтвердить что ты не робот

Android - Как сказать, когда MediaPlayer является буферизацией

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

4b9b3361

Ответ 1

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

Что-то вроде DetectBufferTimeout.java (непроверенный) будет делать красиво.

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

Ответ 2

Как ниже (уровень 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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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