M3U8 格式(直播列表)
M3U8(MPEG URL List UTF-8)是苹果公司 2009 年为其 HTTP Live Streaming(HLS)协议设计的播放列表格式。本质是 UTF-8 编码的 M3U 扩展文件,通过分段 TS 文件索引实现自适应码率切换,支持 AES-128 加密,现为直播和点播平台(如 Bilibili、Twitch)的核心流媒体技术。
格式简介
M3U8 是 HLS(HTTP Live Streaming)协议使用的播放列表格式,用于索引和播放分段的视频内容。M3U8 文件是文本格式,包含视频片段的 URL 列表和元数据信息,支持自适应码率切换。
M3U8 文件扩展名为 .m3u8,MIME 类型为 application/vnd.apple.mpegurl 或 application/x-mpegURL。M3U8 格式是 HLS 流媒体的标准格式。
技术特点
核心特性
- 自适应码率:支持多个码率版本
- 分段传输:视频分成多个 TS 片段
- 加密支持:支持 AES-128 加密
- 实时更新:支持动态更新播放列表
- 简单格式:文本格式,易于解析
M3U8 vs M3U
- M3U:原始播放列表格式(ASCII)
- M3U8:UTF-8 编码的 M3U(支持 Unicode)
- 功能:M3U8 支持更多 HLS 特性
HLS 协议
M3U8 是 HLS 协议的一部分:
- 主播放列表:包含多个码率版本
- 媒体播放列表:包含具体的 TS 片段列表
- TS 片段:实际的视频数据
文件结构
M3U8 文件是文本格式,基本结构:
#EXTM3U # M3U 标识
#EXT-X-VERSION:3 # HLS 版本
#EXT-X-TARGETDURATION:10 # 目标时长(秒)
#EXT-X-MEDIA-SEQUENCE:0 # 媒体序列号
#EXT-X-KEY:METHOD=AES-128,URI="key.key",IV=0x... # 加密信息(可选)
#EXTINF:10.0, # 片段信息(时长)
segment0.ts # 片段 URL
#EXTINF:10.0,
segment1.ts
#EXTINF:10.0,
segment2.ts
#EXT-X-ENDLIST # 播放列表结束(点播)
关键标签
- #EXTM3U:M3U 文件标识
- #EXT-X-VERSION:HLS 版本号
- #EXT-X-TARGETDURATION:目标片段时长
- #EXTINF:片段信息(时长和标题)
- #EXT-X-KEY:加密密钥信息
- #EXT-X-ENDLIST:播放列表结束标记
使用场景
适用场景
- 直播流媒体:实时视频直播
- 点播平台:视频点播服务
- 自适 应流媒体:需要自适应码率的场景
- 移动端视频:移动应用中的视频播放
- CDN 分发:通过 CDN 分发视频
优缺点
优点:
- 支持自适应码率
- 适合网络传输
- 支持加密
- 简单易解析
- 广泛支持(HLS 标准)
缺点:
- 延迟相对较高(分段传输)
- 需要多个文件(播放列表 + TS 片段)
- 某些场景可能不适合
代码示例
Python 下载 M3U8
import m3u8
import requests
from urllib.parse import urljoin
# 加载 M3U8 播放列表
playlist_url = 'https://example.com/playlist.m3u8'
playlist = m3u8.load(playlist_url)
# 下载所有 TS 片段
base_url = '/'.join(playlist_url.split('/')[:-1]) + '/'
for segment in playlist.segments:
segment_url = urljoin(base_url, segment.uri)
response = requests.get(segment_url)
with open(f'segment_{segment.sequence}.ts', 'wb') as f:
f.write(response.content)
Python 使用 ffmpeg 下载
import ffmpeg
# 下载 M3U8 并转换为 MP4
ffmpeg.input('https://example.com/playlist.m3u8').output(
'output.mp4',
c='copy'
).run()
使用 FFmpeg
# 下载 M3U8 并转换为 MP4
ffmpeg -i https://example.com/playlist.m3u8 -c copy output.mp4
# 下载并转码
ffmpeg -i https://example.com/playlist.m3u8 -c:v libx264 -c:a aac output.mp4
# 使用 yt-dlp 下载
yt-dlp https://example.com/playlist.m3u8 -o output.mp4
JavaScript 播放 M3U8
// 使用 hls.js 播放 M3U8
import Hls from 'hls.js';
const video = document.getElementById('video');
const videoSrc = 'https://example.com/playlist.m3u8';
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource(videoSrc);
hls.attachMedia(video);
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
// Safari 原生支持
video.src = videoSrc;
}
相关工具
- 播放器:
- Safari:原生支持 HLS
- VLC Media Player:支持 M3U8
- hls.js:Web 播放器库
- 下载工具:
- FFmpeg:支持 M3U8 下载
- yt-dlp:视频下载工具
- N_m3u8DL:M3U8 下载工具
- 编程库:
- Python:
m3u8、ffmpeg-python、yt-dlp - JavaScript:
hls.js、video.js - C/C++:
libavformat、libavcodec(FFmpeg)
- Python: