返回博客

即将发布

编辑团队
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个命令,您就能应对绝大多数场景:

  1. 下载场景 - 使用合适的超时和重连参数
  2. 转换场景 - 根据需求选择编码参数
  3. 创建场景 - 合理设置切片时间和列表大小
  4. 直播场景 - 注意缓冲区和延迟设置
  5. 优化场景 - 充分利用硬件加速

记住,FFmpeg的强大在于其灵活性。这些命令可以根据具体需求进行组合和调整。如果您只需要简单播放M3U8视频,使用M3U8 Player会更加便捷。

参考资源