- 博客文章
- 即将发布
即将发布
编辑团队
2025/9/17
文章
M3U8
FFmpeg处理M3U8实战指南:50个必备命令详解
FFmpeg是处理M3U8/HLS流媒体的瑞士军刀。无论是下载、转换、切片还是推流,FFmpeg都能胜任。本文精选50个最实用的FFmpeg命令,助您成为M3U8处理专家。
FFmpeg基础知识
安装FFmpeg
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg
# CentOS/RHEL
sudo yum install epel-release
sudo yum install ffmpeg
# Windows - 使用Chocolatey
choco install ffmpeg
# 编译安装(支持更多编码器)
git clone https://git.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx
make && sudo make install
验证安装
# 查看版本
ffmpeg -version
# 查看支持的编码器
ffmpeg -encoders | grep -E "264|265|vp9"
# 查看支持的格式
ffmpeg -formats | grep m3u8
一、M3U8下载命令(10个)
1. 基础下载
ffmpeg -i "https://example.com/video.m3u8" -c copy output.mp4
2. 设置超时和重连
ffmpeg -timeout 5000000 \
-reconnect 1 \
-reconnect_at_eof 1 \
-reconnect_streamed 1 \
-reconnect_delay_max 2 \
-i "URL" -c copy output.mp4
3. 添加请求头
ffmpeg -headers $'Referer: https://example.com\r\nCookie: session=abc123' \
-i "URL" -c copy output.mp4
4. 使用代理
ffmpeg -http_proxy http://proxy.example.com:8080 \
-i "URL" -c copy output.mp4
5. 限速下载
ffmpeg -i "URL" -c copy -re output.mp4
6. 下载指定时间段
# 从10分钟开始,下载5分钟
ffmpeg -ss 00:10:00 -t 00:05:00 -i "URL" -c copy output.mp4
7. 下载并转码
ffmpeg -i "URL" \
-c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 128k \
output.mp4
8. 下载多个流
# 下载视频和音频流
ffmpeg -i "video.m3u8" -i "audio.m3u8" \
-map 0:v -map 1:a -c copy output.mp4
9. 处理加密的M3U8
ffmpeg -allowed_extensions ALL \
-protocol_whitelist "file,http,https,tcp,tls,crypto" \
-i "encrypted.m3u8" -c copy output.mp4
10. 批量下载脚本
#!/bin/bash
while IFS= read -r url; do
filename=$(basename "$url" .m3u8).mp4
ffmpeg -i "$url" -c copy "$filename"
done < urls.txt
二、M3U8转换命令(10个)
11. M3U8转MP4(保持质量)
ffmpeg -i input.m3u8 -c copy -bsf:a aac_adtstoasc output.mp4
12. 转换并压缩
ffmpeg -i input.m3u8 \
-c:v libx264 -crf 28 \
-c:a aac -b:a 96k \
-movflags +faststart \
output.mp4
13. 转换为WebM
ffmpeg -i input.m3u8 \
-c:v libvpx-vp9 -crf 30 -b:v 0 \
-c:a libopus -b:a 128k \
output.webm
14. 提取音频
# 提取为MP3
ffmpeg -i input.m3u8 -vn -c:a libmp3lame -b:a 192k output.mp3
# 提取为AAC
ffmpeg -i input.m3u8 -vn -c:a copy output.aac
15. 改变分辨率
# 转换为720p
ffmpeg -i input.m3u8 \
-vf scale=1280:720 \
-c:v libx264 -crf 23 \
-c:a copy \
output.mp4
16. 添加水印
ffmpeg -i input.m3u8 \
-i watermark.png \
-filter_complex "overlay=10:10" \
-c:v libx264 -crf 23 \
-c:a copy \
output.mp4
17. 裁剪视频
# 裁剪为16:9
ffmpeg -i input.m3u8 \
-vf "crop=1920:1080:0:0" \
-c:v libx264 -crf 23 \
-c:a copy \
output.mp4
18. 调整帧率
# 转换为30fps
ffmpeg -i input.m3u8 \
-r 30 \
-c:v libx264 -crf 23 \
-c:a copy \
output.mp4
19. 合并多个M3U8
# 创建文件列表
echo "file 'part1.m3u8'" > list.txt
echo "file 'part2.m3u8'" >> list.txt
# 合并
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
20. 转换为GIF
ffmpeg -i input.m3u8 \
-vf "fps=10,scale=320:-1:flags=lanczos" \
-t 10 \
output.gif
三、创建M3U8命令(10个)
21. 基础切片
ffmpeg -i input.mp4 \
-c:v libx264 -c:a aac \
-hls_time 10 \
-hls_list_size 0 \
-f hls \
output.m3u8
22. 多码率HLS
# 1080p
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 5000k -s 1920x1080 \
-c:a aac -b:a 192k \
-hls_time 10 -hls_list_size 0 \
-f hls stream_1080p.m3u8
# 720p
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 2800k -s 1280x720 \
-c:a aac -b:a 128k \
-hls_time 10 -hls_list_size 0 \
-f hls stream_720p.m3u8
# 创建主播放列表
cat > master.m3u8 << EOF
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=5192000,RESOLUTION=1920x1080
stream_1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2928000,RESOLUTION=1280x720
stream_720p.m3u8
EOF
23. 加密HLS流
# 生成密钥
openssl rand 16 > encrypt.key
# 创建密钥信息文件
cat > encrypt.keyinfo << EOF
https://example.com/encrypt.key
encrypt.key
$(openssl rand -hex 16)
EOF
# 切片并加密
ffmpeg -i input.mp4 \
-c:v libx264 -c:a aac \
-hls_time 10 \
-hls_key_info_file encrypt.keyinfo \
-hls_playlist_type vod \
-hls_segment_filename "segment_%03d.ts" \
output.m3u8
24. 设置片段命名
ffmpeg -i input.mp4 \
-c copy \
-hls_time 10 \
-hls_segment_filename "video_%Y%m%d_%03d.ts" \
-strftime 1 \
output.m3u8
25. 添加字幕
ffmpeg -i input.mp4 -i subtitles.srt \
-c:v libx264 -c:a aac \
-c:s webvtt \
-hls_time 10 \
-var_stream_map "v:0,a:0,s:0" \
output.m3u8
26. 生成缩略图
ffmpeg -i input.mp4 \
-c:v libx264 -c:a aac \
-hls_time 10 \
-vf "fps=1/10,scale=160:90" \
-hls_segment_filename "segment_%03d.ts" \
-f hls \
-hls_flags program_date_time+append_list \
output.m3u8
27. 设置最大片段数
ffmpeg -i input.mp4 \
-c copy \
-hls_time 10 \
-hls_list_size 5 \
-hls_flags delete_segments \
output.m3u8
28. 创建VOD播放列表
ffmpeg -i input.mp4 \
-c copy \
-hls_time 10 \
-hls_playlist_type vod \
-hls_segment_type mpegts \
output.m3u8
29. 使用fMP4容器
ffmpeg -i input.mp4 \
-c:v libx264 -c:a aac \
-hls_time 10 \
-hls_segment_type fmp4 \
-hls_fmp4_init_filename "init.mp4" \
output.m3u8
30. 自定义HLS标签
ffmpeg -i input.mp4 \
-c copy \
-hls_time 10 \
-hls_flags independent_segments \
-hls_segment_options "mpegts_flags=+initial_discontinuity" \
output.m3u8
四、直播推流命令(10个)
31. 推流到RTMP
ffmpeg -re -i input.m3u8 \
-c copy \
-f flv rtmp://live.example.com/live/stream_key
32. 屏幕录制推流
# macOS
ffmpeg -f avfoundation -i "1:0" \
-c:v libx264 -preset fast -crf 22 \
-c:a aac -b:a 128k \
-f hls -hls_time 4 \
output.m3u8
# Windows
ffmpeg -f gdigrab -i desktop \
-c:v libx264 -preset fast \
-f hls output.m3u8
33. 摄像头直播
# Linux
ffmpeg -f v4l2 -i /dev/video0 \
-c:v libx264 -preset fast \
-f hls -hls_time 2 \
-hls_list_size 3 \
-hls_flags delete_segments \
live.m3u8
34. 循环播放文件
ffmpeg -stream_loop -1 -re -i video.mp4 \
-c copy \
-f hls \
-hls_time 4 \
-hls_flags delete_segments+append_list \
loop.m3u8
35. 多路流混合
ffmpeg -i input1.m3u8 -i input2.m3u8 \
-filter_complex "[0:v][1:v]hstack=inputs=2[v]" \
-map "[v]" -map 0:a \
-c:v libx264 -c:a aac \
-f hls output.m3u8
36. 添加实时字幕
ffmpeg -i input.m3u8 \
-vf "drawtext=text='%{localtime}':fontsize=24:fontcolor=white:box=1:boxcolor=black" \
-c:v libx264 -c:a copy \
-f hls output.m3u8
37. 音频可视化
ffmpeg -i audio.mp3 \
-filter_complex "[0:a]showwaves=s=1280x720:mode=line:rate=25[v]" \
-map "[v]" -map 0:a \
-c:v libx264 -c:a aac \
-f hls visualization.m3u8
38. 延迟直播
ffmpeg -i live_input.m3u8 \
-c copy \
-muxdelay 30 \
-f hls delayed_output.m3u8
39. 录制直播流
ffmpeg -i "https://live.example.com/stream.m3u8" \
-c copy \
-f segment \
-segment_time 3600 \
-segment_format mp4 \
-strftime 1 \
"recording_%Y%m%d_%H%M%S.mp4"
40. 转发到多个目标
ffmpeg -i input.m3u8 \
-c copy -f hls output1.m3u8 \
-c copy -f hls output2.m3u8 \
-c copy -f flv rtmp://server/live/stream
五、高级处理命令(10个)
41. GPU硬件加速(NVIDIA)
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
-i input.m3u8 \
-c:v h264_nvenc -preset fast \
-c:a copy \
output.mp4
42. Intel Quick Sync加速
ffmpeg -hwaccel qsv \
-i input.m3u8 \
-c:v h264_qsv -preset fast \
-c:a copy \
output.mp4
43. 批量处理脚本
#!/bin/bash
find . -name "*.m3u8" | while read file; do
output="${file%.m3u8}.mp4"
ffmpeg -i "$file" -c copy "$output" &
done
wait
44. 质量分析
# PSNR和SSIM分析
ffmpeg -i original.mp4 -i compressed.mp4 \
-lavfi "psnr=stats_file=psnr.log;[0:v][1:v]ssim=stats_file=ssim.log" \
-f null -
45. 音视频同步修复
# 延迟音频100ms
ffmpeg -i input.m3u8 \
-itsoffset 0.1 -i input.m3u8 \
-map 0:v -map 1:a \
-c copy \
output.mp4
46. 提取关键帧
ffmpeg -i input.m3u8 \
-vf "select='eq(pict_type,I)'" \
-vsync vfr \
keyframe_%04d.png
47. 创建视频墙
ffmpeg -i input1.m3u8 -i input2.m3u8 -i input3.m3u8 -i input4.m3u8 \
-filter_complex \
"[0:v]scale=640:360[v0]; \
[1:v]scale=640:360[v1]; \
[2:v]scale=640:360[v2]; \
[3:v]scale=640:360[v3]; \
[v0][v1][v2][v3]xstack=inputs=4:layout=0_0|640_0|0_360|640_360[v]" \
-map "[v]" \
-c:v libx264 \
-f hls \
mosaic.m3u8
48. 色彩空间转换
ffmpeg -i input.m3u8 \
-vf "colorspace=all=bt709:iall=bt601-6-625:fast=1" \
-c:v libx264 -crf 18 \
-c:a copy \
output.mp4
49. 降噪处理
ffmpeg -i input.m3u8 \
-vf "hqdn3d=4.0:3.0:6.0:4.5" \
-c:v libx264 -crf 20 \
-c:a copy \
output.mp4
50. 生成播放统计
ffmpeg -i input.m3u8 \
-vf "signalstats,metadata=print:file=stats.txt" \
-f null -
性能优化技巧
CPU优化
# 使用所有CPU核心
ffmpeg -i input.m3u8 -threads 0 -c:v libx264 output.mp4
# 指定线程数
ffmpeg -i input.m3u8 -threads 8 -c:v libx264 output.mp4
# 设置编码预设(ultrafast到veryslow)
ffmpeg -i input.m3u8 -c:v libx264 -preset fast output.mp4
内存优化
# 限制缓冲区大小
ffmpeg -i input.m3u8 \
-max_muxing_queue_size 1024 \
-c copy output.mp4
# 设置分析持续时间
ffmpeg -analyzeduration 10M -probesize 10M \
-i input.m3u8 -c copy output.mp4
网络优化
# 设置缓冲区大小
ffmpeg -rtbufsize 100M -i input.m3u8 -c copy output.mp4
# 设置TCP选项
ffmpeg -rtsp_transport tcp -i input.m3u8 -c copy output.mp4
常见问题处理
问题1:时间戳错误
# 重新生成时间戳
ffmpeg -i input.m3u8 -fflags +genpts -c copy output.mp4
问题2:音视频不同步
# 使用异步参数
ffmpeg -i input.m3u8 -async 1 -c copy output.mp4
问题3:片段丢失
# 忽略错误继续
ffmpeg -err_detect ignore_err -i input.m3u8 -c copy output.mp4
问题4:编码错误
# 强制编码格式
ffmpeg -i input.m3u8 \
-c:v libx264 -profile:v baseline -level 3.0 \
-c:a aac -strict experimental \
output.mp4
调试和分析
显示详细信息
# 显示流信息
ffmpeg -i input.m3u8
# 显示详细日志
ffmpeg -v debug -i input.m3u8 -c copy output.mp4
# 只分析不处理
ffmpeg -i input.m3u8 -f null -
性能分析
# 显示处理速度
ffmpeg -i input.m3u8 -c copy -progress pipe:1 output.mp4
# 基准测试
ffmpeg -i input.m3u8 -c:v libx264 -preset fast -f null - -benchmark
FFmpeg配置文件
创建 ~/.ffmpeg/ffmpeg.conf
:
# 默认参数
-hide_banner
-loglevel warning
-stats
# 硬件加速
-hwaccel auto
# 网络设置
-timeout 5000000
-reconnect 1
-reconnect_at_eof 1
实用脚本示例
批量转换脚本
#!/bin/bash
# batch_convert.sh
INPUT_DIR="./input"
OUTPUT_DIR="./output"
THREADS=4
mkdir -p "$OUTPUT_DIR"
export -f convert_file
convert_file() {
local input="$1"
local output="$2"
ffmpeg -i "$input" \
-c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 128k \
-movflags +faststart \
"$output"
}
find "$INPUT_DIR" -name "*.m3u8" | \
parallel -j "$THREADS" convert_file {} "$OUTPUT_DIR/{/.}.mp4"
监控下载脚本
#!/bin/bash
# monitor_download.sh
URL="$1"
OUTPUT="$2"
while true; do
ffmpeg -i "$URL" \
-c copy \
-t 3600 \
-f segment \
-segment_time 300 \
-strftime 1 \
"${OUTPUT}_%Y%m%d_%H%M%S.mp4"
sleep 1
done
总结
FFmpeg是处理M3U8/HLS的强大工具,掌握这50个命令,您就能应对绝大多数场景:
- 下载场景 - 使用合适的超时和重连参数
- 转换场景 - 根据需求选择编码参数
- 创建场景 - 合理设置切片时间和列表大小
- 直播场景 - 注意缓冲区和延迟设置
- 优化场景 - 充分利用硬件加速
记住,FFmpeg的强大在于其灵活性。这些命令可以根据具体需求进行组合和调整。如果您只需要简单播放M3U8视频,使用M3U8 Player会更加便捷。