欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-23 14:19:29
...

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

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


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


国内外网站,从百度一下到微软必应到google到*走了一大圈,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视频失败 其他端正常---视频编码问题


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

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


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

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

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


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

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