使用 FFmpeg 将 MP4 转换为 HLS (m3u8 + ts 切片)

 ·  2025-08-21

在视频点播和在线直播场景中,HLS (HTTP Live Streaming) 是一种常见的流媒体协议。它通过将视频切片成多个 .ts 文件,并生成一个 .m3u8 播放列表,播放器就能顺序播放这些分片,实现“边下边播”。

如果你手头只有一个 MP4 文件,可以通过 ffmpeg 一键转换成 HLS 格式。


基本命令

假设源文件名为 video.mp4,我们希望把所有切片和 m3u8 索引文件放在 hls_output 文件夹中,可以使用以下命令:

mkdir -p hls_output

ffmpeg -i video.mp4 \
  -codec:v libx264 -codec:a aac -strict -2 \
  -f hls \
  -hls_time 10 \
  -hls_list_size 0 \
  -hls_segment_filename "hls_output/video_%03d.ts" \
  hls_output/video.m3u8

参数说明

  • -i video.mp4 :输入文件。

  • -codec:v libx264 -codec:a aac :转码为 H.264 视频 + AAC 音频(兼容性最佳)。

  • -f hls :指定输出格式为 HLS。

  • -hls_time 10 :每个 ts 切片时长约 10 秒。

  • -hls_list_size 0 :保留所有切片,而不是只保留最新的 N 个。

  • -hls_segment_filename "hls_output/video_%03d.ts" :输出的切片命名规则。

  • hls_output/video.m3u8 :最终生成的播放列表。

执行后,hls_output 文件夹里会生成:

  • video.m3u8

  • video_001.ts, video_002.ts, ...

这些文件可以直接用支持 HLS 的播放器(如 Safari、VLC、video.js、hls.js)播放。


缩小单个切片的大小

默认 -hls_time 10 会导致单个 ts 文件较大。可以通过缩短分片时长来减小文件体积,例如改为 4 秒:

ffmpeg -i video.mp4 \

  -codec:v libx264 -codec:a aac \
  -f hls \
  -hls_time 4 \
  -hls_list_size 0 \
  -hls_segment_filename "hls_output/video_%03d.ts" \
  hls_output/video.m3u8

<hr/>

限制每个切片不超过 2MB

HLS 本身只能按“时间”切片,而不能直接限制“大小”。<br/>但我们可以通过 码率控制 + 短时切片 来近似保证切片不超过 2MB。

例如:如果希望每个切片不超过 2MB,设定切片时长为 4 秒,那么平均码率应控制在 4Mbps 以下:

ffmpeg -i video.mp4 \
  -c:v libx264 -b:v 3500k -maxrate 4000k -bufsize 8000k \
  -c:a aac -b:a 128k \
  -f hls \
  -hls_time 4 \
  -hls_list_size 0 \
  -hls_segment_filename "hls_output/video_%03d.ts" \
  hls_output/video.m3u8

参数解释

  • -b:v 3500k :设置视频平均码率为 3.5Mbps。

  • -maxrate 4000k :限制视频峰值码率,避免瞬时切片过大。

  • -bufsize 8000k :控制码率波动范围。

  • -b:a 128k :设置音频为 128kbps。

  • -hls_time 4 :每个切片 4 秒,结合码率控制,每个 ts 文件大约 ≤ 2MB。

<hr/>

总结

  1. 使用 ffmpeg 可以轻松将 MP4 转换为 HLS 格式。

  2. -hls_time 控制切片时长,时长越短,切片文件越小。

  3. 如果需要限制切片大小,可以通过 码率控制 + 合适的切片时长 来实现。

  4. 生成的 m3u8 与 ts 文件可直接部署到 Nginx/Apache,供 Web 播放器点播。

 
评论
远方. All Rights Reserved. Theme Jasmine by Kent Liao.
蜀ICP备2023017538号-1
联系邮箱:erj@LIVE.com