FFmpeg命令行界面

**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 工具 来快速下载和转换。

返回博客列表