在视频点播和在线直播场景中,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 \<hr/>-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
限制每个切片不超过 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。
总结
使用
ffmpeg
可以轻松将 MP4 转换为 HLS 格式。-hls_time
控制切片时长,时长越短,切片文件越小。如果需要限制切片大小,可以通过 码率控制 + 合适的切片时长 来实现。
生成的 m3u8 与 ts 文件可直接部署到 Nginx/Apache,供 Web 播放器点播。
评论