← Blog.backToBlog

如何为 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)。

提供播放列表

在 HTTP(S) 上托管 .m3u8 和片段;若跨域加载播放器,需配置 CORS。错误的 Content-Type 或缺少 CORS 是常见失败原因——见CORS 修复。结构细节:格式详解

编码与规范差异

M3U 是更老的播放列表家族(常为 Latin-1/系统编码)。M3U8 是为 HLS 规范化的 UTF-8 变体,标签集更丰富(#EXT-X-*)。实践中 IPTV 服务商仍发 .m3u 频道表,而自适应流 CDN 发 .m3u8 master 与 media 列表。扩展名是提示,不是功能保证。

HLS 播放器期望 M3U8 语义(版本、discontinuity、密钥、map)。随机的电视频道 M3U 可能在 VLC 能播,但在 hls.js 失败——若它不是真正的 HLS。

对照表

M3UM3U8 / HLS
编码常为遗留UTF-8
典型用途频道表、简单列表自适应流
标签基础 EXTINFEXT-X-STREAM-INF、KEY、MAP…
分片可能指向完整文件/URLTS/fMP4 分片 + 阶梯
播放器VLC、IPTV 应用懂 HLS 的播放器、hls.js、Safari

该用哪个?

做现代网页/移动视频?打包 HLS 为 M3U8。给 IPTV 应用维护简单入口列表?仍可能见到 M3U。二者转换不总有意义——改扩展名变不出自适应阶梯。用 播放器 测试;授权 VOD 用 下载器 归档。更多:什么是 M3U8格式详解

总结

M3U8 是 UTF-8 的 HLS 播放列表;M3U 是更老、更松的列表传统。按你需要自适应流语义还是简单频道表来选——用真播放器验证,而不是只信扩展名。

常见问题解答

不用 FFmpeg 能创建 M3U8 吗?
能——若已有片段,可手写简单播放列表。

该用什么 MIME 类型?
application/vnd.apple.mpegurlapplication/x-mpegURL

需要主播放列表吗?
仅当有多个画质变体时需要。

怎么测试我的播放列表?
在我们的在线播放器中打开它。