FFmpeg常用命令汇总

FFmpeg常用命令汇总
Vc工具箱一、命令基本格式及参数
1 | ffmpeg [global_options] {[input_file_options] -i input_url} ... |
一些参数:
| 参数 | 说明 |
|---|---|
| -f fmt(输入 / 输出) | 强制输入或输出文件格式 |
| -y(全局参数) | 覆盖输出文件而不询问 |
| -n(全局参数) | 不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出 |
| -c:[stream_specifier] codec | 选择一个编码器或解码器,用于一个或多个流。codec 是编解码器的名称或 copy 指示流不被重新编码。例如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT |
| -t duration n(输入 / 输出) | 用作输入选项时 (在 -i 之前),限制从输入文件读取的数据的持续时间。用作输出选项时 (在输出 url 之前),在到达持续时间之后停止输出 |
| -vframes num(输出) | 设置要输出的视频帧的数量 |
| -vcodec 编解码器 (输出) | 设置视频编解码器 |
| -vf filtergraph(输出) | 创建由 filtergraph 指定的过滤器图,并使用它来过滤流 |
| -acodec 编解码器 (输入 / 输出) | 设置音频编解码器 |
| -sample_fmt[:stream_specifier] sample_fmt | 设置音频采样格式 |
| -af filtergraph(输出) | 创建由 filtergraph 指定的过滤器图,并使用它来过滤流 |
二、基本信息查询命令
1 | ffmpeg -h |
输出 f f m p e g 基本命令帮助信息,下面介绍下比较重要的配置选项 \color{blue}{输出 ffmpeg 基本命令帮助信息,下面介绍下比较重要的配置选项} 输出 ffmpeg 基本命令帮助信息,下面介绍下比较重要的配置选项
1 | Print help / information / capabilities: |
查询指定格式的相关解复用 / 复用信息: \color{blue}{查询指定格式的相关解复用 / 复用信息: } 查询指定格式的相关解复用 / 复用信息:
1 | ffmpeg -formats | findstr flv |
查询指定的编解码器信息: \color{blue}{查询指定的编解码器信息: } 查询指定的编解码器信息:
1 | ffmpeg -codecs | findstr 264 |
查看具体的 f f m p e g 命令分类所支持的参数,如: \color{blue}{查看具体的 ffmpeg 命令分类所支持的参数,如: } 查看具体的 ffmpeg 命令分类所支持的参数,如:
1 | ffmpeg -h format=flv |
1 | ffmpeg -h encoder=libx264 |
三、分解、复用
抽取音频流 \color{blue}{抽取音频流} 抽取音频流
1 | ffmpeg -i input.mp4 -acodec copy -vn out.aac |
vn:v 代表视频,n 代表 no
抽取视频流 \color{blue}{抽取视频流} 抽取视频流
1 | ffmpeg -i input.mp4 -vcodec copy -an out.h264 |
转格式 \color{blue}{转格式} 转格式
1 | ffmpeg -i input.mp4 -vcodec copy -acodec copy out.flv |
转 f m p 4 \color{blue}{转 fmp4} 转 fmp4
1 | ffmpeg -i input.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4 |
empty_moov:将导致输出 100%分段
音视频合并 \color{blue}{音视频合并} 音视频合并
1 | ffmpeg -i input.h264 -i input.aac -vcodec copy -acodec copy out.mp4 |
四、处理原始数据
抽取 y u v 数据 \color{blue}{抽取 yuv 数据} 抽取 yuv 数据
1 | ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv |
视频中提取图片 \color{blue}{视频中提取图片} 视频中提取图片
1 | ffmpeg -i input.mp4 -r 30 -ss 00:00:10 -t 2 image-%3d.jpg |
-r:每秒提取 30 帧
-t:取 t 秒时间的帧
截取视频中指定时间的某一帧图片 \color{blue}{截取视频中指定时间的某一帧图片} 截取视频中指定时间的某一帧图片
1 | ffmpeg -i input.mp4 -ss 00:00:50 -frames:v 1 out1.jpg |
-frames:v 后接张数
图片文件转成 Y U V 文件 \color{blue}{图片文件转成 YUV 文件} 图片文件转成 YUV 文件
1 | ffmpeg -i image.png -pix_fmt yuv420p out.yuv |
Y U V 转 H 264 \color{blue}{YUV 转 H264} YUV 转 H264
1 | ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i input.yuv -c:v libx264 -f rawvideo out.h264 |
提取 P C M 数据 \color{blue}{提取 PCM 数据} 提取 PCM 数据
1 | ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm |
1 | ffplay -ar 44100 -ac 2 -f s16le -i out.pcm |
P C M 转 W A V \color{blue}{PCM 转 WAV} PCM 转 WAV
1 | ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i input.pcm output.wav |
五、滤镜
添加水印 \color{blue}{添加水印} 添加水印
1 | ffmpeg -i input.mp4 -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" out.mp4 |
vf: movie 指定 logo 位置,scale 指定大小 overlay 指定 logo 摆放的位置
删除水印 \color{blue}{删除水印} 删除水印
先通过 ffplay 找到要删除 LOGO 的位置
1 | ffplay -i input.flv -vf delogo=x=806:y=20:w=70:h=80:show=1 |
删除水印
1 | ffmpeg -i input.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv |
视频缩小 \color{blue}{视频缩小} 视频缩小
1 | ffmpeg -i input.mp4 -vf scale=iw/2:-1 out.mp4 |
-vf scale 指定使用过滤器 scale,iw 指定按整型取视频宽度,-1 表示高度随宽度一起变化,视频缩小了一倍
视频裁剪 \color{blue}{视频裁剪} 视频裁剪
1 | ffmpeg -i input.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 out.mp4 |
倍速播放 \color{blue}{倍速播放} 倍速播放
1 | ffmpeg -i input.ts -filter:v "setpts=2.0*PTS" output.ts |
视频
1 | ffmpeg -i input.ts -filter:a:1 "setpts=2.0*PTS" output.ts |
1 | ffmpeg -i input.ts -filter:a "atempo=2.0" -vn output.ts |
音频, atempo 取值 0.5-2.0
同步改变音视频播放速度 \color{blue}{同步改变音视频播放速度} 同步改变音视频播放速度
1 | ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" out.mp4 |
[0:v]表示第一个 (文件索引号是 0) 文件的视频作为输入
map:数据流选择,可用于处理复杂输出,如可将指定的多路流输出到一个输出文件,也可指定输出到多个文件。上面是将复杂滤镜输出的视频和音频输出到指定文件中
对称视频 \color{blue}{对称视频} 对称视频
1 | ffmpeg -i input.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" out.mp4 |
hfilp:水平翻转
vfilp:垂直翻转
画中画 \color{blue}{画中画} 画中画
1 | ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags out.mp4 |
视频顺时针旋转 90 ° \color{blue}{视频顺时针旋转 90°} 视频顺时针旋转 90°
1 | ffmpeg -i input.mp4 -vf "transpose=1" out.mp4 |
transpose=2:逆时针旋转 90°
transpose=3:顺时针旋转 90°,再水平翻转
transpose=2:逆时针旋转 90°,水平翻转
六、拼接与裁剪
裁剪 \color{blue}{裁剪} 裁剪
1 | ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out.mp4 |
ss:指定开始时间
-t:被裁剪后的时长
视频合并 \color{blue}{视频合并} 视频合并
1 | ffmpeg -f concat -i inputs.txt -c copy out.flv |
inputs.txt 内容如下:
1 | file '1.flv' |
音频合并 \color{blue}{音频合并} 音频合并
1 | ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex '[0:0] [1:0] concat=n=2:v=0:a=1 [a]' -map [a] out.mp3 |
音频混音 \color{blue}{音频混音} 音频混音
1 | ffmpeg -i input1.mp4 -i input2.mp3 -filter_complex "[0:a] [1:a]amerge=inputs=2[aout]" -map "[aout]" -ac 2 out.aac |
inputs:输入的数量,默认为 2
h l s 切片 \color{blue}{hls 切片} hls 切片
1 | ffmpeg -i input.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls out.m3u8 |
-strict -2 指明音频使有 AAC
-f hls 转成 m3u8 格式
删除特定音频 \color{blue}{删除特定音频} 删除特定音频
1 | ffmpeg -i input.mp4 -map 0 -map -0:a:1 out.mp4 |
-map 0 选择一个输入文件中的所有数据(包括音频和视频)
-map -0 : a : 1 反向 map,忽略第二个音轨
为某视频添加音频 \color{blue}{为某视频添加音频} 为某视频添加音频
1 | ffmpeg -i video.mp4 -i audio.mp3 -c copy -map 0:v:0 -map 1:a:0 out.mp4 |
-map 0:v:0 选择第 0 个输入文件的第 0 个轨道
-map 1:a:0 选择第 1 个输入文件的第 0 个轨道
从视频中替换音频 \color{blue}{从视频中替换音频} 从视频中替换音频
1 | ffmpeg -i video_with_audio.mp4 -i another_audio.wav -map 0:0 -map 1:0 -c:v copy -c:a libmp3lame out.mp4 |
拼接成四宫格 \color{blue}{拼接成四宫格} 拼接成四宫格
1 | ffmpeg -re -i input1.mp4 -re -i input2.mp4 -re -i input3.mp4 -re -i input4.mp4 |
四张图片合并 \color{blue}{四张图片合并} 四张图片合并
1 | ffmpeg -re -i input1.jpg -re -i input2.jpg -re -i input3.jpg -re -i input4.jpg |
七、直播
推流 \color{blue}{推流} 推流
1 | ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamName |
拉流保存 \color{blue}{拉流保存} 拉流保存
1 | ffmpeg -i rtmp://server/live/streamName -c copy dump.flv |
实时推流 \color{blue}{实时推流} 实时推流
1 | ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room |
八、ffplay
播放 y u v 数据 \color{blue}{播放 yuv 数据} 播放 yuv 数据
1 | ffplay -pix_fmt nv12 -s 192x144 source.yuv |
播放 Y U V 中的 Y 平面 \color{blue}{播放 YUV 中的 Y 平面} 播放 YUV 中的 Y 平面
1 | ffplay -pix_fmt nv21 -s 640x480 -vf extractplanes='y' source.yuv |
播放器打印输出调试日志 \color{blue}{播放器打印输出调试日志} 播放器打印输出调试日志
1 | ffplay -v debug out.mp4 |
播放器打印详细调试日志 \color{blue}{播放器打印详细调试日志} 播放器打印详细调试日志
1 | ffplay -loglevel 56 out.mp4 |
九、转码
调整音视频参数 \color{blue}{调整音视频参数} 调整音视频参数
1 | ffmpeg -i input.mp4 -s 500x600 -vcodec libx264 -r 30 -g 100 -acodec aac -b 200k -ac 2 -ab 32 -ar 44100 -f mp4 output.mp4 |
-s:指定宽高
-r :帧率
-g:gop 图像组,多少帧有一个关键帧
-b:码率
-ac:声道数
-ar:采样率
-ab:采样位数
修改视频分辨率 \color{blue}{修改视频分辨率} 修改视频分辨率
1 | ffmpeg -i input.mp4 -vf scale=1920:1080 -y output.mp4 |
-vf scale 后面是宽: 高,如果某个值为 - 1,表示按原来的比例自动生成
十、其它
视频转 J P E G \color{blue}{视频转 JPEG} 视频转 JPEG
1 | ffmpeg -i input.flv -r 1 -f image2 image-%3d.jpeg |
视频转 g i f \color{blue}{视频转 gif} 视频转 gif
1 | ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out.gif |
图片转视频 \color{blue}{图片转视频} 图片转视频
1 | ffmpeg -f image2 -i image-%3d.jpeg out.mp4 |
m p 4 的 f a s t s t a r t 转写 \color{blue}{mp4 的 faststart 转写} mp4 的 faststart 转写
1 | ffmpeg -i http://xxxx/input.mp4 -c copy -movflags +faststart output.mp4 |
以 j s o n 形式展示视频信息 \color{blue}{以 json 形式展示视频信息} 以 json 形式展示视频信息
1 | ffprobe -v quiet -print_format json -show_format -show_streams input.mp4 |
获取视频每一帧的信息 \color{blue}{获取视频每一帧的信息} 获取视频每一帧的信息
1 | ffprobe -show_frames -select_streams v -of xml input.mp4 >frames.info |
设置日志级别及输出重定向 \color{blue}{设置日志级别及输出重定向} 设置日志级别及输出重定向
1 | ffplay -report -loglevel "info" -i input.mp4 > output.txt 2>&1 |
-report:把 ffmpeg 命令行和终端的输出都记录到一个以时间戳命名的文件中
-loglevel “info”:也可以 - v 32,32 是 info 级别对应的数值
> output.txt 2>&1:将输出重定向到 output.txt 文件中
设置 h t t p 请求头 \color{blue}{设置 http 请求头} 设置 http 请求头
1 | ffmpeg/ffplay -headers $'Ranger-Id:xxxxxxxxxxx\r\nContent-Licese:xxxxxxxxxxx\r\nContent-Auth:xxxxxxx' -i "http://xxxx.m3u8" |
t s 切片并生成 m 3 u 8 文件 \color{blue}{ts 切片并生成 m3u8 文件} ts 切片并生成 m3u8 文件
1 | ffmpeg -i input.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 output%03d.ts |
-segment_time: 表示隔几秒切一个文件






