指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

实现本地视频点播原理

主要命令:

ffmpeg -i input.mp4 \
       -hls_time 10 \
       -hls_key_info_file keyinfo.txt \
       -hls_playlist_type vod \
       output.m3u8

仔细分析一下这条 ffmpeg 命令,每个参数的作用都说明清楚:

ffmpeg -i input.mp4 \
       -hls_time 10 \
       -hls_key_info_file keyinfo.txt \
       -hls_playlist_type vod \
       output.m3u8

1️⃣ ffmpeg

  • 调用 ffmpeg 工具进行音视频处理和转码
  • 可以处理 MP4、MKV、MOV 等各种视频格式

2️⃣ -i input.mp4

  • 指定输入文件 input.mp4
  • 这是你要转 HLS 的原始视频

3️⃣ -hls_time 10

  • 每个 HLS 片段的时长,单位是秒
  • 上例中设置为 10 秒 → 视频会被切成 10 秒一段的 .ts 文件
  • 切片太短:请求次数多,CPU/带宽压力大
  • 切片太长:快进响应慢

4️⃣ -hls_key_info_file keyinfo.txt

  • AES-128 加密的 key 信息
  • keyinfo.txt 文件内容格式:
/absolute/path/to/local.key   # 生成的 AES-128 key 文件在本地路径
http://your-server.com/key.key # 播放器请求 key 的 URL
iv=00000000000000000000000000000001 # 可选 IV(初始化向量)
  • ffmpeg 会用这个 key 对生成的 .ts 片段进行 AES-128 加密
  • 播放器在播放 .m3u8 时会通过 key URI 下载 key 解密

5️⃣ -hls_playlist_type vod

  • 设置 HLS 播放列表类型为 点播(VOD)
  • 生成完整 .m3u8 列表,适合点播视频
  • 如果是直播可以使用 -hls_playlist_type event 或不指定

6️⃣ output.m3u8

  • 输出播放列表文件(m3u8)
  • 里面包含所有切片的路径信息(ts 文件)和加密 key URI
  • 浏览器 / HLS 播放器会读取 m3u8,然后按顺序请求 ts 片段播放

🔹 输出文件示例

假设输入视频 30 秒,-hls_time 10,生成:

output.m3u8
segment0.ts
segment1.ts
segment2.ts

output.m3u8 内容类似:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-KEY:METHOD=AES-128,URI="http://your-server.com/key.key"
#EXTINF:10.0,
segment0.ts
#EXTINF:10.0,
segment1.ts
#EXTINF:10.0,
segment2.ts
#EXT-X-ENDLIST
  • #EXT-X-KEY:指定加密方式和 key URI
  • #EXTINF:每个 ts 片段的时长
  • 播放器自动按顺序请求 ts 并解密播放