Android WebView无法播放H.264视频流,嵌入远程网页有何解决方案?
解决Android WebView不支持H.264视频流的可行方案
碰到这种WebView不支持H.264的坑确实闹心,尤其是还要嵌入到Activity里不能用外部浏览器,给你整理几个经过开发者验证的可行方案:
替换为第三方WebView内核
你试过Crosswalk但没成功?可以试试腾讯的X5内核,它对H.264的支持很完善,适配了绝大多数Android机型。集成步骤也不复杂:- 在项目的
build.gradle中添加对应依赖 - 布局文件里把系统WebView替换为
com.tencent.smtt.sdk.WebView - 初始化时配置内核加载监听,处理第一次启动时的内核下载逻辑
注意:X5内核会让APK体积增加几十MB,但稳定性和兼容性比系统WebView强不少。
- 在项目的
剥离视频播放逻辑,改用原生播放器
既然WebView搞不定视频播放,不如把这块活儿交给原生组件:- 给WebView设置
WebViewClient,重写shouldInterceptRequest方法,捕获页面中的H.264视频流URL - 拿到URL后,用Android的ExoPlayer(更推荐,功能比MediaPlayer强大)或者MediaPlayer来播放视频,可以直接在当前Activity嵌入播放视图,也可以跳转到专门的播放页面
这个方案的好处是原生播放器对H.264的支持是系统级别的,几乎没兼容性问题,还能自定义播放控制栏、缓存逻辑等。
- 给WebView设置
服务器端转码视频流
如果你能控制服务器的话,可以把H.264编码的视频流转成WebView支持的VP9或WebM格式:- 用FFmpeg等工具对视频文件或直播流进行转码,比如执行命令:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -c:a libopus output.webm - 注意:VP9在新版WebView(63+)中是支持的,但旧设备可能兼容不佳;转码会增加服务器的CPU和带宽消耗,直播场景下要考虑实时转码的性能。
- 用FFmpeg等工具对视频文件或直播流进行转码,比如执行命令:
排查并开启硬件加速
有时候不是WebView本身不支持H.264,而是硬件加速没开启导致的:- 在
AndroidManifest.xml中给目标Activity添加android:hardwareAccelerated="true" - 或者在代码中给WebView设置:
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)
这个小技巧可以先试试,说不定能快速解决问题。
- 在
内容的提问来源于stack exchange,提问作者Dorkmania




