
**FFmpeg** 是音视频处理领域的瑞士军刀,它对 HLS 协议和 M3U8 文件的支持非常全面。无论是你想将 M3U8 流媒体**下载合并**成一个 MP4 文件,还是想将一个 MP4 文件**切片**生成 M3U8 流,FFmpeg 都是最专业、最可靠的工具。
一、 M3U8 下载合并到 MP4 (HLS Client)
这是 FFmpeg 最常用的 M3U8 功能:将网络上的 M3U8 流下载并封装成 MP4 文件。
1. 无损快速下载
使用 `-c copy` 选项可以确保在下载和合并过程中不进行重新编码,这使得下载过程**速度最快**,且**画质无损**。
ffmpeg -i "http://example.com/live/index.m3u8" \
-c copy \
-bsf:a aac_adtstoasc \
output_video.mp4
- `-i`:指定输入的 M3U8 URL。
- `-c copy`:指示 FFmpeg 直接复制流数据,不做编解码。
- `-bsf:a aac_adtstoasc`:这是一个常用的**比特流过滤器**,用于解决某些 HLS 流中 AAC 音频流的封装问题。建议加上。
该命令会自动下载 M3U8 文件中列出的所有 `.ts` 片段并合并成 `output_video.mp4`。
2. 下载并重新编码 (解决兼容性问题)
如果使用 `-c copy` 失败(例如源文件编码过于老旧或格式不兼容),你需要进行重新编码:
ffmpeg -i "http://example.com/live/index.m3u8" \
-c:v libx264 -crf 23 \
-c:a aac -b:a 128k \
reencoded_video.mp4
- `-c:v libx264`:将视频编码为兼容性最好的 H.264。
- `-crf 23`:设置恒定速率因子,数值越小画质越好(文件越大)。23 是一个常用的平衡值。
- `-c:a aac`:音频编码为 AAC。
3. 下载加密的 M3U8 (AES-128)
如果 M3U8 文件包含 `#EXT-X-KEY` 标签,FFmpeg 通常可以自动识别并下载解密密钥 (Key) 进行解密。如果 Key URL 需要特殊处理(如携带 Token),可能需要手动将 Key 下载到本地,然后使用参数指引 FFmpeg:
# 假设 M3U8 文件中列出的密钥文件是 'encryption.key'
ffmpeg -i encrypted_playlist.m3u8 -c copy -map 0 output_decrypted.mp4
在大多数情况下,FFmpeg 的 HLS 解密能力已经非常强大,不需要额外的参数就能处理标准 AES-128 加密。如遇困难,请参考 M3U8加密视频处理指南。
二、 MP4 切片生成 M3U8 流 (HLS Server)
如果你想搭建自己的流媒体服务,需要将 MP4 文件切片成 M3U8/TS 流。
1. 生成简单的 VOD (点播) M3U8
将一个 MP4 文件切片成 HLS 格式,用于点播:
ffmpeg -i input.mp4 \
-c:v libx264 -c:a aac \
-hls_time 10 \
-hls_list_size 0 \
-f hls \
output_vod.m3u8
- `-hls_time 10`:设置每个视频片段 (`.ts`) 的时长为 10 秒。
- `-hls_list_size 0`:对于点播 (VOD),设置为 0 表示播放列表中包含**所有**片段。
- `-f hls`:指定输出格式为 HLS。
这会生成 `output_vod.m3u8` 和 `output_vod0.ts`, `output_vod1.ts` 等片段。
2. 生成多码率自适应流 (Master Playlist)
要实现自适应码率 (ABR),你需要为同一视频生成多个不同分辨率和码率的版本,并创建一个主播放列表 (Master M3U8)。这通常需要运行多个命令:
A. 生成 720p 媒体流:
ffmpeg -i input.mp4 \
-vf scale=1280:720 \
-c:v libx264 -b:v 2500k \
-c:a aac -b:a 128k \
-hls_time 6 \
-hls_segment_filename "720p/seg%03d.ts" \
720p/index.m3u8
B. 生成 1080p 媒体流:
ffmpeg -i input.mp4 \
-vf scale=1920:1080 \
-c:v libx264 -b:v 5000k \
-c:a aac -b:a 128k \
-hls_time 6 \
-hls_segment_filename "1080p/seg%03d.ts" \
1080p/index.m3u8
C. 手动创建 Master M3U8:(名为 `master.m3u8`)
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8
播放器只需要加载 `master.m3u8` 即可自动切换清晰度。
三、 M3U8 流媒体调试与验证
1. 验证 M3U8 文件的完整性
FFmpeg 可以在不输出文件的情况下,验证 M3U8 文件和所有片段是否能正常加载:
ffmpeg -v error -i http://example.com/test.m3u8 -f null -
如果命令运行结束且**没有任何输出**,说明 FFmpeg 成功加载和处理了所有片段。如果有错误信息,则说明 M3U8 文件或其中引用的 `.ts` 片段有问题。
2. 录制直播流的指定时长
对于直播 M3U8 源,你可以使用 `-t` 参数指定录制时长:
ffmpeg -i "http://live-stream.m3u8" -t 60 -c copy live_segment_60s.mp4
这会从开始下载 **60 秒**的直播内容并保存为 MP4。
总结
FFmpeg 是 HLS/M3U8 生态系统的基石。无论是作为内容的消费者进行下载和转换,还是作为内容的生产者进行切片和分发,FFmpeg 都提供了最灵活、最强大的命令行解决方案。通过熟练掌握这些命令,你将能完全掌控 M3U8 流媒体的生产和消费过程。
如果不想使用命令行,记住你也可以使用我们的 在线 M3U8 转 MP4 工具 来快速下载和转换。
返回博客列表