一、什么是FFmpeg
FFmpeg是一个强大的开源音视频处理工具,它可以用于录制、转换和流式传输音频和视频。它支持多种格式,提供了丰富的命令行选项,是音视频处理领域的瑞士军刀。
二、基础信息查询命令
| 命令参数 | 描述 |
|---|---|
-version |
显示FFmpeg版本信息 |
-buildconf |
显示编译配置信息 |
-formats |
显示可用的文件格式(muxers+demuxers) |
-muxers |
显示可用的复用器 |
-demuxers |
显示可用的解复用器 |
-codecs |
显示可用的编解码器(decoders+encoders) |
-decoders |
显示可用的解码器 |
-encoders |
显示可用的编码器 |
-bsfs |
显示可用的比特率过滤器 |
-protocols |
显示可用的协议 |
-filters |
显示可用的过滤器 |
-pix_fmts |
显示可用的像素格式 |
-layouts |
显示标准声道名称 |
-sample_fmts |
显示可用的音频采样格式 |
-colors |
显示可用的颜色名称 |
三、核心参数说明
3.1 主要参数
| 参数 | 描述 |
|---|---|
-i |
设定输入文件/流 |
-f |
设定输出格式 |
-ss |
开始时间(格式:HH:MM:SS) |
-t |
持续时间(格式:HH:MM:SS) |
-y |
覆盖输出文件 |
-n |
不覆盖输出文件 |
-c |
设定编解码器(如 -c:v 视频编解码器,-c:a 音频编解码器) |
-copy |
直接复制流,不重新编码 |
3.2 音频参数
| 参数 | 描述 |
|---|---|
-aframes |
设置要输出的音频帧数 |
-b:a |
音频码率(如 128k) |
-ar |
音频采样率(如 44100) |
-ac |
音频声道数(如 2 表示立体声) |
-acodec |
音频编解码器 |
-an |
不处理音频 |
-af |
音频过滤器 |
3.3 视频参数
| 参数 | 描述 |
|---|---|
-vframes |
设置要输出的视频帧数 |
-b |
视频码率 |
-b:v |
视频码率(更明确的写法) |
-r |
视频帧率 |
-s |
视频分辨率(如 1920x1080) |
-vn |
不处理视频 |
-aspect |
视频宽高比(如 16:9 或 1.7777) |
-vcodec |
视频编解码器 |
-vf |
视频过滤器 |
-pix_fmt |
像素格式(如 yuv420p) |
四、常用操作命令
4.1 格式转换
4.1.1 视频格式转换
# 基本转换
ffmpeg -i input.mp4 output.avi
# 指定编解码器
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
# 保持原始编码
ffmpeg -i input.mp4 -c copy output.mkv
# 批量转换(使用shell脚本)
for file in *.mp4; do
ffmpeg -i "$file" -c copy "${file%.mp4}.mkv"
done
4.1.2 音频格式转换
# MP3转WAV
ffmpeg -i input.mp3 output.wav
# WAV转MP3
ffmpeg -i input.wav -c:a libmp3lame -b:a 128k output.mp3
# FLAC转MP3
ffmpeg -i input.flac -c:a libmp3lame -b:a 192k output.mp3
# 批量转换
for file in *.wav; do
ffmpeg -i "$file" -c:a libmp3lame -b:a 128k "${file%.wav}.mp3"
done
4.2 音视频提取
4.2.1 提取音频
# 提取音频(保持原始格式)
ffmpeg -i input.mp4 -c:a copy -vn output.aac
# 提取音频并转换格式
ffmpeg -i input.mp4 -c:a libmp3lame -b:a 128k -vn output.mp3
# 提取音频为WAV
ffmpeg -i input.mp4 -c:a pcm_s16le -vn output.wav
4.2.2 提取视频
# 提取视频(保持原始格式)
ffmpeg -i input.mp4 -c:v copy -an output.h264
# 提取视频并转换格式
ffmpeg -i input.mp4 -c:v libx264 -an output.mp4
4.2.3 提取原始数据
# 提取YUV数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p output.yuv
# 提取PCM音频数据
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le output.pcm
4.3 视频编辑
4.3.1 裁剪视频
# 从指定时间开始,截取指定时长
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:30 -c copy output.mp4
# 从开始截取到指定时间
ffmpeg -i input.mp4 -t 00:02:00 -c copy output.mp4
# 精确裁剪(使用 `-ss` 在 `-i` 之前)
ffmpeg -ss 00:01:30 -i input.mp4 -t 00:00:30 -c copy output.mp4
# 裁剪说明:crop=目标宽:目标高:目标视频左上角在原视频中横坐标:目标视频左上角在原视频中纵坐标
ffmpeg -i inputname.mp4 -vf crop=1920:1200:0:0 -threads 5 -preset ultrafast -strict -2 outputname.mp4
4.3.2 合并视频
# 使用concat协议(适用于相同编码的视频)
ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4
# 使用concat过滤器(更通用)
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
# 使用文件列表
# 创建filelist.txt文件,内容如下:
# file 'input1.mp4'
# file 'input2.mp4'
# file 'input3.mp4'
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
4.3.3 调整视频参数
# 修改分辨率
ffmpeg -i input.mp4 -s 1280x720 output.mp4
# 修改帧率
ffmpeg -i input.mp4 -r 30 output.mp4
# 修改码率
ffmpeg -i input.mp4 -b:v 2M output.mp4
# 同时修改多个参数
ffmpeg -i input.mp4 -s 1920x1080 -r 30 -b:v 4M output.mp4
# 指定视频和音频位率
ffmpeg -i input.mp4 -b:v 8000k -b:a 192k output.mp4
4.4 音频编辑
4.4.1 裁剪音频
# 从指定时间开始,截取指定时长
ffmpeg -i input.mp3 -ss 00:01:00 -t 00:00:30 -c copy output.mp3
# 截取音频(-ss为开始时间,-t为持续时间)
ffmpeg -i input.wav -ss 00:00:05 -t 00:00:10 output.wav
4.4.2 调整音频音量
# 调整音频音量
ffmpeg -i input.mp3 -af "volume=1.5" output.mp3
# 音频淡入淡出
ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=2,afade=t=out:st=8:d=2" output.mp3
4.4.3 改变音频速度
# 改变音频速度(加速)
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
# 调整音频 pitch(音调)
ffmpeg -i input.wav -filter:a "asetrate=44100*1.1" output.wav
4.4.4 音频混合
# 混合两个音频文件
ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex "amix=inputs=2:duration=first:dropout_transition=2" output.mp3
# 为视频添加音频
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4
# 在无音频的视频中添加音频
ffmpeg -i 01.mp4 -i 01.mp3 -c:v copy -c:a copy -strict experimental 01_a.mp4
4.5 视频滤镜
4.5.1 基本滤镜
# 视频裁剪
ffmpeg -i input.mp4 -vf "crop=1280:720:0:0" output.mp4
# 视频缩放
ffmpeg -i input.mp4 -vf "scale=1920:1080" output.mp4
# 视频旋转
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4 # 顺时针旋转90度
# 视频翻转
ffmpeg -i input.mp4 -vf "hflip" output.mp4 # 水平翻转
ffmpeg -i input.mp4 -vf "vflip" output.mp4 # 垂直翻转
# 改变视频对比度和亮度
ffmpeg -i record.mp4 -vf "eq=contrast=0.9:brightness=-0.1" output.mp4
4.5.2 高级滤镜
# 视频淡入淡出
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" output.mp4
# 调整亮度和对比度
ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" output.mp4
# 添加水印
ffmpeg -i input.mp4 -i watermark.png -filter_complex "[0:v][1:v]overlay=10:10" output.mp4
# 为视频添加字幕
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4
# 在视频中插入单张图片
# 其中scale是图片大小,overlay是左上角坐标
ffmpeg -i 04_演示视频.mp4 -strict -2 -vf "movie=black.png,scale=85:20[mask1];[in][mask1]overlay=95:430:enable='between (t,21,28)'" -b:v 300k -acodec copy out.mp4
# 在视频中插入多张图片
ffmpeg -i input.mp4 -strict -2 -vf "movie=1.jpg,scale=456:280[mask1];movie=2.jpg,scale=456:280[mask2];movie=3.jpg,scale=456:280[mask3];[in][mask1] overlay=400:200:enable='between (t,0,12)'[top];[top][mask2] overlay=400:200:enable='between (t,12,32)'[middle];[middle][mask3] overlay=400:200:enable='between (t,32,62)'[out]" output.mp4
4.6 字幕处理
4.6.1 字幕提取
# 从视频中提取字幕
ffmpeg -i input.mp4 -map 0:s:0 output.srt
# 提取指定语言的字幕
ffmpeg -i input.mp4 -map 0:s:1 output_en.srt
# 提取所有字幕轨道
for i in $(seq 0 9); do
ffmpeg -i input.mp4 -map 0:s:$i output_$i.srt 2>/dev/null || break
done
4.6.2 字幕转换
# SRT转ASS
ffmpeg -i input.srt output.ass
# ASS转SRT
ffmpeg -i input.ass output.srt
# 字幕时间调整(延迟2秒)
ffmpeg -i input.srt -itsoffset 2.0 output.srt
# 字幕时间缩放(速度调整为1.1倍)
ffmpeg -i input.srt -filter_complex "setpts=PTS/1.1" output.srt
4.6.3 字幕添加
# 为视频添加硬字幕(直接编码到视频中)
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4
# 为视频添加软字幕(保留为单独轨道)
ffmpeg -i input.mp4 -i subtitle.srt -c copy -c:s mov_text output.mp4
# 添加带样式的字幕
ffmpeg -i input.mp4 -vf "subtitles=subtitle.ass:force_style='FontName=Arial,FontSize=24,PrimaryColour=&HFFFFFF'" output.mp4
# 字幕位置调整
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:force_style='Alignment=2,MarginV=100'" output.mp4
4.6.4 字幕样式调整
# 批量调整字幕样式
ffmpeg -i input.srt -filter_complex "subtitles=input.srt:force_style='FontSize=20,PrimaryColour=&HFF0000'" output.srt
# 字幕颜色调整
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:force_style='PrimaryColour=&HFFFF00'" output.mp4
# 字幕背景调整
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:force_style='BackColour=&H80000000'" output.mp4
4.7 滤镜链高级使用
4.7.1 基础滤镜链
# 组合多个视频滤镜
ffmpeg -i input.mp4 -vf "scale=1920:1080,crop=1920:800:0:140,eq=brightness=0.1:contrast=1.2" output.mp4
# 组合视频和音频滤镜
ffmpeg -i input.mp4 -vf "scale=1280:720" -af "volume=1.5,highpass=f=200" output.mp4
4.7.2 高级视频效果
# 老电影效果
ffmpeg -i input.mp4 -vf "sepia=0.6,vignette=0.5:0.5:0.5:0.5:black" output.mp4
# 电影颗粒效果
ffmpeg -i input.mp4 -vf "gblur=sigma=1,noise=c0s=2" output.mp4
# 梦幻效果
ffmpeg -i input.mp4 -vf "boxblur=1:1:1:1:1,eq=brightness=0.1:saturation=1.2" output.mp4
# 黑白电影效果
ffmpeg -i input.mp4 -vf "hue=s=0" output.mp4
# 锐化效果
ffmpeg -i input.mp4 -vf "unsharp=5:5:1.0:5:5:0.0" output.mp4
4.7.3 复杂滤镜链示例
# 视频转场效果
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]fade=t=out:st=4:d=1[outv0];[1:v]fade=t=in:st=0:d=1[outv1];[outv0][outv1]concat=n=2:v=1:a=0[outv]" -map "[outv]" output.mp4
# 画中画效果
ffmpeg -i main.mp4 -i inset.mp4 -filter_complex "[1:v]scale=320:180[inset];[0:v][inset]overlay=10:10" output.mp4
# 分屏效果
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v]scale=640:360[left];[1:v]scale=640:360[right];[left][right]hstack" output.mp4
# 上下分屏
ffmpeg -i top.mp4 -i bottom.mp4 -filter_complex "[0:v]scale=1280:540[top];[1:v]scale=1280:540[bottom];[top][bottom]vstack" output.mp4
4.7.4 音频滤镜链
# 音频增强
ffmpeg -i input.mp3 -af "afftdn=nf=-25,equalizer=f=1000:t=h:width=200:g=10,compand" output.mp3
# 环绕声效果
ffmpeg -i input.mp3 -af "pan=5.1|c0=c0|c1=c1|c2=c2|c3=c3|c4=0.5*c0+0.5*c1|c5=0.5*c2+0.5*c3" output.mp3
# 音频淡入淡出
ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=2,afade=t=out:st=8:d=2" output.mp3
# 语音增强
ffmpeg -i input.mp3 -af "highpass=f=200,lowpass=f=3000,volume=2.0" output.mp3
4.8 屏幕录制
4.8.1 Windows平台
# 查看可用的DirectShow设备
ffmpeg -list_devices true -f dshow -i dummy
# 使用DirectShow录制屏幕
ffmpeg -f dshow -i video="screen-capture-recorder" output.mp4
# 使用GDI抓取屏幕(无需额外安装)
ffmpeg -f gdigrab -framerate 30 -i desktop output.mp4
# 录制特定窗口
ffmpeg -f gdigrab -framerate 30 -i title="窗口标题" output.mp4
# 录制屏幕和音频
ffmpeg -f dshow -i video="screen-capture-recorder":audio="麦克风 (Realtek Audio)" output.mp4
# 指定录制参数
ffmpeg -f dshow -video_size 1920x1080 -framerate 30 -pixel_format yuv420p -i video="screen-capture-recorder" output.mp4
4.8.2 Linux平台
# 录制屏幕
ffmpeg -video_size 1920x1080 -framerate 25 -f x11grab -i :0.0 output.mp4
# 录制屏幕和音频
ffmpeg -video_size 1920x1080 -framerate 25 -f x11grab -i :0.0 -f pulse -ac 2 -i default output.mkv
# 使用X11抓取屏幕
ffmpeg -f x11grab -s 1920x1080 -framerate 30 -i :0.0 output.mp4
# 使用Wayland抓取屏幕(需要pipewire)
ffmpeg -f pipewire -i "$(pw-dump | jq -r '.[] | select(.info.name=="Screen").id')" output.mp4
# 查看ALSA音频设备
arecord -l
# 使用ALSA录制音频
ffmpeg -f alsa -i hw:0 output.wav
4.8.3 macOS平台
# 查看可用的AVFoundation设备
ffmpeg -f avfoundation -list_devices true -i ""
# 录制屏幕
ffmpeg -f avfoundation -i 1 -r 30 output.mp4
# 录制屏幕和音频
ffmpeg -f avfoundation -i 1:0 -r 30 output.mp4
# 使用QTKit抓取(旧版本macOS)
ffmpeg -f qtkit -i "default" output.mp4
4.9 直播推流
4.9.1 推流到RTMP服务器
# 推流本地视频
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamName
# 推流摄像头
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset veryfast -b:v 2M -maxrate 2M -bufsize 4M -c:a aac -b:a 128k -f flv rtmp://server/live/streamName
# 推流屏幕
ffmpeg -f x11grab -s 1920x1080 -r 30 -i :0.0 -c:v libx264 -preset veryfast -b:v 2M -maxrate 2M -bufsize 4M -c:a aac -b:a 128k -f flv rtmp://server/live/streamName
4.9.2 拉流保存为文件或转码
# 拉流并保存为文件
ffmpeg -i rtmp://server/live/streamName -c copy output.flv
# 拉流并转码
ffmpeg -i rtmp://server/live/streamName -c:v libx264 -c:a aac output.mp4
4.10 3D和HDR视频处理
4.10.1 3D视频处理
# 左右格式3D转红蓝格式
ffmpeg -i input_3d.mp4 -vf "stereo3d=sbsl:arcc" output_anaglyph.mp4
# 上下格式3D转红蓝格式
ffmpeg -i input_3d.mp4 -vf "stereo3d=tabr:arcc" output_anaglyph.mp4
# 3D转2D
ffmpeg -i input_3d.mp4 -vf "stereo3d=sbsl:mono" output_2d.mp4
# 2D转3D(左右格式)
ffmpeg -i input_2d.mp4 -vf "stereo3d=mono:sbsl" output_3d.mp4
# 调整3D深度
ffmpeg -i input_3d.mp4 -vf "stereo3d=sbsl:sbsl,depth=0.5" output_adjusted.mp4
4.10.2 HDR视频处理
# 查看HDR元数据
ffprobe -v quiet -print_format json -show_streams -show_format input_hdr.mp4
# HDR转SDR
ffmpeg -i input_hdr.mp4 -vf "zscale=t=linear:npl=100,format=yuv420p" -c:v libx264 -crf 23 output_sdr.mp4
# SDR转HDR
ffmpeg -i input_sdr.mp4 -vf "zscale=t=bt709:m=bt709:r=tv,format=yuv420p10le" -c:v libx265 -crf 25 -x265-params "hdr-opt=1:repeat-headers=1:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)" output_hdr.mp4
# 调整HDR亮度
ffmpeg -i input_hdr.mp4 -vf "zscale=t=linear:npl=100,eq=brightness=0.1" -c:v libx265 -crf 25 output_adjusted.mp4
# HDR视频转码(保持HDR)
ffmpeg -i input_hdr.mp4 -c:v libx265 -crf 25 -preset medium -x265-params "hdr-opt=1:repeat-headers=1" output_hdr.mp4
4.11 图像与视频互转
4.11.1 视频转图像序列
# 提取帧为图片
ffmpeg -i input.mp4 -r 1 -f image2 frame-%04d.jpg
# 提取指定时间的帧
ffmpeg -i input.mp4 -ss 00:01:23 -vframes 1 output.jpg
# 提取高质量缩略图
ffmpeg -i input.mp4 -ss 00:01:23 -vframes 1 -q:v 2 output.jpg
4.11.2 图像序列转视频
# 基本转换
ffmpeg -i frame-%04d.jpg -r 30 output.mp4
# 指定编码和参数
ffmpeg -i frame-%04d.jpg -c:v libx264 -preset medium -crf 23 -r 30 output.mp4
# 图片转视频(带背景)
ffmpeg -loop 1 -i image.jpg -c:v libx264 -t 10 -r 30 output.mp4
# 单张图片转视频
ffmpeg -ss 0 -t 57 -f lavfi -i color=c=0x000000:s=1280x720:r=5 -i 01.png -filter_complex "[1:v]scale=1280:720[v1];[0:v][v1]overlay=0:0[outv]" -map [outv] -c:v libx264 01.mp4
# PNG图片转视频
ffmpeg -r 25 -minrate 25 -loop 1 -i op_084.png -pix_fmt yuv420p -vcodec libx264 -r:v 25 -minrate:v 25 -preset medium -crf 30 -s 1104x828 -vframes 250 -r 25 -minrate 25 -t 3 op_084_test.mp4
4.11.3 视频转GIF
# 基本转换
ffmpeg -i input.mp4 -vf "scale=640:-1" output.gif
# 高质量GIF
ffmpeg -i input.mp4 -vf "scale=640:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
# 截取部分转换为GIF
ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:05 -vf "scale=640:-1" output.gif
# 高质量视频转GIF(无明显噪点)
# 注:生成gif后再压缩极为麻烦,如有压缩大小需求,最好对原视频文件做等比缩小、指定更低帧率等操作,再用以下命令转为gif
ffmpeg -i "test.mp4" -s 642x358 -vf "[in]scale=642x358,split[split1][split2];[split1]palettegen=stats_mode=single[pal];[split2][pal]paletteuse=new=1" test.gif
4.12 音频处理
4.12.1 音频降噪
ffmpeg -i input.wav -af "afftdn=nf=-25" output.wav
4.12.2 音频均衡
ffmpeg -i input.wav -af "equalizer=f=1000:t=h:width=200:g=10" output.wav
4.12.3 音频速度调整
ffmpeg -i input.wav -filter:a "atempo=1.2" output.wav
4.12.4 音频 Pitch 调整
ffmpeg -i input.wav -filter:a "asetrate=44100*1.1" output.wav
4.12.5 查看音频格式
ffprobe input.wav
4.12.6 修改音频采样率
ffmpeg -i input.wav -ar 16000 output.wav
4.12.7 多通道变单通道
ffmpeg -i input.wav -ac 1 output.wav
4.12.8 转换音频格式
ffmpeg -i input.mp3 output.wav
ffmpeg -i input.flac output.wav
4.12.9 提取一个通道并重采样
ffmpeg -i input.wav -ac 1 -ar 16000 output.wav
4.12.10 修改采样精度(位数)
ffmpeg -y -i input.wav -acodec pcm_f32le -ac 1 -ar 16000 -vn output.wav
五、高级应用
5.1 批量处理
5.1.1 批量转码
# Windows批处理
for %%i in (*.mp4) do ffmpeg -i "%%i" -c:v libx265 -c:a aac "%%~ni_hevc.mp4"
# Linux/macOS shell脚本
for file in *.mp4; do
ffmpeg -i "$file" -c:v libx265 -c:a aac "${file%.mp4}_hevc.mp4"
done
# 批量转码为WebM格式(适合网页)
for file in *.mp4; do
ffmpeg -i "$file" -c:v libvpx-vp9 -c:a libopus "${file%.mp4}.webm"
done
# 批量转码为低分辨率版本(适合移动设备)
for file in *.mp4; do
ffmpeg -i "$file" -s 1280x720 -b:v 1M -c:a aac -b:a 128k "${file%.mp4}_720p.mp4"
done
5.1.2 批量截取缩略图
for file in *.mp4; do
ffmpeg -i "$file" -ss 00:00:30 -vframes 1 "${file%.mp4}.jpg"
done
# 批量截取多个缩略图
for file in *.mp4; do
for i in 10 30 60; do
ffmpeg -i "$file" -ss 00:00:$i -vframes 1 "${file%.mp4}_${i}s.jpg"
done
done
# 批量截取高质量缩略图
for file in *.mp4; do
ffmpeg -i "$file" -ss 00:00:30 -vframes 1 -q:v 2 "${file%.mp4}_high.jpg"
done
5.1.3 批量添加水印
# 批量添加文字水印
for file in *.mp4; do
ffmpeg -i "$file" -vf "drawtext=text='Watermark':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=10:y=10" "${file%.mp4}_watermarked.mp4"
done
# 批量添加图片水印
for file in *.mp4; do
ffmpeg -i "$file" -i watermark.png -filter_complex "[0:v][1:v]overlay=10:10" "${file%.mp4}_watermarked.mp4"
done
5.1.4 批量提取字幕
for file in *.mp4; do
ffmpeg -i "$file" -map 0:s:0 "${file%.mp4}.srt" 2>/dev/null || echo "No subtitle found in $file"
done
5.1.5 批量调整音频音量
for file in *.mp3; do
ffmpeg -i "$file" -af "volume=1.5" "${file%.mp3}_louder.mp3"
done
5.1.6 批量转换音频格式
# 批量转换为MP3
for file in *.wav; do
ffmpeg -i "$file" -c:a libmp3lame -b:a 128k "${file%.wav}.mp3"
done
# 批量转换为AAC
for file in *.wav; do
ffmpeg -i "$file" -c:a aac -b:a 128k "${file%.wav}.aac"
done
5.2 视频压缩
# 基本压缩
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
# 高压缩(更小文件)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -c:a aac -b:a 96k output.mp4
# 使用H.265编码(更好的压缩率)
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac -b:a 128k output.mp4
5.3 视频特效
# 慢动作
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output_slow.mp4
# 快动作
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output_fast.mp4
# 倒放
ffmpeg -i input.mp4 -vf "reverse" -af "areverse" output_reversed.mp4
# 视频 stabilization(防抖)
ffmpeg -i input.mp4 -vf "vidstabdetect=shakiness=10:accuracy=15" -f null -
ffmpeg -i input.mp4 -vf "vidstabtransform=smoothing=30" output_stabilized.mp4
六、常见问题与解决方案
6.1 编码错误
问题:Unknown encoder 'libx265'
解决方案:安装支持H.265编码的FFmpeg版本
6.2 推流失败
问题:Connection refused
解决方案:检查RTMP服务器地址是否正确,服务器是否运行
6.3 内存不足
问题:Out of memory
解决方案:减小输入文件大小,或增加系统内存
6.4 速度缓慢
问题:编码速度太慢
解决方案:使用更快的预设,如 -preset veryfast
6.5 音频不同步
问题:视频和音频不同步
解决方案:使用 -async 1 参数,或重新编码音视频
6.6 muxing queue 溢出
问题:Too many packets buffered for output stream 0:1.
解决方案:增加muxing队列大小
ffmpeg -i in.mp4 -max_muxing_queue_size 1024 out.mp4
七、性能优化
7.1 硬件加速
# 使用NVIDIA GPU加速(Windows)
ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4
# 使用NVIDIA GPU加速(Linux)
ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4
# 使用Intel Quick Sync Video
ffmpeg -i input.mp4 -c:v h264_qsv output.mp4
7.2 多线程处理
# 指定线程数
ffmpeg -i input.mp4 -threads 4 output.mp4
# 使用自动线程数
ffmpeg -i input.mp4 -threads 0 output.mp4
7.3 编码预设
# 快速编码(质量稍低)
ffmpeg -i input.mp4 -preset ultrafast output.mp4
# 平衡速度和质量
ffmpeg -i input.mp4 -preset medium output.mp4
# 高质量编码(速度较慢)
ffmpeg -i input.mp4 -preset slow output.mp4
八、编解码器选择指南
8.1 视频编解码器对比
| 编解码器 | 特点 | 适用场景 | 命令示例 |
|---|---|---|---|
| H.264 (libx264) | 兼容性好,编码速度快 | 广泛使用,适合大多数场景 | -c:v libx264 -crf 23 |
| H.265 (libx265) | 压缩率高,文件小 | 存储、流媒体,适合高质量要求 | -c:v libx265 -crf 28 |
| VP9 (libvpx-vp9) | 开源,适合网页 | 网页播放,YouTube等平台 | -c:v libvpx-vp9 -b:v 2M |
| AV1 (libaom-av1) | 最高压缩率 | 未来趋势,适合长期存储 | -c:v libaom-av1 -crf 30 |
| MPEG-4 (libxvid) | 旧格式,兼容性好 | 旧设备兼容 | -c:v libxvid -b:v 1M |
8.2 音频编解码器对比
| 编解码器 | 特点 | 适用场景 | 命令示例 |
|---|---|---|---|
| AAC (aac) | 主流音频编码 | 大多数场景,移动设备 | -c:a aac -b:a 128k |
| MP3 (libmp3lame) | 广泛兼容 | 旧设备,广泛使用 | -c:a libmp3lame -b:a 128k |
| Opus (libopus) | 低比特率下质量好 | 网络流媒体,语音通话 | -c:a libopus -b:a 64k |
| FLAC (flac) | 无损压缩 | 音乐收藏,高质量音频 | -c:a flac |
| PCM (pcm_s16le) | 无压缩 | 专业音频处理 | -c:a pcm_s16le |
8.3 编解码器选择建议
8.3.1 按场景选择
网络流媒体
- 视频:H.264 (libx264) 或 VP9
- 音频:AAC 或 Opus
- 推荐命令:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
本地存储
- 视频:H.265 (libx265) 或 AV1
- 音频:FLAC (无损) 或 AAC (有损)
- 推荐命令:
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a flac output.mkv
网页播放
- 视频:VP9 或 H.264
- 音频:Opus 或 AAC
- 推荐命令:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 2M -c:a libopus -b:a 96k output.webm
兼容性要求高
- 视频:H.264 (baseline profile)
- 音频:MP3
- 推荐命令:
ffmpeg -i input.mp4 -c:v libx264 -profile:v baseline -c:a libmp3lame -b:a 128k output.mp4
8.3.2 按质量要求选择
高质量
- 视频:H.265 -crf 20-25,H.264 -crf 18-23
- 音频:AAC 192k+,FLAC
中等质量
- 视频:H.265 -crf 26-30,H.264 -crf 24-28
- 音频:AAC 128k-192k,MP3 128k-192k
低质量(小文件)
- 视频:H.265 -crf 31-35,H.264 -crf 29-33
- 音频:AAC 64k-128k,Opus 64k
8.4 编码参数调优
8.4.1 H.264 调优
# 高质量编码
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow -tune film output.mp4
# 平衡速度和质量
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4
# 快速编码
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset veryfast output.mp4
8.4.2 H.265 调优
# 高质量编码
ffmpeg -i input.mp4 -c:v libx265 -crf 22 -preset slow output.mp4
# 平衡速度和质量
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium output.mp4
# 快速编码
ffmpeg -i input.mp4 -c:v libx265 -crf 32 -preset veryfast output.mp4
8.4.3 硬件编码调优
# NVIDIA GPU 编码 (H.264)
ffmpeg -i input.mp4 -c:v h264_nvenc -preset medium -b:v 2M output.mp4
# NVIDIA GPU 编码 (H.265)
ffmpeg -i input.mp4 -c:v hevc_nvenc -preset medium -b:v 1.5M output.mp4
# Intel QSV 编码
ffmpeg -i input.mp4 -c:v h264_qsv -preset medium -b:v 2M output.mp4
# AMD VCE 编码
ffmpeg -i input.mp4 -c:v h264_amf -preset medium -b:v 2M output.mp4
九、实用脚本
9.1 实用脚本
9.2 视频信息查看器
#!/bin/bash
for file in "$@"; do
echo "=== $file ==="
ffprobe -v quiet -print_format json -show_format -show_streams "$file"
echo
done
9.3 批量视频压缩
#!/bin/bash
# 批量压缩视频到指定大小
target_size_mb=50
for file in *.mp4; do
duration=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "$file")
target_bitrate=$((target_size_mb * 8192 / duration))
echo "Compressing $file to ~${target_size_mb}MB..."
ffmpeg -i "$file" -b:v ${target_bitrate}k -c:a aac -b:a 128k "compressed_${file}"
done
9.4 直播推流脚本
#!/bin/bash
# 直播推流脚本
rtmp_url="rtmp://your-server/live/stream"
camera_device="/dev/video0"
ffmpeg -f v4l2 -i $camera_device \
-c:v libx264 -preset veryfast -b:v 2M -maxrate 2M -bufsize 4M \
-c:a aac -b:a 128k \
-f flv $rtmp_url
十、安全性考虑和最佳实践
10.1 文件安全性
注意事项:
- 输入文件验证:在处理用户提供的文件时,始终验证文件格式和内容,避免处理恶意文件
- 路径安全:避免使用用户输入构建文件路径,防止路径遍历攻击
- 输出文件保护:使用
-n参数避免覆盖现有文件,或明确使用-y确认覆盖
最佳实践:
# 验证输入文件格式
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4
# 安全处理用户输入
input_file="$(realpath "$input_file")"
output_file="output_$(date +%s).mp4"
# 限制文件大小
ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 input.mp4
10.2 网络安全性
注意事项:
- RTMP推流安全:使用安全的RTMP服务器,避免明文传输敏感信息
- 网络协议安全:优先使用HTTPS、RTMPS等加密协议
- 输入验证:验证网络输入源,避免连接到恶意服务器
最佳实践:
# 使用RTMPS加密推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmps://secure-server/live/stream
# 限制网络带宽
ffmpeg -i input.mp4 -b:v 1M -maxrate 1.2M -bufsize 2M output.mp4
# 设置超时
ffmpeg -i rtmp://server/live/stream -timeout 30 -c copy output.flv
10.3 系统安全性
注意事项:
- 权限管理:以非root用户运行FFmpeg,避免权限提升
- 资源限制:设置合理的资源限制,防止DoS攻击
- 临时文件:清理临时文件,避免磁盘空间耗尽
最佳实践:
# 限制CPU使用率
ffmpeg -i input.mp4 -threads 2 output.mp4
# 限制内存使用
ffmpeg -i input.mp4 -max_alloc 500M output.mp4
# 清理临时文件
trap "rm -f /tmp/*.tmp" EXIT
ffmpeg -i input.mp4 -c copy /tmp/temp.mp4 && mv /tmp/temp.mp4 output.mp4
10.4 编码安全性
注意事项:
- 编解码器安全:使用最新版本的编解码器,避免已知漏洞
- 参数验证:验证编码参数,避免无效参数导致的崩溃
- 输出验证:验证输出文件的完整性和格式
最佳实践:
# 使用安全的编解码器参数
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -tune film output.mp4
# 验证输出文件
ffprobe -v error -i output.mp4
# 检查编解码器版本
ffmpeg -encoders | grep libx264
10.5 隐私保护
注意事项:
- 元数据处理:移除敏感元数据,如GPS信息、拍摄设备等
- 水印添加:为视频添加水印,保护版权
- 内容审核:在处理用户生成内容时进行审核
最佳实践:
# 移除元数据
ffmpeg -i input.mp4 -map_metadata -1 -c copy output.mp4
# 添加版权水印
ffmpeg -i input.mp4 -vf "drawtext=text='Copyright 2024':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=10:y=10" output.mp4
# 模糊处理敏感信息
ffmpeg -i input.mp4 -vf "boxblur=10:10:10:10:10@100:100:200:200" output.mp4
十一、版本差异说明
11.1 主要版本差异
| 版本 | 主要变化 | 命令差异 |
|---|---|---|
| FFmpeg 2.8 | 引入libx265支持 | -c:v libx265 可用 |
| FFmpeg 3.0 | 改进VP9编码 | -c:v libvpx-vp9 性能提升 |
| FFmpeg 4.0 | 引入AV1支持 | -c:v libaom-av1 可用 |
| FFmpeg 4.1 | 改进HDR支持 | 新增HDR元数据处理 |
| FFmpeg 4.2 | 改进硬件加速 | 新增更多GPU编码选项 |
| FFmpeg 5.0 | 改进滤镜系统 | 新增更多高级滤镜 |
| FFmpeg 6.0 | 改进AV1编码 | 性能和质量提升 |
| FFmpeg 7.0 | 改进硬件加速 | 支持更多现代GPU |
11.2 命令兼容性
FFmpeg 3.0+ 特有命令:
# 使用libx265编码
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
# 使用VP9编码
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 2M output.webm
FFmpeg 4.0+ 特有命令:
# 使用AV1编码
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 output.mp4
# HDR处理
ffmpeg -i input_hdr.mp4 -vf "zscale=t=linear:npl=100" output_sdr.mp4
FFmpeg 5.0+ 特有命令:
# 使用新滤镜语法
ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1920:1080;[0:a]volume=1.5" output.mp4
# 改进的硬件加速
ffmpeg -i input.mp4 -c:v hevc_nvenc -preset medium output.mp4
11.3 版本检测
# 检查FFmpeg版本
ffmpeg -version
# 检查特定编解码器是否可用
ffmpeg -encoders | grep libx265
# 检查滤镜是否可用
ffmpeg -filters | grep scale
十二、实际应用案例
12.1 案例1:视频网站转码流程
需求: 将用户上传的视频转码为多种分辨率和格式,适合不同设备播放
解决方案:
# 高分辨率版本(1080p)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k -s 1920x1080 output_1080p.mp4
# 中等分辨率版本(720p)
ffmpeg -i input.mp4 -c:v libx264 -crf 25 -preset medium -c:a aac -b:a 128k -s 1280x720 output_720p.mp4
# 低分辨率版本(480p)
ffmpeg -i input.mp4 -c:v libx264 -crf 27 -preset medium -c:a aac -b:a 96k -s 854x480 output_480p.mp4
# WebM版本(适合网页)
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -c:a libopus -b:a 96k output.webm
12.2 案例2:直播推流系统
需求: 从摄像头和麦克风采集音视频,推流到RTMP服务器
解决方案:
# 基本推流
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:0 -c:v libx264 -preset veryfast -b:v 2M -maxrate 2M -bufsize 4M -c:a aac -b:a 128k -f flv rtmp://server/live/stream
# 带水印的推流
ffmpeg -f v4l2 -i /dev/video0 -i watermark.png -filter_complex "[0:v][1:v]overlay=10:10" -c:v libx264 -preset veryfast -b:v 2M -c:a aac -b:a 128k -f flv rtmp://server/live/stream
# 多平台推流
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:0 -c:v libx264 -preset veryfast -b:v 2M -c:a aac -b:a 128k -f flv rtmp://server1/live/stream -c:v libx264 -preset veryfast -b:v 1.5M -c:a aac -b:a 128k -f flv rtmp://server2/live/stream
12.3 案例3:音频处理系统
需求: 处理音频文件,包括降噪、均衡、格式转换等
解决方案:
# 音频降噪和均衡
ffmpeg -i input.wav -af "afftdn=nf=-25,equalizer=f=1000:t=h:width=200:g=10" output_processed.wav
# 批量转换音频格式
for file in *.wav; do
ffmpeg -i "$file" -c:a libmp3lame -b:a 128k "${file%.wav}.mp3"
ffmpeg -i "$file" -c:a aac -b:a 128k "${file%.wav}.aac"
done
# 音频剪辑和合并
ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" output_combined.mp3
12.4 案例4:视频监控系统
需求: 录制监控摄像头视频,定期压缩和存储
解决方案:
# 录制摄像头视频
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset medium -b:v 1M -c:a aac -b:a 64k -f segment -segment_time 3600 -segment_format mp4 -segment_atclocktime 1 -strftime 1 output_%Y%m%d_%H%M%S.mp4
# 压缩旧视频
find . -name "*.mp4" -mtime +7 -exec ffmpeg -i {} -c:v libx265 -crf 30 -c:a aac -b:a 64k compressed_{} \; -exec rm {} \;
# 提取关键帧
for file in *.mp4; do
ffmpeg -i "$file" -ss 00:00:00 -vframes 1 "${file%.mp4}.jpg"
done
十三、跨平台注意事项
13.1 Windows 平台
特殊命令:
# 查看可用的DirectShow设备
ffmpeg -list_devices true -f dshow -i dummy
# 使用DirectShow录制屏幕
ffmpeg -f dshow -i video="screen-capture-recorder" output.mp4
# 使用GDI抓取屏幕(无需额外安装)
ffmpeg -f gdigrab -framerate 30 -i desktop output.mp4
# 录制特定窗口
ffmpeg -f gdigrab -framerate 30 -i title="窗口标题" output.mp4
注意事项:
- Windows 平台需要安装
screen-capture-recorder才能使用 dshow 录制屏幕 - GDI 抓取性能较好,但可能会有闪烁
- 路径中包含空格时需要用引号包围
- 某些版本的 Windows 可能需要管理员权限
13.2 Linux 平台
特殊命令:
# 使用X11抓取屏幕
ffmpeg -f x11grab -s 1920x1080 -framerate 30 -i :0.0 output.mp4
# 使用Wayland抓取屏幕(需要pipewire)
ffmpeg -f pipewire -i "$(pw-dump | jq -r '.[] | select(.info.name=="Screen").id')" output.mp4
# 查看ALSA音频设备
arecord -l
# 使用ALSA录制音频
ffmpeg -f alsa -i hw:0 output.wav
注意事项:
- X11抓取需要安装
x11grab支持 - Wayland 抓取需要 pipewire 支持
- 某些Linux发行版可能需要安装额外的编解码器
- 权限问题可能会影响设备访问
13.3 macOS 平台
特殊命令:
# 查看可用的AVFoundation设备
ffmpeg -f avfoundation -list_devices true -i ""
# 录制屏幕
ffmpeg -f avfoundation -i 1 -r 30 output.mp4
# 录制屏幕和音频
ffmpeg -f avfoundation -i 1:0 -r 30 output.mp4
# 使用QTKit抓取(旧版本macOS)
ffmpeg -f qtkit -i "default" output.mp4
注意事项:
- macOS 10.15+ 需要授予屏幕录制权限
- AVFoundation 是macOS的默认抓取方式
- 某些编解码器可能需要通过Homebrew安装
- 路径分隔符使用正斜杠
/
十四、常见使用场景
本节汇总了FFmpeg在实际应用中的常见使用场景,为了避免重复,具体命令请参考前面的对应章节。
14.1 音视频提取
- 提取YUV数据:参考「常用操作命令 → 音视频提取」章节
- 提取PCM音频数据:参考「常用操作命令 → 音视频提取」章节
- 提取原始视频/音频:参考「常用操作命令 → 音视频提取」章节
14.2 视频编辑
- 视频裁剪:参考「常用操作命令 → 视频编辑 → 裁剪视频」章节
- 视频合并:参考「常用操作命令 → 视频编辑 → 合并视频」章节
- 参数调整:参考「常用操作命令 → 视频编辑 → 调整视频参数」章节
14.3 格式转换
- 封装格式转换:参考「常用操作命令 → 格式转换」章节
- 编码格式转换:参考「常用操作命令 → 格式转换」章节
- 参数调整:参考「常用操作命令 → 视频编辑 → 调整视频参数」章节
14.4 图像与视频互转
- 视频转图片:参考「常用操作命令 → 图像与视频互转 → 视频转图像序列」章节
- 图片转视频:参考「常用操作命令 → 图像与视频互转 → 图像序列转视频」章节
- 视频转GIF:参考「常用操作命令 → 图像与视频互转 → 视频转GIF」章节
14.5 屏幕录制
- Windows平台:参考「常用操作命令 → 屏幕录制 → Windows平台」章节
- Linux平台:参考「常用操作命令 → 屏幕录制 → Linux平台」章节
- macOS平台:参考「常用操作命令 → 屏幕录制 → macOS平台」章节
14.6 直播推流
- RTMP推流:参考「常用操作命令 → 直播推流 → 推流到RTMP服务器」章节
- 拉流保存:参考「常用操作命令 → 直播推流 → 拉流保存」章节
14.7 高级应用
- 批量处理:参考「高级应用 → 批量处理」章节
- 视频压缩:参考「高级应用 → 视频压缩」章节
- 音频处理:参考「高级应用 → 音频处理」章节
- 视频特效:参考「高级应用 → 视频特效」章节
14.8 性能优化
- 硬件加速:参考「性能优化 → 硬件加速」章节
- 多线程处理:参考「性能优化 → 多线程处理」章节
- 编码预设:参考「性能优化 → 编码预设」章节
14.9 3D和HDR视频处理
- 3D视频转换:参考「常用操作命令 → 3D和HDR视频处理 → 3D视频处理」章节
- HDR转换:参考「常用操作命令 → 3D和HDR视频处理 → HDR视频处理」章节
十五、总结
FFmpeg是一个功能强大的音视频处理工具,通过本文档中的命令,你可以:
- 格式转换:在不同音视频格式之间进行转换
- 音视频提取:从媒体文件中提取音频或视频
- 视频编辑:裁剪、合并、调整视频参数
- 音频处理:裁剪、混合、调整音频
- 屏幕录制:在不同平台上录制屏幕
- 直播推流:推流到RTMP服务器
- 图像与视频互转:视频转图片、图片转视频、视频转GIF
- 高级应用:批量处理、视频压缩、音频处理、视频特效
通过组合这些命令,你可以实现几乎任何音视频处理需求。FFmpeg的功能非常丰富,本文档只是涵盖了常用的部分,更多高级功能请参考FFmpeg官方文档。