跳转至

01 视频分片处理并播放

视频分片处理

前端 mp4 视频改成 m3u8 流模式

背景

1、mp4 视频通常对应一个文件,播放时需要加载全部文件,消耗网络资源。如果用户从中间某个时间访问,也会从头开始下载,浪费服务器性能。

2、mp4 视频文件容易被用户下载到本地。有些版权方不希望普通用户下载到本地。

解决思路

这个问题,很多视频网站已经给出了成熟方案,就是流模式加密形式。如果不是专业的视频网站,就不需要这么复杂的加密,直接转换成流模式即可满足需求。就是把 mp4 转换成 m3u8 视频流,然后分片下载并播放。

手动处理步骤

1、使用ffmpeg 转换视频

$ brew install ffmpeg

2、 如果没有brew ,手动安装brew(如果不好使用,需要科学上网)

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  

3、测试ffmpeg 版本输出

$ ffmpeg -version

4、通过ffmpeg 将mp4 的视频修改为m3u8 的格式

$ ffmpeg -i demo.mp4 -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8

这一步转换+切片取决于 mp4 视频大小。建议测试使用一个小一点的 mp4 文件。

  • -i xxx.mp4 指定输入文件的路径(避免中文路径)
  • -c:v libx264 指定视频编码器为libx264(H.264)
  • -crf 20 设置CRF(常量速率因子)的值。这是视频质量的控制,范围从0(无损)到51(最糟),通常使用18到28的值。
  • -c:a aac 指定音频编码器为AAC。
  • -strict experimental 允许使用实验性的编码器。
  • -b:a 192k 设置音频比特率为192k。
  • -codec: copy:复用编解码器,这意味着不重新编码视频和音频。
  • -start_number 0:每个TS切片的起始编号从0开始。
  • -hls_time 10:每个TS切片的持续时间为10秒。
  • -hls_list_size 0:播放列表中的TS切片数量没有限制。
  • -f hls:输出格式为HLS。
  • output.m3u8:输出的M3U8播放列表文件名。
  • -s(设置分辨率)
  • -b:v(设置视频比特率)

5、 界面上使用需要注意修改source

原:

<source src="./mp4/demo.mp4" type="video/mp4"></source>

修改为:

<source src="./mp4/output.m3u8" type='application/x-mpegURL'></source>

6、将对应文件上传至oss 中

image-20250513171027230

7、指定视频流就能正常访问了,示例代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>videojs-contrib-hls embed</title>

  <!--

  Uses the latest versions of video.js and videojs-contrib-hls.

  To use specific versions, please change the URLs to the form:

  <link href="https://unpkg.com/video.js@5.16.0/dist/video-js.css" rel="stylesheet">
  <script src="https://unpkg.com/video.js@5.16.0/dist/video.js"></script>
  <script src="https://unpkg.com/videojs-contrib-hls@4.1.1/dist/videojs-contrib-hls.js"></script>

  -->

  <link href="./video-js.css" rel="stylesheet">
    <script src="./video.js"></script>
  <script src="./videojs-contrib-hls.js"></script>


</head>
<body>
  <h1>Video.js Example Embed</h1>

  <video id="my_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="268" 
  data-setup='{}'>
    <source src="http://******/m3u8/1200MB5987/1200MB5987.m3u8" type="application/x-mpegURL">
  </video>


</body>
</html>

此时可以直接复制.m3u8文件的地址访问即可播放,如果无法访问可以检查是否是以下原因造成

  • 1.m3u8链接无法播放,video.js提示无法访问对应资源,需要在阿里云oss上设置跨域。bucket空间—>基础设置—>跨域设置
  • 2.ts文件的读写权限需要公共读不然video.js访问不到的,然后为了防止视频被恶意下载可以设置防盗链
  • 3.同一个视频的m3u8格式文件以及ts文件需要放在同一级目录。最好是一个视频的相关文件放入以文件名命名的路径下以示区别
  • 4.bucket桶需要设置为空开读的权限