HLS(HTTP Live Streaming)标准的视频及加密

.m3u8 是 HLS(HTTP Live Streaming) 协议的索引文件,用于分割后的 TS 分片的播放调度。制作核心是 将 MP4 转码为 TS 分片 + 生成对应的 m3u8 索引,主流工具是 ffmpeg

1. 前置准备

  • 安装 ffmpeg:Linux 可通过 yum install ffmpeg(CentOS/Rocky Linux)或 apt install ffmpeg(Debian/Ubuntu);Windows 需下载编译包并配置环境变量。
  • 准备待处理的 MP4 文件(建议先确保 MP4 编码为 H.264 + AAC,兼容性最佳)。

2. 单分辨率 HLS 转换(基础命令)

执行以下 ffmpeg 命令,即可生成 m3u8 和对应的 TS 分片:
ffmpeg -i input.mp4 \
  -c:v h264 \
  -c:a aac \
  -hls_time 10 \          # 每个 TS 分片的时长(单位:秒)
  -hls_list_size 0 \      # 0 表示保留所有分片,非 0 则只保留最新 N 个
  -hls_segment_filename "output_%03d.ts" \  # TS 分片命名规则
  output.m3u8             # 生成的 m3u8 文件名
  • 执行后,目录下会生成:
    • output.m3u8:核心索引文件,记录 TS 分片的顺序、时长、路径。
    • output_001.tsoutput_002.ts...:分割后的视频分片文件。 

3. 多分辨率 HLS 转换(自适应码率,可选)

如果需要支持不同网速自动切换清晰度,可生成多套 TS 分片 + 一个主 m3u8:
# 生成低清(480p)分片
ffmpeg -i input.mp4 -c:v h264 -c:a aac -vf "scale=854:480" -hls_time 10 -hls_list_size 0 -hls_segment_filename "480p_%03d.ts" 480p.m3u8

# 生成高清(720p)分片
ffmpeg -i input.mp4 -c:v h264 -c:a aac -vf "scale=1280:720" -hls_time 10 -hls_list_size 0 -hls_segment_filename "720p_%03d.ts" 720p.m3u8

# 生成主 m3u8(索引多分辨率)
echo "#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=854x480
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720
720p.m3u8" > main.m3u8

二、服务器存放的文件

服务器必须同时存放 .m3u8 文件和对应的 .ts 分片文件,缺一不可:
 
  • .m3u8 是索引文件,本身很小(几 KB),仅记录 TS 分片的路径、时长、编码信息。
  • .ts 是实际的视频数据文件,播放器会先请求 m3u8,再根据索引逐个请求 TS 分片进行播放。
 
存放结构建议(以 Nginx 为例):
/var/www/html/hls/
├─ output.m3u8       # 索引文件
├─ output_001.ts     # TS 分片1
├─ output_002.ts     # TS 分片2
└─ ...

Nginx 需配置支持 HLS 的 MIME 类型(在 nginx.conf 或站点配置中添加):

http {
    types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2t ts;
    }
}

三、原始 MP4 文件可以删除吗?

 
可以删除,但需满足一个前提:
 
已经成功生成了完整的 .m3u8 和所有 .ts 分片,且验证播放正常。
 
 
原因:
 
  • 播放 HLS 流时,播放器只依赖 .m3u8.ts 文件,与原始 MP4 无任何关联。
  • 若后续需要重新生成 HLS(如调整分片时长、增加分辨率),则需要保留原始 MP4;否则删除后无法再基于原视频重新转换。
 
 
 
加密下一章介绍。
 
 
 
 
posted @ 2026-01-20 09:14  与f  阅读(0)  评论(0)    收藏  举报