音视频ffmpeg命令大全


一、什么是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:91.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 按场景选择

  1. 网络流媒体

    • 视频:H.264 (libx264) 或 VP9
    • 音频:AAC 或 Opus
    • 推荐命令:ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
  2. 本地存储

    • 视频:H.265 (libx265) 或 AV1
    • 音频:FLAC (无损) 或 AAC (有损)
    • 推荐命令:ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a flac output.mkv
  3. 网页播放

    • 视频:VP9 或 H.264
    • 音频:Opus 或 AAC
    • 推荐命令:ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 2M -c:a libopus -b:a 96k output.webm
  4. 兼容性要求高

    • 视频: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 按质量要求选择

  1. 高质量

    • 视频:H.265 -crf 20-25,H.264 -crf 18-23
    • 音频:AAC 192k+,FLAC
  2. 中等质量

    • 视频:H.265 -crf 26-30,H.264 -crf 24-28
    • 音频:AAC 128k-192k,MP3 128k-192k
  3. 低质量(小文件)

    • 视频: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是一个功能强大的音视频处理工具,通过本文档中的命令,你可以:

  1. 格式转换:在不同音视频格式之间进行转换
  2. 音视频提取:从媒体文件中提取音频或视频
  3. 视频编辑:裁剪、合并、调整视频参数
  4. 音频处理:裁剪、混合、调整音频
  5. 屏幕录制:在不同平台上录制屏幕
  6. 直播推流:推流到RTMP服务器
  7. 图像与视频互转:视频转图片、图片转视频、视频转GIF
  8. 高级应用:批量处理、视频压缩、音频处理、视频特效

通过组合这些命令,你可以实现几乎任何音视频处理需求。FFmpeg的功能非常丰富,本文档只是涵盖了常用的部分,更多高级功能请参考FFmpeg官方文档。

参考资料


文章作者: 弈心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 弈心 !
评论
  目录