Android WebView Video播放.mp4视频失败 其他端正常---视频编码问题

Android通过WebView加载网页,网页中有Video标签去播放视频,代码不复杂,设置webview的一些属性之后loadUrl即可。

但是,昨天,我的WebView失效了,网页中的Video标签播放不出来了。


但是iOS和微信端是正常的,一下子血液上涌,我按照正常的逻辑想,一定是我WebView的设置哪里少了。


国内外网站,从百度一下到微软必应到google到stackoverflow走了一大圈,webview设置变成下面这样了:

getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
        bindingView.wvHealthGut.getSettings().setJavaScriptEnabled(true);
        bindingView.wvHealthGut.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        bindingView.wvHealthGut.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        bindingView.wvHealthGut.getSettings().setDomStorageEnabled(true);

        bindingView.wvHealthGut.resumeTimers();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            bindingView.wvHealthGut.getSettings().setMediaPlaybackRequiresUserGesture(true);
        }

        bindingView.wvHealthGut.getSettings().setPluginState(WebSettings.PluginState.ON);

        bindingView.wvHealthGut.getSettings().setSupportZoom(true);
        bindingView.wvHealthGut.getSettings().setBuiltInZoomControls(true);
        bindingView.wvHealthGut.getSettings().setUseWideViewPort(true);
        // 应用可以有缓存
        bindingView.wvHealthGut.getSettings().setAppCacheEnabled(true);

        bindingView.wvHealthGut.requestFocus();

        // 加载进度监听
        bindingView.wvHealthGut.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress == 100) {
                    showContentView();
                }
                super.onProgressChanged(view, newProgress);
            }

            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                CookieManager cookieManager = CookieManager.getInstance();
                String cookies = cookieManager.getCookie("");
                return super.onConsoleMessage(consoleMessage);
            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                AlertDialog.Builder b2 = new AlertDialog.Builder(getActivity())
                        .setTitle("提示").setMessage(message)
                        .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        });

                b2.setCancelable(false);
                b2.create();
                b2.show();
                return true;
            }

            @Override
            public void onShowCustomView(View view, CustomViewCallback callback) {
                super.onShowCustomView(view, callback);
            }

            @Override
            public void onHideCustomView() {
                super.onHideCustomView();
            }
        });

        setCookies();
        bindingView.wvHealthGut.loadUrl(thisTitle);


设置一大堆,然并卵,而且看这个设置代码头都大。

不过对webview的这一对属性倒是加深了不少印象。


再从Application、activity、到view的硬件加速全部打开

(不要跟老夫讲什么性能,根本不考虑,先调好再说。抄起键盘就是一把梭。梭哈梭哈)


。。。。还是加载失败。


突然我想到,去github找几个大神写的demo试试:

好多星星的大神地址

。。。。。。等好多demo。

(github搜索Android WebView Video就可以出来好多)


下载之后放入我们的链接,也一样播放不出来。


这时候脑子突然清醒,分析猜测:Android不支持这种格式的视频。

但是确实是.mp4格式的视频啊。


我找到了一个视频分析工具,将视频下载下来扔进去,

MdieInfo-----这是格式分析工具,windows的,百度一下你就可以拥有。

格式工厂----这是给视频转码的工具,windwos的,百度一下你就可以拥有。


视频格式扔进去分析结果如图:

Android WebView Video播放.mp4视频失败 其他端正常---视频编码问题_第1张图片


Android端支持的视频格式有:mp4/3gp/mov

使用H.264作为视频中视频流的编码格式才是正常。


通过格式工厂转完过后视频:

注:转成Android认识的H264格式。

Android WebView Video播放.mp4视频失败 其他端正常---视频编码问题_第2张图片


重新放回服务器,加载就好了,转完之后视频大小变大了50%左右。

说明原来的编码格式不是H264的,现在H265格式也出现了,但是好像使用率还是没有超过H264,稳妥起见还是转成H264使用吧。




你可能感兴趣的:(Android)