MediaPlayer无法正常播放音频

3
我正在尝试从WebView中播放一个音频,这个音频是由一个URL提供的。我通过重载url加载来实现这一点。它开始播放音频,但很多时候媒体播放器就会停止。这种情况大约发生在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
你正在以本地方式创建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);
        } 
}

嗯,听起来很有趣,我会在周一尝试一下。谢谢耶稣! - mdelolmo
这是我到这里后尝试的第一件事......20分钟前,到目前为止它似乎完美地运行!谢谢。 - mdelolmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接