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端支持的视频格式有:mp4/3gp/mov

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


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

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



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

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




更多相关文章

  1. Android(安卓)动态加载布局
  2. webview的详解
  3. Android(安卓)UI布局优化之ViewStub
  4. Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录
  5. Android面试题整理-3
  6. Android配置启动页
  7. Android动态加载字节码
  8. Android(安卓)效率开发之图片---Glide 旋转图片处理
  9. 自己动手做android热更新框架

随机推荐

  1. 在c语言中二维数组元素在内存中的存放顺
  2. C程序总是以main函数作为程序执行的起始
  3. c语言数组冒泡排序是如何实现的?
  4. c语言怎么实现三个数从小到大输出?
  5. 在C语言里二维数组在内存中的存放顺序是
  6. c语言n次方怎么输入?
  7. c语言三目运算符怎么用?
  8. C++与C语言的区别与联系
  9. C++语言标识符的命名规则是什么?
  10. 深入学习C++必读书籍(推荐)