Android MediaPlayer готовится слишком долго - PullRequest
5 голосов
/ 15 ноября 2010

Эй, я использую MediaPlayer для воспроизведения обычного потока ShoutCast.Код понятен с prepareAsync () и обработчиком для запуска воспроизведения.Хотя он работает безупречно с некоторыми потоками, такими как DI.FM или ETN.FM (http://u10.di.fm:80/di_progressive), с другими (http://mp3.wpsu.org:8000/)), он не пройдет состояние готовности. Никаких других слушателей не вызывается.* Любые отзывы приветствуются!

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Я сталкиваюсь с проблемой, когда MP "зависает" при подготовке состояния слишком долго (поток), и я пытаюсь остановить его с помощью reset ().Это приводит к зависанию MP и, таким образом, все мое приложение зависает.Похоже, нет способа остановить депутата при подготовке государства.Я думаю об использовании prepare (), обернутого в нить, а не prepareAsync ().Тогда я смогу убить эту тему.На данный момент я сделал это следующим образом:

private void actionCancel(){
            try {
                mp.setDataSource(new String());
            } catch (Exception e) {
                e.printStackTrace();
                android.util.Log.d(TAG,"actionCancel(): mp.setDataSource() exception");
                mp.reset();
            }
}

и он работает 4me.
Кроме того, у меня есть следующий счетчик:

    @Override
    public void onBufferingUpdate(final MediaPlayer mp, final int percent) {

        if (!mp.isPlaying()){
//          android.util.Log.d(TAG,"onBufferingUpdate(): onBufferingUpdateCount = "+onBufferingUpdateCount);
            if (onBufferingUpdateCount>MAX_BUFFERING_UPDATES_AT_PREPARING_STATE)
                restartMP();
            onBufferingUpdateCount++;
            return;
        }
      }

я бы обнаружил, что этот слушатель всегдатриггеры при подготовке государства.Поэтому, если он срабатывает более 10 раз, а MP все еще не воспроизводится, я просто перезапускаю его:

private void restartMP(){
        if (mp!=null)
            if (mpState==MediaPlayerState.Preparing)
                actionCancel();
            else
                mp.reset();
    else
        mp = new MediaPlayer();
        mpState = MediaPlayerState.Idle;
        onBufferingUpdateCount=0;
        //isRequestCancelled=false;
        requestTrackInfoStartedAt=0;
        requestPlay();
}

note Примечание MediaPlayerState - это мое пользовательское перечисление со значением «Подготовка».Также mpState является свойством / полем класса, которое содержит текущее состояние MediaPlayerState.Перед запуском prepareAsync () я устанавливаю mpState в MediaPlayerState.Preparing после его завершения, устанавливая его в MediaPlayerState.Started или другое соответствующее значение.

2 голосов
/ 11 декабря 2010

Я думаю, что есть некоторые проблемы совместимости с серверной частью.Это довольно странно, поскольку в моем случае эмулятор справляется с этим нормально - просто не на моем Froyo Galaxy S, даже если это та же версия API.

Это может быть проблема с кодеком, проблема с потоковой передачей http, я понимаюне знаю.Но все серверы, которые выходят из строя, как правило, являются старыми, с «Copyright 1998 - 2004» внизу ... Не совсем недавними или современными, как вы могли бы подумать.

Один потенциальный обходной путь (которого у меня нетпопробовал еще) будет использовать StreamProxy , что также сделает ваш код совместимым с 2.1 и, возможно, более ранними версиями.Ценой дополнительной работы, дополнительного кода и, без сомнения, дополнительных ошибок ...

В случае, если вы не знаете об этом, есть еще один отчет об ошибках плеера для 2.2, который также может иметь значение: Базовое потоковое аудио работает в 2.1, но не в 2.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...