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

我正在用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

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

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

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

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

  • 完成观看后,我已从DOM完全删除了视频标签。
  • 我已经使用JavaScript通过在移除视频元素前调用暂停()来停止播放。
  • 遵循HTML5视频:强制中止缓冲我尝试使用javscript清除视频标记内的src url,然后在视频标记上调用load()。
  • 基于对上述问题的评论,我试图将视频标签放在iframe中,当完成观看时,该iframe从DOM中移除。
  • 我已尝试将以上所有内容结合起来。
  • 我曾尝试将视频标记放在一个单独的页面上,这是从远处导航的。 这与另外使用的单页面与js模型不同。
  • 我曾尝试通过oEmbed使用Vimeo播放器,而不是直接使用html5视频标签。
  • 这耗尽了我所能找到的平台独立技巧。 有一些基于原生Android代码的方法

  • 停止在WebView中由网页自动启动的Android MediaPlayer提供了一个潜在的解决方案,但根据问题作者的评论,接受的解决方案仅停止播放音频,但不会终止MediaPlayer。
  • Android WebView播放HTML5 / h.264 / mp4视频,如何获取MediaPlayer似乎是一个类似的问题,但是使用自定义webview而不是cordova。 我不知道如何尝试将此应用于科尔多瓦。
  • 我正在寻找解决这个问题的方法,让视频播放时不会造成过热。 这应该是其他人需要解决的问题,所以希望有一个解决问题的cordova插件。 有这样一个插件吗? 如果没有,上面提到的两种Android原生方法中的任何一种都可以在cordova中实现,他们是否可以解决问题?

    潜在的解决方法是在应用暂停时终止该应用。 这是丑陋的,不符合Android指南。 实现这一目标最不丑陋的方式是什么?


    在类似的事情上挣扎了一天之后,我发现您可以通过将WebView发送到带有视频网址不佳的HTML5视频标签的页面来让MediaPlayerWebView内部崩溃。 下面的例子是一个有效的视频标签的主要活动。 如果按下播放, 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视频Spawns MediaPlayer,它永远在三星S4上生存[发现被黑黑的答案]以获得更多讨论。

    链接地址: http://www.djcxy.com/p/64353.html

    上一篇: Stop endless buffering of html5 video in cordova webview on Samsung devices

    下一篇: IISExpress HTML5 Video IOS