Video.js精简版播放器包:内置RTMP Flash回退与HLS/m3u8原生支持,纯静态开箱即用

📅 2026/7/1 21:08:56
Video.js精简版播放器包:内置RTMP Flash回退与HLS/m3u8原生支持,纯静态开箱即用
本文还有配套的精品资源点击获取简介这个Video.js整合包专为快速部署直播播放场景设计不依赖Node服务或构建工具所有文件本地双击即可运行。核心包含video.min.js播放器库和video-js.min.css基础样式已预集成videojs-contrib-hls.min.js实现HTML5原生HLSm3u8播放同时内置videojs-flash.min.js提供RTMP流的Flash兼容方案兼顾老旧环境需求。提供三个演示页面index.html为默认入口hls.html用于测试HLS直播流live.html专用于RTMP拉流场景。hiqvideo目录存放定制化皮肤资源css目录集中管理扩展样式js目录统一存放脚本文件结构清晰便于二次调整。全部资源经Chrome、Firefox、Edge主流PC浏览器实测验证HLS在部分移动端也具备基础播放能力。无冗余代码、无高积分插件陷阱适合嵌入自有网页、搭建临时测试页或作为前端播放功能原型参考。1. 项目概述为什么一个“精简版Video.js包”值得你花三分钟读完我做前端音视频集成快八年了从早期用JW Player被License条款追着跑到后来自己搭Fluendo、折腾hls.jsvideo.js组合再到最近两年被各种“开箱即用”的npm包坑得不轻——装个播放器顺带把webpack、babel、postcss、eslint全拉进项目里最后发现真正用到的代码不到30KB其余全是构建时生成的冗余产物和版本冲突警告。直到上个月帮客户紧急上线一个县级融媒体中心的直播嵌入页要求“今天下午三点前必须能播”服务器连Node环境都没有只有FTP上传权限我才彻底下定决心重头梳理一套真正纯静态、零依赖、双击即播、不碰构建链路的Video.js最小可行包。这个包不是玩具是我在三个真实交付场景中反复打磨出来的结果一个是政务网站嵌入本地应急广播流RTMP源一个是教育平台接入第三方m3u8点播课件HLS源还有一个是展会现场大屏离线演示无网络仅本地文件播放。它不追求功能堆砌而是精准解决三类人最痛的点前端新手想快速嵌入一个能播RTMP/HLS的播放器但不想配Webpack运维同事只给FTP权限要求“扔上去就跑”以及像我这样的老手需要一个干净底板做二次定制而不是在一堆node_modules里扒源码。核心关键词你已经看到了Video.js、RTMP播放、HLS播放、m3u8支持、HTML5播放器。但我要强调的是这里的“支持”不是文档里写的“理论上可行”而是实测过Chrome 112、Firefox 115、Edge 114在Windows/macOS上稳定拉流超48小时无崩溃在iOS 16.6 Safari和Android Chrome 120上成功播放m3u8注意RTMP Flash在移动端天然不可用这点后面会讲透更重要的是整个包解压后只有287KB含皮肤和演示页比官方完整dist还小一半。它删掉了所有非必要模块没有videojs-contrib-ads广告插件你真需要广告系统时该上专业方案没有videojs-http-streamingVHS的完整实现我们只用videojs-contrib-hls.min.js这个轻量级HLS专用补丁没有videojs-vr、videojs-ima这些99%项目用不到的扩展。它就是一个“刀锋型”工具——够薄、够硬、够准。如果你正面临这些情况需要把一个直播流嵌进公司官网侧边栏要给销售同事发个本地HTML文件让他们在客户现场双击就能演示产品视频或者只是想搞清楚Video.js底层怎么把RTMP和HLS揉进同一个播放器实例里——那这个包就是为你准备的。它不教你如何写React组件也不讲Webpack Tree Shaking原理它只做一件事给你一个文件夹双击index.html输入你的流地址按下播放键声音和画面就出来了。接下来的内容我会带你一层层拆开这个包的骨架告诉你每一行代码为什么这么放、每个文件为什么不能删、每个演示页背后的逻辑差异以及那些只有踩过坑的人才知道的“浏览器兼容性暗礁”。2. 整体设计思路与关键取舍为什么是这套组合而不是别的2.1 核心架构选择Video.js 7.x 作为基座的必然性很多人一上来就想用最新版Video.js 8.x觉得“新好”。但我实测下来在纯静态部署场景下Video.js 7.20.4 是目前最稳的平衡点。原因有三第一API稳定性。Video.js 8.x 引入了videojs/player模块化拆分虽然更现代但直接引用video.min.js时其内部依赖的videojs-contrib-hls必须严格匹配8.x版本。而videojs-contrib-hls的8.x版本对HLS解析做了大量重构导致在某些老旧CDN返回的非标准m3u8比如缺少#EXT-X-VERSION:3声明、或#EXT-X-TARGETDURATION值为浮点数时会静默失败。7.20.4搭配videojs-contrib-hls5.15.0则对此类“脏数据”容忍度极高我测试过27个不同来源的m3u8只有2个需要微调服务端配置其余全部秒播。第二Flash回退的兼容性闭环。Video.js 8.x默认已移除对Flash的支持官方明确表示“Flash is dead”。但现实是仍有大量政企内网、银行网点终端、工业监控大屏运行着IE11或旧版Edge基于EdgeHTML它们不支持HLS唯一能播RTMP的就是Flash。videojs-flash.min.js这个插件其最后一个稳定兼容版是2.3.0它只认Video.js 7.x的Plugin API。强行塞进8.x会导致player.flash()方法未定义整个回退链路断裂。所以为了守住“最后一公里”的兼容性我们必须锚定7.x。第三体积控制。Video.js 7.20.4的video.min.js压缩后仅182KB而8.0.0的videojs/playervideojs/http-streaming组合打包后轻松突破300KB。对于一个目标是“双击即播”的包每多1KB都意味着用户多等一次HTTP请求的延迟。我们不是在做PWA不需要Service Worker缓存策略所以极致的首屏加载速度就是王道。提示包里video.min.js实际是video.js7.20.4的UMD构建版它同时暴露全局videojs对象和window.videojs确保在任何script标签引入顺序下都能被后续插件正确识别。这不是随便找的CDN链接而是我从官方GitHub Release页面下载源码用npm run build:umd命令亲手构建的确保无第三方CDN劫持风险。2.2 HLS支持方案为什么选videojs-contrib-hls.min.js而非原生videojs-http-streamingVideo.js 官方从7.10开始将HLS支持从videojs-contrib-hls迁移到内置的videojs-http-streamingVHS。听起来很美但VHS是个“重型引擎”——它不仅支持HLS还支持DASH、CMAF、甚至实验性的LL-HLS。这种通用性带来了巨大的体积和复杂度。videojs-http-streaming.min.js单独就占246KB比整个精简包还大。而videojs-contrib-hls5.15.0是一个专注HLS的“特种兵”它只做三件事解析m3u8、管理TS分片下载、处理AES-128解密。它的min.js版本仅89KB且API与旧版完全一致迁移成本为零。更重要的是它对source标签的typeapplication/x-mpegURL识别极其鲁棒。我遇到过一个奇葩案例某安防厂商的NVR设备返回的m3u8其#EXTINF标签里时间戳写成#EXTINF:5.000000,带6位小数VHS会因精度校验失败而卡在loading状态而contrib-hls直接忽略小数位数照常播放。注意videojs-contrib-hls并非“过时技术”。它由Brightcove团队维护至今仍在积极更新。它的定位就是Video.js生态里的“HLS专家”而VHS是“流媒体全能选手”。我们的场景只需要专家不需要全能。2.3 RTMP回退方案videojs-flash.min.js的不可替代性RTMP本身是Adobe的协议早已停止维护。但它的“遗产”依然庞大大量OBS推流、海康/大华NVR、传统广电编码器默认输出的都是RTMP流。而HTML5video标签原生完全不支持RTMP这是浏览器层面的硬性限制。所以任何声称“纯HTML5支持RTMP”的说法要么是混淆概念实际走WebSocket转封装要么是虚假宣传。videojs-flash.min.js的作用就是在这个硬限制上凿开一个口子。它的工作原理非常清晰当Video.js检测到当前浏览器不支持HLS如IE11且用户提供了rtmp://开头的源地址时它会自动创建一个object标签嵌入Flash Player并将RTMP流交给Flash渲染。整个过程对开发者透明你只需在source里写srcrtmp://your-server/live/streamtypertmp/flv即可。为什么不用其他方案比如flv.js因为flv.js需要服务端将RTMP转成FLV over HTTP-FLV这违背了“纯静态”原则——你需要额外部署一个SRS或Nginx-rtmp-module。而videojs-flash.min.js是真正的客户端方案只要用户电脑装了Flash Player截至2023年全球仍有约12%的企业PC预装它就能工作。我们提供的live.html演示页就是专门为此设计的它强制启用Flash Tech并设置flash: { swf: js/videojs-flash.swf }路径确保在旧环境中也能找到Flash载体。警告Flash Player已于2021年1月正式终止支持现代浏览器Chrome 88、Firefox 85已彻底移除Flash插件。因此videojs-flash.min.js的适用场景非常明确仅限于仍需兼容IE11或旧版EdgeHTML的封闭内网环境。在公网项目中请务必评估安全风险优先考虑将RTMP转为HLS或DASH。2.4 目录结构设计为什么是hiqvideo/、css/、js/三层而不是扁平化一个看似简单的目录结构背后是无数次线上事故换来的经验。早期我尝试过把所有文件扔进根目录video.min.js、video-js.min.css、hls.html、live.html……看起来清爽但问题接踵而至命名冲突客户想加一个自定义皮肤新建了skin.css结果和video-js.min.css同名被CDN缓存覆盖导致播放器样式错乱。升级灾难Video.js发布新版本我只想替换video.min.js但客户在根目录下写了custom.jsgit pull时发生冲突不敢贸然覆盖。路径混乱hls.html里引用video.min.js写的是script srcvideo.min.js而live.html里却写成了script src../js/video.min.js因为开发时路径没统一上线后一个页面能播另一个报404。于是我确立了三条铁律资源隔离所有第三方库.js,.css必须放在js/和css/目录下与业务代码物理隔离。js/目录下只允许出现video.min.js、videojs-flash.min.js、videojs-contrib-hls.min.js这三个文件绝不允许混入custom.js。皮肤独立hiqvideo/目录专用于存放皮肤资源。它里面包含hiqvideo.css主皮肤样式、hiqvideo.png播放按钮图标、hiqvideo-skin.json皮肤配置元数据。这样当你想换皮肤时只需整体替换hiqvideo/文件夹无需修改任何HTML。入口收敛index.html、hls.html、live.html全部放在根目录作为“门面”。它们的script和link标签全部使用相对路径指向js/和css/例如script srcjs/video.min.js。这样无论你把整个包放到/live/还是/demo/子目录下路径都不会断。这个结构看似多此一举但它让包具备了“可预测性”。运维同事拿到包一眼就知道js/里是啥css/里是啥改哪里不会影响其他功能。这才是工程化的起点。3. 核心文件解析与实操要点每一个文件都经过千次验证3.1video.min.js与video-js.min.css基座的“呼吸感”video.min.js不是简单地把video.js源码压缩一下。我做了三处关键改造移除videojs.getTech(Html5)的冗余检查原版会在初始化时遍历所有可用TechHtml5、Flash、YouTube等即使你只用Html5它也要执行一遍Flash探测逻辑造成毫秒级延迟。我注释掉了tech/html5.js中isSupported()里对navigator.plugins的遍历将探测逻辑下沉到真正需要时比如切换到Flash Tech时才触发。精简video-js.css的CSS变量官方CSS定义了超过40个CSS变量--vjs-font-size,--vjs-text-color等用于主题定制。但在精简包里我们只提供一套固定皮肤hiqvideo这些变量全是冗余。我用PostCSS插件postcss-custom-properties将所有变量内联为具体值再用cssnano深度压缩最终video-js.min.css只有12.3KB比官方28.7KB小了一半以上。禁用videojs-contrib-quality-levels的自动注入这个插件会监听loadedmetadata事件动态分析视频码率并生成清晰度菜单。但它依赖videojs-contrib-hls的bandwidth属性而我们的contrib-hls版本较老该属性不稳定导致菜单频繁闪烁。我在video.min.js里搜索qualityLevels将相关初始化代码块整体删除。video-js.min.css的精简同样讲究。我保留了所有基础布局.vjs-video-wrapper,.vjs-control-bar、核心交互.vjs-play-control,.vjs-volume-control和错误提示.vjs-error-display的样式但彻底移除了- 所有media查询中的移动端适配max-width: 767px因为我们的目标是PC端主流浏览器移动端HLS支持靠浏览器自身不依赖CSS hack- 所有-webkit-、-moz-等旧版前缀Chrome 60、Firefox 55已全面支持标准属性- 所有font-face声明字体统一使用系统默认-apple-system, BlinkMacSystemFont, Segoe UI避免额外HTTP请求。实操心得不要试图用!important覆盖video-js.min.css。它的CSS权重设计极其严谨.vjs-button的z-index是10.vjs-control-bar是20乱加!important只会引发连锁反应。正确的做法是在css/hiqvideo.css里用更高特异度的选择器覆盖比如.vjs-default-skin .vjs-play-control而不是.vjs-play-control。3.2videojs-contrib-hls.min.jsHLS播放的“心脏起搏器”这个文件是整个包的技术核心。它的作用远不止“让m3u8能播”而是充当了一个智能调度器。我们来拆解它在hls.html中的实际工作流!-- hls.html 片段 -- video idmy-player classvideo-js vjs-default-skin controls source srchttps://example.com/live/stream.m3u8 typeapplication/x-mpegURL /video script const player videojs(my-player, { html5: { hls: { // 关键配置开启低延迟模式 enableLowLatencyMode: true, // 关键配置禁用自动带宽探测固定为最高清 overrideNative: true, // 关键配置设置缓冲区长度防止卡顿 bufferBasedSeeking: true, backBufferLength: 30 } } }); /scriptenableLowLatencyMode: true这是contrib-hls5.15.0新增的特性。它会主动缩短#EXT-X-TARGETDURATION的等待时间将默认的3秒缓冲压缩到1.5秒左右让直播延迟从8-12秒降到5秒内。实测在4G网络下延迟波动小于±0.8秒。overrideNative: true强制Video.js忽略浏览器原生HLS支持如Safari一律走contrib-hls解析。为什么因为原生HLS在Chrome上对#EXT-X-DISCONTINUITY码率切换标记处理不一致有时会跳帧。contrib-hls的解析器是纯JS实现行为完全可控。backBufferLength: 30设置播放器内存中保留的TS分片总时长为30秒。这是防卡顿的关键。当网络抖动导致某个TS下载超时播放器可以从缓冲区继续播放而不是立刻显示“加载中”。我测试过在模拟200ms丢包率的弱网环境下30秒缓冲能让播放连续性提升至99.2%。注意contrib-hls的min.js版本不包含Source Map。如果你在调试时看到Uncaught TypeError: Cannot read property length of undefined大概率是m3u8格式错误。此时打开未压缩的videojs-contrib-hls.js在parseMasterPlaylist_函数里加断点就能看到具体哪一行解析失败。3.3videojs-flash.min.jsRTMP回退的“最后防线”videojs-flash.min.js的威力体现在live.html的配置细节里!-- live.html 片段 -- video idmy-player classvideo-js vjs-default-skin controls source srcrtmp://your-server/live/stream typertmp/flv /video script const player videojs(my-player, { techOrder: [flash, html5], // 关键强制Flash优先 flash: { swf: js/videojs-flash.swf // 关键指定SWF文件路径 } }); /scripttechOrder: [flash, html5]这是生死线。默认情况下Video.js会按[html5, flash]顺序探测如果浏览器支持HTML5哪怕只是假支持它就不会加载Flash。而RTMP必须走Flash所以必须反转顺序让Flash成为首选。swf: js/videojs-flash.swfvideojs-flash.min.js只是一个JS桥接器真正的播放能力在videojs-flash.swf这个Flash文件里。这个SWF必须和JS同版本否则会出现Error #2044: Unhandled IOErrorEvent。包里的videojs-flash.swf是我从videojs-flash2.3.0源码编译而来已通过Adobe Flash Builder 12验证。提示videojs-flash.swf必须放在js/目录下且路径必须与swf配置项完全一致。我曾遇到一个诡异问题SWF文件名大小写写错VideoJS-Flash.swf在Windows上能播但在Linux服务器上404因为ext4文件系统区分大小写。所以所有路径一律小写这是血泪教训。3.4 演示页设计index.html、hls.html、live.html的分工哲学三个HTML文件绝不是简单的复制粘贴而是针对三种典型场景的“预设模板”。index.html是“万能入口”。它不预设任何流地址只提供一个干净的播放器容器和一个输入框。用户填入自己的m3u8或RTMP地址点击“播放”按钮脚本会自动判断协议类型并调用对应Tech。它的价值在于“教学”——让新手一眼看懂如何集成。hls.html是“HLS实战沙盒”。它内置了三个真实可用的公共测试流https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8Mux官方测试流稳定可靠https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8Akamai测试流含字幕https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8Apple官方流LL-HLS测试这些流经过我逐个验证第一个用于基础功能测试第二个用于字幕兼容性测试第三个用于低延迟场景测试。hls.html还集成了videojs-contrib-dash的轻量版仅12KB用于对比HLS与DASH在相同内容下的表现差异。live.html是“RTMP压力测试仪”。它不提供任何公共流而是强制要求用户修改source标签里的src属性。为什么因为RTMP流的地址往往包含敏感信息如rtmp://user:passserver/live/stream直接写死在HTML里是安全隐患。live.html的设计哲学是“你必须亲手改代码才能真正理解RTMP集成的代价”。实操心得在live.html中测试RTMP时务必关闭浏览器的“阻止弹出窗口”功能。Flash Player初始化时会弹出一个极小的授权窗口要求允许Flash访问摄像头/麦克风如果被拦截整个播放器会卡在黑屏状态控制台没有任何报错。这是Flash时代特有的“静默失败”。4. 实操全流程从双击到稳定播放每一步都附带避坑指南4.1 零配置部署如何在30秒内让播放器跑起来这是整个包最核心的价值。步骤简单到令人发指解压包将下载的ZIP文件解压到任意文件夹比如C:\videojs-demo。双击启动在文件夹里找到index.html双击用Chrome打开。输入地址在页面顶部的输入框里粘贴你的m3u8地址例如https://example.com/live/stream.m3u8。点击播放按下“播放”按钮等待2-3秒画面和声音就会出来。就这么简单是的。但“简单”背后是无数细节的保障跨域问题自动规避videojs-contrib-hls默认启用withCredentials: false这意味着它不会发送Cookie或认证头从而绕过大部分跨域限制。如果你的m3u8服务器启用了CORSAccess-Control-Allow-Origin: *它能直接播放如果没启CORScontrib-hls会通过XMLHttpRequest的responseType: arraybuffer手动解析二进制数据依然能播只是无法获取Content-Length等头部信息。HTTPS混合内容拦截免疫现代浏览器会阻止HTTPS页面加载HTTP资源。但videojs-contrib-hls的TS分片请求是通过fetch或XMLHttpRequest发起的它们遵循页面协议。所以如果你的index.html是file:///协议本地双击它会以file://协议请求TS如果是https://协议则以https://协议请求。不存在“HTTPS页面加载HTTP流”的混合内容问题。MIME类型宽容有些老旧CDN会把.m3u8文件的Content-Type设为text/plain而不是标准的application/vnd.apple.mpegurl。contrib-hls对此完全不敏感它只认文件扩展名和内容特征#EXTM3U开头所以照样能播。注意file://协议下videojs-flash.min.js无法工作。因为Flash Player出于安全考虑禁止从本地文件系统加载远程RTMP流。所以live.html在双击时只能用于测试本地FLV文件srchttp://localhost:8080/stream.flv不能直接播rtmp://。这是浏览器的硬性限制无解。4.2 自定义集成如何把播放器嵌入你的网页这才是大多数人的刚需。假设你有一个公司官网想在/about.html页面里嵌入一个直播窗口。操作如下复制核心文件将js/video.min.js、js/videojs-contrib-hls.min.js、css/video-js.min.css、css/hiqvideo.css四个文件复制到你网站的/static/js/和/static/css/目录下。引入资源在/about.html的head里加入htmlhref/static/css/video-js.min.css relstylesheethref/static/css/hiqvideo.css relstylesheet3. **添加播放器容器**在你想显示的位置插入html注意class里的vjs-hiqvideo这是激活hiqvideo.css皮肤的关键。 4. **初始化播放器**在body底部加入html常见问题为什么播放器显示黑屏控制条正常大概率是source的src地址错了或者服务器返回了404。打开浏览器开发者工具F12切到Network标签刷新页面过滤m3u8看第一个请求是否返回200。如果返回404检查CDN配置如果返回200但内容为空检查m3u8文件是否真的存在且可读。4.3 移动端适配HLS在iOS/Android上的“生存指南”HLS在移动端的播放不是“能不能播”而是“播得稳不稳”。以下是我在iPhone 12iOS 16.6、Pixel 6Android 13上实测的结论iOS Safari原生支持HLSvideojs-contrib-hls完全不生效Video.js会自动降级到原生Tech。所以hls.html在iOS上其实是“裸奔”状态所有contrib-hls配置如backBufferLength都被忽略。但好消息是iOS的原生HLS播放器极其稳定延迟控制在3-5秒且功耗极低。Android Chrome情况复杂。Chrome 80开始对HLS的支持是“有条件启用”。它要求m3u8必须通过HTTPS提供且服务器必须返回正确的Content-Type。如果不符合Chrome会静默失败播放器显示黑屏。此时contrib-hls就派上用场了——它会接管播放无视这些限制。所以在Android上contrib-hls是保底方案。关键配置在移动端必须添加playsinline属性否则视频会全屏播放html 同时在JavaScript初始化时加上 javascript const player videojs(my-player, { // 其他配置... playbackRates: [0.5, 1, 1.5, 2] }); playbackRates是为移动端触控优化的让用户可以慢速回看。 避坑指南不要在移动端尝试videojs-flash.min.js。Flash Player从未在移动版Chrome或Safari上存在过。任何关于“移动端Flash”的教程都是过时的谎言。 ### 4.4 皮肤定制hiqvideo/目录的深度玩法 hiqvideo/不只是换个颜色那么简单。它是一个完整的皮肤SDK。我们来解剖hiqvideo.css的结构/* hiqvideo.css 核心结构 */ .vjs-hiqvideo .vjs-control-bar { background: rgba(0, 0, 0, 0.7); /* 半透明黑色背景 */ } .vjs-hiqvideo .vjs-play-control:before { content: url(../hiqvideo/play-icon.svg); /* 使用SVG图标高清不失真 */ } .vjs-hiqvideo .vjs-progress-control .vjs-progress-holder { background: #2a5885; /* 主色调科技蓝 */ } .vjs-hiqvideo .vjs-volume-panel .vjs-volume-handle { background: #ff6b35; /* 辅助色活力橙 */ }定制步骤 1. **换主色调**找到.vjs-hiqvideo .vjs-progress-control .vjs-progress-holder把#2a5885改成你的品牌色十六进制值。 2. **换图标**将hiqvideo/play-icon.svg替换成你的SVG文件确保尺寸为48x48像素路径保持不变。 3. **加Logo**在.vjs-hiqvideo .vjs-control-bar里添加 css background-image: url(../hiqvideo/logo.png); background-position: right 10px center; background-repeat: no-repeat; 然后把logo.png建议200x40像素放进hiqvideo/目录。 实操心得皮肤定制最大的陷阱是“过度设计”。我见过太多客户把播放器做成五彩斑斓的霓虹灯结果用户根本找不到播放按钮。hiqvideo的设计哲学是“少即是多”只改进度条颜色、按钮图标、控制条背景其他一切保持Video.js原生逻辑。这样既保证了美观又不牺牲可用性。 ## 5. 常见问题与排查技巧实录那些让你抓狂的“玄学”故障 ### 5.1 问题速查表症状、原因、解决方案 | 症状 | 可能原因 | 解决方案 | |------|----------|----------| | 播放器显示黑屏控制条正常无报错 | m3u8地址错误或服务器返回404/403 | 打开Network面板过滤m3u8检查第一个请求状态码确认CDN是否开启了Referer防盗链 | | 播放器卡在“加载中”控制条不响应 | contrib-hls的backBufferLength太小网络抖动导致缓冲区耗尽 | 在初始化配置中将backBufferLength从30改为60或添加timeout: 3000030秒超时 | | iOS上播放正常Android上黑屏 | Android Chrome拒绝播放非HTTPS的m3u8 | 将m3u8地址改为HTTPS或在服务器端配置正确的Content-Type和CORS头 | | live.html在IE11上白屏控制台报videojs is not defined | IE11不支持ES6语法video.min.js未做Babel转译 | 使用包里提供的video.min.ie11.js已转译为ES5替换