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

Wai*_*ino 6 android android-webview html5-video cordova cordova-3

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

只需将视频标记添加到html中,即可开箱即用.在HTC One mini(Android 4.3)上,这个解决方案没有问题.在三星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
Run Code Online (Sandbox Code Playgroud)

即使在播放停止,视频标签被移除并且用户退出(暂停)应用程序之后,此缓冲也会继续.暂停应用程序不会停止缓冲,但杀死应用程序会.当缓冲达到100%时,缓冲甚至不会停止,而是显然无限期地继续缓冲.后台没有播放声音,但互联网连接保持打开状态,电池电量耗尽,设备升温.这对我们来说是一个showstopper bug,因为我们不愿意发布导致过热的应用程序.

三星Galaxy S3上的beta测试人员也报告了类似于检测到的问题的症状.问题可能仅限于三星,因为它不会出现在HTC设备上.

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

我尝试了以下内容,没有成功:

  • 完成观看后,我已完全从DOM中删除了视频标签.
  • 我已经使用javascript通过在删除之前调用视频元素上的pause()来停止播放.
  • 关注 HTML5视频:强制中止缓冲 我尝试使用javscript清除视频标记内的src网址,然后在视频标记上调用load().
  • 根据对上述问题的评论,我尝试将视频标记放在iframe中,iframe在完成观看时会从DOM中删除.
  • 我尝试过结合以上所有内容.
  • 我已经尝试将视频标记放在一个单独的页面上,该页面将被导航.这与其他方面使用的单页与js模型不同.
  • 我尝试通过oEmbed使用Vimeo播放器,而不是直接使用html5视频标签.

这耗尽了我能够找到的平台独立技巧.有一些基于原生Android代码的方法

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

一个潜在的解决方法是在应用程序暂停时终止它.这很难看,不符合Android指南.实现这一目标的最简单方法是什么?

ADD*_*uid 1

在类似的事情上苦苦挣扎了一天多之后,我发现您可以通过将 a 发送到带有 HTML5 视频标签且视频网址错误的页面来使 aMediaPlayer内部崩溃。下面的示例是具有有效视频标签的主要活动。如果您按播放键,将会接管并开始永远运行...但是当您单击返回或主页并离开应用程序时, 会被触发,并且会被重定向到带有错误视频网址的页面并被告知自动播放。尝试玩游戏会崩溃,瞧!这WebViewWebViewMediaPlayeronPause()WebViewMediaPlayerMediaPlayer没有了。

\n\n
package com.test.webviewtest;\n\nimport android.app.Activity;\nimport android.graphics.Bitmap;\nimport android.os.Bundle;\nimport android.webkit.WebChromeClient;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\n\npublic class MainActivity extends Activity {\n    WebView webView;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        webView = new WebView(this);\n        webView.setWebChromeClient(new WebChromeClient());\n        webView.setWebViewClient(new WebViewClient());\n        String html = "<video width=\\"320\\" height=\\"240\\" controls>" +\n                "<source src=\\"http://www.w3schools.com/html/movie.mp4\\" " +\n                "type=\\"video/mp4\\"></video>";\n        webView.loadData(html, "text/html", null);\n        setContentView(webView);\n    }\n\n    @Override\n    protected void onPause(){\n        super.onPause();\n        // attempt to kill the MediaPlayer here...\n        webView.getSettings().setJavaScriptEnabled(true);\n        webView.setWebViewClient(new WebViewClient(){\n            @Override\n            public void onPageStarted(WebView view, String url, Bitmap favicon){\n                String js = "javascript:document.getElementsByTagName(\'video\')[0].play();";\n                webView.loadUrl(js);\n            }\n        });\n        String html = "<video width=\\"320\\" height=\\"240\\" controls>" +\n                "<source src=\\"http://www.w3schools.com/html/" +\n                "NOT_A_MOVIE.mp4" +\n                "\\" type=\\"video/mp4\\"></video>";\n        webView.loadData(html, "text/html", null);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意日志:

\n\n
02-26 13:19:13.010    220-25370/? V/MediaPlayerService\xef\xb9\x95 [607] notify (0x43a3aeb8, 100, 1, -1004)\n02-26 13:19:13.010  25262-25274/com.test.webviewtest V/MediaPlayer\xef\xb9\x95 message received msg=100, ext1=1, ext2=-1004\n02-26 13:19:13.010  25262-25274/com.test.webviewtest E/MediaPlayer\xef\xb9\x95 error (1, -1004)\n02-26 13:19:13.010  25262-25274/com.test.webviewtest V/MediaPlayer\xef\xb9\x95 callback application\n02-26 13:19:13.020  25262-25274/com.test.webviewtest V/MediaPlayer\xef\xb9\x95 back from callback\n02-26 13:19:13.020  25262-25262/com.test.webviewtest E/MediaPlayer\xef\xb9\x95 Error (1,-1004)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后幸福的沉默就消失了MediaPlayer木头……

\n\n

请参阅Android WebView HTML5 Video Spawns MediaPlayer,该播放器永远存在于 Samsung S4 上 [已发现黑客答案]

\n