gpt4 book ai didi

android - 停止在三星设备上的 cordova webview 中无限缓冲 html5 视频

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:38:49 29 4
gpt4 key购买 nike

我正在使用 Cordova (PhoneGap 3.0.0-0.14.4) 构建跨平台移动应用程序,Android 是目标平台之一。该应用程序的一个(主要但不仅是)功能是播放视频。我选择了 html5 <video>标记作为实现视频播放器的首选方法。这些视频托管在 Vimeo 上。该应用程序作为单个 html 文档实现,其中导航是通过使用 javascript 更改内容来实现的。

我使用的视频标签是这样的:

<video autoplay controls id="videotag">
<source id="videosrc" src="http://player.vimeo.com/external/..."/>
Din apparat stöder inte denna video.
</video>

只需将视频标签添加到 html 中,即可开箱即用地播放视频。在 HTC One mini (Android 4.3) 上,这个解决方案没有问题。在 Samsung Galaxy S4 mini (Android 4.2.2) 上,视频也可以播放,但会出现另一个问题:视频由 MediaPlayer 组件缓冲,并且这种缓冲永远不会停止。日志由以下消息填充,无限重复:

01-25 13:45:36.698: V/MediaPlayer(2814): message received msg=3, ext1=34, ext2=0
01-25 13:45:36.698: V/MediaPlayer(2814): buffering 34
01-25 13:45:36.698: V/MediaPlayer(2814): callback application
01-25 13:45:36.698: V/MediaPlayer(2814): back from callback

即使在播放停止、video 标签被删除以及用户退出(暂停)应用程序后,此缓冲仍会继续。暂停应用程序不会停止缓冲,但会终止应用程序。缓冲甚至在达到 100% 时都不会停止,而是显然无限期地继续。后台没有播放声音,但互联网连接保持打开状态,电池耗尽并且设备发热。这对我们来说是个大问题,因为我们不愿意发布会导致过热的应用。

三星 Galaxy S3 的测试版测试人员也报告了与检测到的问题类似的症状。该问题可能仅限于三星,因为它不会发生在 HTC 设备上。

即使不再需要视频,MediaPlayer 组件似乎也没有收到停止缓冲的消息。

我尝试了以下方法,但没有成功:

  • 看完后,我已经从 DOM 中完全删除了视频标签。
  • 我使用 javascript 通过调用 pause() 来停止播放删除前的视频元素。
  • 正在关注 HTML5 Video: Force abort of buffering我尝试使用 javscript 清除视频标签内的 src url,然后在视频标签上调用 load()。
  • 根据对上述问题的评论,我尝试将视频标签放在 iframe 中,完成后从 DOM 中删除看着。
  • 我已经尝试结合以上所有内容。
  • 我试过将视频标签放在一个单独的页面上,该页面被导航离开。这与 single-page-with-js 背道而驰否则使用模型。
  • 我尝试通过 oEmbed 使用 Vimeo 播放器,而不是直接使用 html5 视频标签。

这用尽了我能够找到的与平台无关的技巧。有一些基于原生Android代码的方法

我正在寻找任何解决问题的方法,以允许播放视频而不会导致过热。这应该是其他人需要解决的问题,所以希望有一个 cordova 插件已经解决了这个问题。有这样的插件吗?如果没有,上面提到的两种 Android 原生方法中的任何一种是否可以在 cordova 中实现,它们是否可以解决问题?

一个潜在的解决方法是在应用程序暂停时将其终止。这很丑陋,而且不符合 Android 指南。实现这一目标的最不丑陋的方法是什么?

最佳答案

在类似的事情上苦苦挣扎了一天之后,我发现您可以通过发送 WebView 使 WebView 中的 MediaPlayer 崩溃到带有错误视频 URL 的 HTML5 视频标签的页面。下面的示例是具有有效视频标签的主要 Activity 。如果您按下播放键,MediaPlayer 将接管并开始永远运行...但是当您单击返回或主页并离开应用程序时,onPause() 将被触发并WebView 被重定向到视频网址错误的页面并被告知自动播放。尝试播放会使 MediaPlayer 崩溃,瞧! MediaPlayer 已不复存在。

package com.test.webviewtest;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {
WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = new WebView(this);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
String html = "<video width=\"320\" height=\"240\" controls>" +
"<source src=\"http://www.w3schools.com/html/movie.mp4\" " +
"type=\"video/mp4\"></video>";
webView.loadData(html, "text/html", null);
setContentView(webView);
}

@Override
protected void onPause(){
super.onPause();
// attempt to kill the MediaPlayer here...
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon){
String js = "javascript:document.getElementsByTagName('video')[0].play();";
webView.loadUrl(js);
}
});
String html = "<video width=\"320\" height=\"240\" controls>" +
"<source src=\"http://www.w3schools.com/html/" +
"NOT_A_MOVIE.mp4" +
"\" type=\"video/mp4\"></video>";
webView.loadData(html, "text/html", null);
}
}

注意日志:

02-26 13:19:13.010    220-25370/? V/MediaPlayerService﹕ [607] notify (0x43a3aeb8, 100, 1, -1004)
02-26 13:19:13.010 25262-25274/com.test.webviewtest V/MediaPlayer﹕ message received msg=100, ext1=1, ext2=-1004
02-26 13:19:13.010 25262-25274/com.test.webviewtest E/MediaPlayer﹕ error (1, -1004)
02-26 13:19:13.010 25262-25274/com.test.webviewtest V/MediaPlayer﹕ callback application
02-26 13:19:13.020 25262-25274/com.test.webviewtest V/MediaPlayer﹕ back from callback
02-26 13:19:13.020 25262-25262/com.test.webviewtest E/MediaPlayer﹕ Error (1,-1004)

然后是没有更多 MediaPlayer 日志的幸福沉默......

参见 Android WebView HTML5 Video Spawns MediaPlayer that lives forever on Samsung S4 [Hacked answer found]进行更多讨论。

关于android - 停止在三星设备上的 cordova webview 中无限缓冲 html5 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663897/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com