H5移动端视频播放方案-JSMpeg
随着工作中移动端页面比较多,遇到了移动端播放视频的需求是相对较多的,一想到视频,基本上都是第一时间想到使用 video
标签。
随着使用 video
标签,遇到的问题也随之而来,浏览器兼容性一直是一个令人忧虑的问题, 现在移动端堪比在web端上兼容IE,尤其是视频的兼容更是让人头疼。
痛点
举几个🌰:
- 不同厂家的手机,浏览器对
video UI
实现的不一致,就导致原生video
标签的样式在各大浏览器中都各不一样。 - 国产浏览器对播放器劫持,浏览器自己实现了一套播放器而非调用内核提供的播放器,劫持了内核提供的播放器样式和逻辑。
- 内联播放且视频层级无法覆盖。
相信这几个问题就够让开发人员头疼了。
解决方案
在经历过多次项目的折磨后,突然发现了有个很好的解决方案,基本上能解决大多数兼容问题。
什么是 JSMpeg
JSMpeg 是一个用于解码 MPEG1 视频流的 JavaScript 库。它可以在浏览器中解码视频流,并将其呈现为 Canvas
元素。JSMpeg 可以在支持 Canvas 和 WebSocket 的现代浏览器上运行。
说白了,就是使用 Canvas
标签去逐帧渲染出来。
基本工作原理如下:
- 将 MPEG1 视频流传输到浏览器:JSMpeg 支持通过 WebSocket 或 HTTP 协议将视频流传输到浏览器。通常情况下,使用 WebSocket 传输可以获得更好的性能和更低的延迟。
- 将视频流解码为帧:一旦视频流传输到浏览器,JSMpeg 就会将其解码为视频帧。MPEG1 视频是由一系列 I 帧、P 帧和 B 帧组成的,JSMpeg 需要解码这些帧才能正确显示视频。
- 将帧渲染到 Canvas 元素上:一旦视频帧被解码,JSMpeg 就会将它们渲染到 Canvas 元素上。Canvas 元素是 HTML5 提供的一个可以通过 JavaScript 动态绘制图形的元素,JSMpeg 使用它来显示视频。
- 处理视频的音频部分:除了视频帧外,MPEG1 视频还包括音频部分。JSMpeg 可以通过解码视频流来提取音频数据,并使用 Web Audio API 将音频数据播放出来。
如何使用 JSMpeg
- 可以从 JSMpeg 的 Github 存储库中下载最新的 JSMpeg.js 文件,并在 HTML 页面中使用 script 标签引入它。
<script src="jsmpeg.js"></script>
- 然后,需要创建一个用于呈现视频的 Canvas 元素。
<canvas id="canvas"></canvas>
- 之后创建 JSMpeg 对象
var player = new JSMpeg.Player('你的.ts视频地址', {
canvas: document.getElementById('canvas'), // 容器id
throttled: false, // 这里设置为false,不然不触发onSourceCompleted事件
chunkSize: 4 * 1024 * 1024, // 使用分块加载数据时,一次加载的块大小。默认1024*1024(1mb)
progressive: false, // 是否分块加载数据
autoplay: false, // 是否自动播放
loop: false, // 是否循环播放视频。默认true
onSourceCompleted: () => {
console.log('资源加载完成')
},
onPlay: () => {
console.log('开始')
},
onPause: () => {
console.log('暂停')
},
onEnded: () => {
console.log('播放结束')
},
onStalled: () => {
console.log('没有足够的数据用于播放')
},
onSourceEstablished: () => {
console.log('第一次收到数据')
}
})
如果没有设置 autoplay
为 true,需要在 onSourceEstablished
的回调中来执行视频播放的逻辑
player.play()
到这里,视频就可以正常播放了,并且在移动端上保持很好的兼容性。告别各种各样的 video
的坑。
注意事项
一般我们的视频格式都是 mp4
的格式,需要转为 .ts
的格式,这时候就需要用到 FFmpeg
什么是 FFmpeg
FFmpeg 是一个开源的跨平台音视频处理工具,它能够对音视频进行编解码、转换、过滤、裁剪、合并等处理操作。FFmpeg 支持多种常见的音视频格式,包括 MPEG、H.264、AAC、MP3 等,同时还支持流媒体协议和容器格式,如 RTSP、RTMP、HLS、MP4、AVI 等。
如何使用 FFmpeg
在 Mac 上安装 FFmpeg
在终端中执行以下命令安装 FFmpeg
brew install ffmpeg
在 window 上安装 FFmpeg
在 Windows 上安装 FFmpeg 可以通过下载预编译的二进制文件进行安装。
- 下载 FFmpeg:前往 FFmpeg 官网 下载最新版的 FFmpeg。
- 解压缩:将下载的压缩包解压到您想要安装 FFmpeg 的目录中。
- 配置环境变量:在 Windows 中打开“控制面板”,点击“系统和安全” -> “系统” -> “高级系统设置”,在弹出的窗口中点击“环境变量”,在“系统变量”中找到“Path”,双击它,在弹出的窗口中点击“新建”,输入 FFmpeg 的安装目录,并点击“确定”保存设置。
- 完成安装:打开命令提示符(Windows+R,输入
cmd
回车),执行ffmpeg -version
命令,如果输出 FFmpeg 的版本信息,说明安装成功。
视频转换
如何不太了解 FFmpeg 命令,可以尝试使用以下命令进行转换
ffmpeg \
-i xxxx.mp4 \
-f mpegts -codec:v mpeg1video -b:v 3500k -vf scale=750:-1 -codec:a out.ts \
out.ts
-b:v 3500k 值越大,体积也就越大,可以根据实际情况来(抄于百度)
- 1080*720的分度辨率,用5000K左右
- 720*576的分辨率,用3500K左右
- 640*480的分辨率,用1500K左右
这样我们就得到了 JSMpeg 所需要的视频格式了。
总结
到这里 就可以应对移动端 video
大部分的兼容性问题了。
除了 ffmpeg 的上手门槛有一定的难度,基本上就没有什么难点了。
有兴趣的可以去尝试下,会发现真的香~
Demo
具体效果可以查看以下地址
转载自:https://juejin.cn/post/7225534193995923512