Video.js + HLS 在production环境下webpack打包后出错的解决方案
2018-02-06 08:07
666 查看
Video.js是一个非常强大的视频播放库,能在微信下完美提供inline小窗口播放模式,但当涉及到hls格式视频播放时就比较麻烦,出现的数种现象都不好解决.
错误现象:
1.PCChrome上提示格式不支持,此问题主要是Chrome本身不支持HLS格式导致的.
2.使用官方推荐的videojs-contrib-hls和videojs-contrib-media-sources插件后,运行时提示webworkify相关问题.
3.更换为videojs-contrib-hls.js后,在development模式下可正常播放,但production模式下编译时,UglifyJS后运行提示对象未定义,此问题有多种原因,其中我遇到一种比较诡异的,即使不进行UglifyJS也会提示_typeof未定义,这个问题实质上是Babel进行语法转换时出的bug
这里未能一一列举,但所有这些问题在官方问题列表#600中讨论很多,但最终解决方案和注意要点却未能总结清楚.这里将我自己摸出来的方案说一下.
解决方案注意要点:
1.使用videojs-contrib-hls.js代替官方的videojs-contrib-hls和videojs-contrib-media-sources.如果使用官方插件,需要修改webpack配置,具体请见官方webpack指引.
2.最好使用最新版video.js6.x,我测试过程中发现5.x和videojs-contrib-hls.js兼容性似乎有问题.
3.babel-loader需要增加exclude配置,不需要处理videojs-contrib-hls.js的代码.
4.相关的播放代码中,最好能指定视频的type为application/x-mpegURL,或者文件url的文件名加上扩展名m3u8(iOS中如果无扩展名则无法播放).另外需要注意的是,如果想在videojs的构造函数中直接指定sources,也会在某些浏览器中导致无法播放.最好是使用src方法指定(此问题我未有时间详细测试).
或
5.为了兼容官方语言包zh-CN,需要让videojs变量全局可访问,这里需要用到webpack的ProvidePlugin
错误现象:
1.PCChrome上提示格式不支持,此问题主要是Chrome本身不支持HLS格式导致的.
VIDEOJS:ERROR:(CODE:4MEDIA_ERR_SRC_NOT_SUPPORTED)Themediacouldnotbeloaded,eitherbecausetheserverornetworkfailedorbecausetheformatisnotsupported.
2.使用官方推荐的videojs-contrib-hls和videojs-contrib-media-sources插件后,运行时提示webworkify相关问题.
VIDEOJS:WARN:FailedtocreateSourceBuffersTypeError:Cannotconvertundefinedornulltoobject atFunction.keys(<anonymous>) atmodule.exports(webpack:///./~/webworkify/index.js?:10:28) atnewVirtualSourceBuffer(webpack:///./~/videojs-contrib-media-sources/es5/virtual-source-buffer.js?:91:52) atHtmlMediaSource.addSourceBuffer(webpack:///./~/videojs-contrib-media-sources/es5/html-media-source.js?:316:18) atcreateSourceBuffer(webpack:///./~/videojs-contrib-hls/es5/source-updater.js?:40:41) atnewSourceUpdater(webpack:///./~/videojs-contrib-hls/es5/source-updater.js?:69:7) atSegmentLoader.init_(webpack:///./~/videojs-contrib-hls/es5/segment-loader.js?:497:29) atSegmentLoader.mimeType(webpack:///./~/videojs-contrib-hls/es5/segment-loader.js?:388:14) atMasterPlaylistController.setupSourceBuffers_(webpack:///./~/videojs-contrib-hls/es5/master-playlist-controller.js?:1016:31) atPlaylistLoader.eval(webpack:///./~/videojs-contrib-hls/es5/master-playlist-controller.js?:301:18) atPlaylistLoader.trigger(webpack:///./~/videojs-contrib-hls/es5/stream.js?:95:24) ateval(webpack:///./~/videojs-contrib-hls/es5/playlist-loader.js?:384:16) ateval(webpack:///./~/videojs-contrib-hls/es5/xhr.js?:63:7) ateval(webpack:///./~/once/once.js?:17:15) atloadFunc(webpack:///./~/xhr/index.js?:133:9) atXMLHttpRequest.readystatechange(webpack:///./~/xhr/index.js?:63:13)
3.更换为videojs-contrib-hls.js后,在development模式下可正常播放,但production模式下编译时,UglifyJS后运行提示对象未定义,此问题有多种原因,其中我遇到一种比较诡异的,即使不进行UglifyJS也会提示_typeof未定义,这个问题实质上是Babel进行语法转换时出的bug
UncaughtReferenceError:Xisnotdefined
这里未能一一列举,但所有这些问题在
解决方案注意要点:
1.使用
2.最好使用最新版video.js6.x,我测试过程中发现5.x和videojs-contrib-hls.js兼容性似乎有问题.
3.babel-loader需要增加exclude配置,不需要处理videojs-contrib-hls.js的代码.
{
test:/\.jsx?$/,
loaders:[
'babel-loader?compact=false'
],
exclude:/(videojs-contrib-hls\.js)/,
}
4.相关的播放代码中,最好能指定视频的type为application/x-mpegURL,或者文件url的文件名加上扩展名m3u8(iOS中如果无扩展名则无法播放).另外需要注意的是,如果想在videojs的构造函数中直接指定sources,也会在某些浏览器中导致无法播放.最好是使用src方法指定(此问题我未有时间详细测试).
constplayer=videojs(this.videoNode,this.props,functiononPlayerReady(){
this.load();
});
player.src({
src:'http://someUrl',
type:'application/x-mpegURL',
});
或
<videoid=example-videowidth=960height=540class="video-jsvjs-default-skin"controls>
<source
src="https://example.com/index.m3u8"
type="application/x-mpegURL">
</video>
5.为了兼容官方语言包zh-CN,需要让videojs变量全局可访问,这里需要用到webpack的ProvidePlugin
plugins:[
newwebpack.ProvidePlugin({
"videojs":"video.js",
"window.videojs":"video.js",
}),
]
相关文章推荐
- webpack-生产环境最佳实践(https://webpack.js.org/guides/production/)
- ERROR in static/js/vendor.xxxx.js from UglifyJs Unexpected token: punc webpack打包出错解决
- 基于webpack和vue.js搭建开发环境
- webpack打包遇到locals[0] does not appear to be a `module` object with Hot Module replacement API enabled. You should disable react-transform-hmr in production by using `env` section in Babel configuration
- 详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
- webpack使用file-loader单独打包js文件
- 高性能流媒体服务器EasyDSS前端重构(四)- webpack + video.js 打造流媒体服务器前端
- webpack实现开发、测试、生产等环境的打包切换
- Window10 下部署Webpack+Vuejs构建前端环境(1)
- webpack将js打包后的map文件
- react.js使用webpack搭配环境的入门教程
- 【webpack打包成功,但是在dist文件js里没有出现相对应的文件 】问题解决
- webpack打包单页面引用的js
- webpack学习(六)打包压缩js和css
- visual studio 下用webpack将js打包到wwwroot目录下
- 手把手教你webpack、react和node.js环境配置(上篇)
- webpack(2)_打包JS
- (一)webpack配置loader,打包js和sass以及图片文件
- node+webpack环境搭建 vue.js 2.0 基础学习笔记
- (node.js)webpack打包报javaScript heap out of memory,内存溢出,如何解决