FFmpeg M3U8转换完整教程

发布于 2026-01-12

FFmpeg是最强大的开源视频处理工具,本教程将教你如何使用FFmpeg将任意视频转换为M3U8/HLS格式。

📦 安装FFmpeg

🍎 macOS

brew install ffmpeg

🐧 Ubuntu/Debian

sudo apt update && sudo apt install ffmpeg

🪟 Windows

从官网下载并添加到系统PATH:

https://ffmpeg.org/download.html

验证安装:

ffmpeg -version

🎬 基础转换命令

最简单的转换

ffmpeg -i input.mp4 \
  -codec: copy \
  -start_number 0 \
  -hls_time 10 \
  -hls_list_size 0 \
  -f hls \
  output.m3u8

参数说明:

  • -i input.mp4 - 输入文件
  • -codec: copy - 直接复制编码,不重新编码
  • -hls_time 10 - 每个片段10秒
  • -hls_list_size 0 - 保留所有片段
  • -f hls - 输出HLS格式

重新编码转换(推荐)

ffmpeg -i input.mp4 \
  -c:v libx264 -crf 23 -preset medium \
  -c:a aac -b:a 128k \
  -hls_time 6 \
  -hls_playlist_type vod \
  -hls_segment_filename "segment_%03d.ts" \
  output.m3u8

📊 多码率自适应(ABR)

为了让播放器根据网络状况自动切换画质,需要生成多个码率版本:

生成多码率版本

# 360p
ffmpeg -i input.mp4 -vf scale=640:360 -c:v libx264 -b:v 800k \
  -c:a aac -b:a 96k -hls_time 6 -hls_playlist_type vod \
  -hls_segment_filename "360p_%03d.ts" 360p.m3u8

# 720p
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -b:v 2800k \
  -c:a aac -b:a 128k -hls_time 6 -hls_playlist_type vod \
  -hls_segment_filename "720p_%03d.ts" 720p.m3u8

# 1080p
ffmpeg -i input.mp4 -vf scale=1920:1080 -c:v libx264 -b:v 5000k \
  -c:a aac -b:a 192k -hls_time 6 -hls_playlist_type vod \
  -hls_segment_filename "1080p_%03d.ts" 1080p.m3u8

创建主播放列表

手动创建 master.m3u8 文件:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p.m3u8

🔐 AES-128加密

加密可以保护视频内容,防止未授权下载。但请注意,这只是基础保护,专业用户仍可能绕过。

1. 生成密钥

openssl rand 16 > encrypt.key

2. 创建密钥信息文件

创建 encrypt.keyinfo:

https://your-server.com/encrypt.key
encrypt.key

3. 加密转换

ffmpeg -i input.mp4 \
  -c:v libx264 -c:a aac \
  -hls_time 6 \
  -hls_key_info_file encrypt.keyinfo \
  -hls_playlist_type vod \
  encrypted.m3u8

⚠️ 常见问题

音视频不同步

解决方案:添加 -async 1 参数

ffmpeg -i input.mp4 -async 1 ...

片段时长不准确

解决方案:强制关键帧间隔

-force_key_frames "expr:gte(t,n_forced*6)"

转换速度太慢

使用 -preset ultrafast(牺牲质量换速度)或启用硬件加速(如 -c:v h264_nvenc)

推荐设置

分辨率视频码率音频码率适用场景
360p600-800 kbps64-96 kbps移动网络
480p1000-1500 kbps96-128 kbps普通WiFi
720p2500-4000 kbps128 kbps高速网络
1080p4500-6000 kbps192 kbps光纤宽带

转换完成后,立即测试播放

打开M3U8播放器