MediaPlayer 在 HLS 流结束时在 Android 上生成 "can't play this video" 错误
MediaPlayer generates "can't play this video" error on Android at the end of an HLS streaming
读者注意:此问题仅针对代号一,请不要post回答与Android工作室相关的问题。
这个问题在这里已经有了答案:
但是这个答案不适用于我的代码,因为我无法下载直播,我只能在开始 MediaPlayer
.
之前检查它是否存在
在流式传输结束时,由以下代码中使用的 MediaManager
“完成处理程序”检测到,Android 生成烦人的对话框“无法播放此视频”。它不会一直发生,但经常发生。我的问题是如何避免弹出消息。我知道存在防止显示该错误的 hack,但它涉及本机代码:
我的代码(已经post问题CN.setScreenSaverEnabled(false); and MediaPlayer),注意videoUrl
是一个HLS直播:
private void playVideo(Form parent, String videoUrl) {
CN.setScreenSaverEnabled(false);
Form player = new Form(new BorderLayout());
player.getToolbar().setBackCommand("Back", Toolbar.BackCommandPolicy.ALWAYS, e -> {
if (mp != null) {
mp.getMedia().cleanup();
}
CN.setScreenSaverEnabled(true);
parent.showBack();
});
player.add(BorderLayout.CENTER, FlowLayout.encloseCenterMiddle(
new SpanLabel("Stream will start playing automatically when it is live")));
player.addShowListener(l -> {
while (!Util.downloadUrlToStorage(videoUrl, "temp.m3u8", false)) {
CN.invokeAndBlock(() -> Util.sleep(1000));
}
try {
// note that we cannot play the locally downloaded m3u8
Media video = MediaManager.createMedia(videoUrl, true, () -> {
// completion handler, it's invoked when the stream connection is lost
if (mp != null) {
mp.getMedia().cleanup();
}
CN.setScreenSaverEnabled(true);
parent.showBack();
});
video.setNativePlayerMode(false);
if (mp != null) {
mp.getMedia().cleanup();
}
mp = new MediaPlayer(video);
mp.setAutoplay(true);
mp.setHideNativeVideoControls(true);
mp.setMaximize(false);
player.removeAll();
player.add(BorderLayout.CENTER, mp);
player.revalidate();
} catch (Exception err) {
Log.e(err);
ToastBar.showErrorMessage("Error loading straming");
}
});
player.show();
}
我们也将针对此事件处理程序将我们的本机实现更改为 return true,因此我们也将获取该事件。我想不出用户会想要在此处查看本机 android 对话框以进行媒体播放的情况。
读者注意:此问题仅针对代号一,请不要post回答与Android工作室相关的问题。
这个问题在这里已经有了答案:
MediaPlayer
.
在流式传输结束时,由以下代码中使用的 MediaManager
“完成处理程序”检测到,Android 生成烦人的对话框“无法播放此视频”。它不会一直发生,但经常发生。我的问题是如何避免弹出消息。我知道存在防止显示该错误的 hack,但它涉及本机代码:
我的代码(已经post问题CN.setScreenSaverEnabled(false); and MediaPlayer),注意videoUrl
是一个HLS直播:
private void playVideo(Form parent, String videoUrl) {
CN.setScreenSaverEnabled(false);
Form player = new Form(new BorderLayout());
player.getToolbar().setBackCommand("Back", Toolbar.BackCommandPolicy.ALWAYS, e -> {
if (mp != null) {
mp.getMedia().cleanup();
}
CN.setScreenSaverEnabled(true);
parent.showBack();
});
player.add(BorderLayout.CENTER, FlowLayout.encloseCenterMiddle(
new SpanLabel("Stream will start playing automatically when it is live")));
player.addShowListener(l -> {
while (!Util.downloadUrlToStorage(videoUrl, "temp.m3u8", false)) {
CN.invokeAndBlock(() -> Util.sleep(1000));
}
try {
// note that we cannot play the locally downloaded m3u8
Media video = MediaManager.createMedia(videoUrl, true, () -> {
// completion handler, it's invoked when the stream connection is lost
if (mp != null) {
mp.getMedia().cleanup();
}
CN.setScreenSaverEnabled(true);
parent.showBack();
});
video.setNativePlayerMode(false);
if (mp != null) {
mp.getMedia().cleanup();
}
mp = new MediaPlayer(video);
mp.setAutoplay(true);
mp.setHideNativeVideoControls(true);
mp.setMaximize(false);
player.removeAll();
player.add(BorderLayout.CENTER, mp);
player.revalidate();
} catch (Exception err) {
Log.e(err);
ToastBar.showErrorMessage("Error loading straming");
}
});
player.show();
}
我们也将针对此事件处理程序将我们的本机实现更改为 return true,因此我们也将获取该事件。我想不出用户会想要在此处查看本机 android 对话框以进行媒体播放的情况。