跳到主要内容

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.mpegurlapplication/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: m3u8ffmpeg-pythonyt-dlp
    • JavaScript: hls.jsvideo.js
    • C/C++: libavformatlibavcodec(FFmpeg)

相关链接

参考