我正在尝试从WebView播放背景音频。此音频由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
问候,曼努埃尔。
答案 0 :(得分: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);
}
}