MediaPlayer не воспроизводит звук должным образом - PullRequest
3 голосов
/ 31 декабря 2010

Я пытаюсь воспроизвести аудио в фоновом режиме из WebView.Это аудио дается по URL.Я подошел к этому, переопределив загрузку URL.И он начинает воспроизводить аудио, но много раз Media Player просто останавливается.Это происходит примерно в 30% случаев, и эти аудиофайлы никогда не превышают 30 секунд.

Я пробовал с MP3, OGG и WAV, и это происходит с любым из них.

Я такжепопытался сначала загрузить файл, а затем воспроизвести его вместо потоковой передачи, но тоже не работает.

Это фрагмент кода ..., чтобы показать вам, как он работает:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.endsWith(".ogg")){
        AudioLoader audioLoader = new AudioLoader(url);
        audioLoader.start();
        return true;
    }
    else if (url.endsWith(".wav")){
        Uri tempPath = Uri.parse(url);
        MediaPlayer player = MediaPlayer.create(interfazWeb, tempPath);
        if (player != null){
            player.start();
        } else {
            Log.e(TAG, "No se puede abrir el audio:" + url);
        }
        return true;
    }
    else if (url.endsWith(".mp3")){
        AudioLoader audioLoader = new AudioLoader(url);
        audioLoader.start();
        return true;
    }else{
        return super.shouldOverrideUrlLoading(view, url);
    }
}

Я проверил аудиофайл, сохраненный "AudioLoader", и он полностью в порядке.И случай WAV использует мою первую попытку, воспроизведите его с потоковой передачей.

Также попробовал SoundPool и AsyncPlayer ... ничего не работает !!

Так что ... пока я не думаюэто проблема связи, кодека или буфера.Мои единственные советы - эти записи в журнале, которые повторяются каждый раз, когда возникает проблема, со всеми форматами и всеми подходами:

12-31 09:41:49.284: WARN/AudioFlinger(59): write blocked for 160 msecs, 20 delayed writes, thread 0xd7a8
12-31 09:41:49.554: WARN/TimedEventQueue(59): Event 6 was not found in the queue, already cancelled?

Кто-нибудь, пожалуйста, есть некоторую подсказку?Или я просто сталкиваюсь с ошибкой / ошибкой.

Счастливого 2011 года, особенно если вы можете мне помочь: P

С уважением, Мануэль.

1 Ответ

3 голосов
/ 31 декабря 2010

Вы создаете объекты audioLoader и / или MediaPlayer локальным способом (эти объекты являются локальными для функции shouldOverrideUrlLoading).Таким образом, после выхода из функции сборщик мусора попытается собрать все объекты, на которые нет ссылок, он уничтожит ваши объекты, а затем звук остановится.

Попробуйте объявить объекты AudioLoader и MediaPlayer глобальными объектами:

private AudioLoader audioLoader; 
private MediaPlayer player; 
public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".ogg")){
            audioLoader = new AudioLoader(url);
            audioLoader.start();
            return true;
        }
        else if (url.endsWith(".wav")){
            Uri tempPath = Uri.parse(url);
            player = MediaPlayer.create(interfazWeb, tempPath);
            if (player != null){
                player.start();
            } else {
                Log.e(TAG, "No se puede abrir el audio:" + url);
            }
            return true;
        }
        else if (url.endsWith(".mp3")){
            audioLoader = new AudioLoader(url);
            audioLoader.start();
            return true;
        }else{
            return super.shouldOverrideUrlLoading(view, url);
        } 
}
...