如何为 HLS 流媒体创建 M3U8 播放列表
7 min read
手动创建简单 M3U8 播放列表
你可以用任何文本编辑器创建基本点播播放列表:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:10 #EXTINF:10.000, https://example.com/video/segment-001.ts #EXTINF:10.000, https://example.com/video/segment-002.ts #EXTINF:10.000, https://example.com/video/segment-003.ts #EXT-X-ENDLIST
保存为 .m3u8,并以正确 MIME 类型提供(如 application/vnd.apple.mpegurl)。用我们的播放器测试。
用 FFmpeg 生成 HLS 播放列表
FFmpeg 可自动创建播放列表和片段:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_playlist_type vod playlist.m3u8
这会生成媒体播放列表和 .ts 片段。多码率主列表可用 filter_complex / var_stream_map(见 FFmpeg HLS 文档)或我们的 FFmpeg 指南中的相关命令。
带多个变体的主播放列表
自适应流需要主播放列表:
#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360,CODECS="avc1.42e01e,mp4a.40.2" 360p.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d401f,mp4a.40.2" 720p.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2" 1080p.m3u8
STREAM-INF 后的每一行指向该画质的媒体播放列表。
最佳实践
- 生产环境优先用绝对 URL,避免相对路径损坏。
- 在 STREAM-INF 中包含 CODECS 以提高兼容性。
- 各变体片段时长保持一致。
- 验证播放列表并在多个播放器中测试。
- 使用 UTF-8 编码(真正的 M3U8)。
提供播放列表
编码与规范差异
M3U 是更老的播放列表家族(常为 Latin-1/系统编码)。M3U8 是为 HLS 规范化的 UTF-8 变体,标签集更丰富(#EXT-X-*)。实践中 IPTV 服务商仍发 .m3u 频道表,而自适应流 CDN 发 .m3u8 master 与 media 列表。扩展名是提示,不是功能保证。
HLS 播放器期望 M3U8 语义(版本、discontinuity、密钥、map)。随机的电视频道 M3U 可能在 VLC 能播,但在 hls.js 失败——若它不是真正的 HLS。
对照表
| M3U | M3U8 / HLS | |
|---|---|---|
| 编码 | 常为遗留 | UTF-8 |
| 典型用途 | 频道表、简单列表 | 自适应流 |
| 标签 | 基础 EXTINF | EXT-X-STREAM-INF、KEY、MAP… |
| 分片 | 可能指向完整文件/URL | TS/fMP4 分片 + 阶梯 |
| 播放器 | VLC、IPTV 应用 | 懂 HLS 的播放器、hls.js、Safari |
该用哪个?
总结
M3U8 是 UTF-8 的 HLS 播放列表;M3U 是更老、更松的列表传统。按你需要自适应流语义还是简单频道表来选——用真播放器验证,而不是只信扩展名。
常见问题解答
不用 FFmpeg 能创建 M3U8 吗?
能——若已有片段,可手写简单播放列表。
该用什么 MIME 类型?application/vnd.apple.mpegurl 或 application/x-mpegURL。
需要主播放列表吗?
仅当有多个画质变体时需要。
怎么测试我的播放列表?
在我们的在线播放器中打开它。