FFmpeg命令行使用技巧

Posted by Kalos Aner on November 7, 2024

FFmpeg命令行使用技巧

音视频从采集到播放流程:

va_program

命令查询:

命令参数 内容 命令参数 内容
-version 显示版本 -bsfs 显示可用比特流filter
-buildconf 显示编译配置 -protocols 显示可用的协议
-formats 显示可用格式
(muxers+demuxers)
-filters 显示可用的过滤器
-muxers 显示可用复用器 -pix_fmts 显示可用的像素格式
-demuxers 显示可用解复用器 -layouts 显示标准声道名称
-codecs 显示可用编解码器
(decoders+encoders)
-sample_fmts 显示可用的音频采样格式
-decoders 显示可用解码器 -colors 显示可用的颜色名称
-encoders 显示可用编码器    

参数介绍:

主要参数:-i:设定输入流,-f:设定输出格式(format),-ss:开始时间,-t:时长

音频参数:-aframes:设置要输出的音频帧数 ,-b:a:音频码率,-ar:设定采样率,-ac:设定声音的Channel数,-acodec设定声音编解码器,如果用copy表示原始编解码数据必须别拷贝,-an:不处理音频,-af:音频过滤器。

视频参数:-vframes:设置要输出的视频帧数,-b:设定视频码率,-b:v:视频码率,-r:设定帧速率,-s:设定画面的宽与高,-vn:不处理视频,-aspect设置纵横比4:3,-vcodec设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝,-vf:视频过滤器。

以下 ffmpeg 在最新版的应该使用 ffmpegd。

提取视频:

保留编码格式:

1
ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264

修改成指定格式:

1
ffmpeg -i test.mp4 -vcodec libx264 -an test.h264

提取音频:

保留编码格式:

1
ffmpeg -i test.mp4 -acodec copy -vn test.aac

修改成指定格式:

1
ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3

提取YUV(像素格式):

提取3秒视频,修改分辨率为320x240

1
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv

提取RGB(像素格式):

提取3秒视频,修改分辨率为320x240

1
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb

RGB和YUV之间的转换

1
2
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24
rgb24_320x240_2.rgb

提取PCM:

Pulse Code Modulation,脉冲编码调制

提出成pcm的文件可以不加pcm后缀。

-ar 采样率,-ac 通道数,-f 编码格式

1
2
3
4
5
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
ffmpeg -i test.mp4 -t 10 -vn -ar 48000 -ac 2 -f f32le 48000_2_f32le_2.pcm

转封装命令:

-r 修改帧率,-b:a 400k -b:v 192k 修改音视频码率,-s 修改视频分辨率,-ar 修改音频采样率

1
2
3
4
5
6
7
8
9
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
ffmpeg -i test.mp4 -r 15 output2.mp4
ffmpeg -i test.mp4 -b 400k output_b.mkv
ffmpeg -i test.mp4 -b:v 400k output_bv.mkv
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
1
2
错误命令:修改帧率和修改视频码率会自动重新解码。
ffmpeg -i test.mp4 -r 15 -codec copy output.mp4

视频截取:

-ss 起始时间,-t 截取时长

1
2
3
ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
ffmpeg -i 复仇者联盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
ffmpeg -i 红海行动.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4

转成ts格式:

ts格式:每一片段都可以独立解码。

-vbsf 提高兼容性:分离某些封装格式中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter处理,一般该命令照抄即可。

1
2
3
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts

转成flv格式:

1
2
3
ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i 2.mp4 -codec copy 2.flv
ffmpeg -i 3.mp4 -codec copy 3.flv

视频拼接:

1
2
3
4
5
6
7
8
9
以MP4格式进行拼接
方法1:ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4.mp4  #可能无法正常播放
方法2:ffmpeg -f concat -i mp4list.txt -codec copy out_mp42.mp4
以TS格式进行拼接
方法1:ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4 
方法2:ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4
以FLV格式进行拼接
方法1:ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv.mp4 #可能无法正常播放
方法2:ffmpeg -f concat -i flvlist.txt -codec copy out_flv2.mp4

mp4list.txt文件如下(其他格式同):

1
2
3
file '1.mp4'
file '2.mp4'
file '3.mp4'

建议:

(1)每次都使用方法2进行拼接

(2)转成TS格式再进行拼接

注意:

(1)视频分辨率可以不同,但是编码格式必须统一

(2)音视频编码格式需要统一,音频参数(采样率/声道等)也需要统一

截取图片:

-y 覆盖,-f 格式,-s 宽高,-vframes 帧:如果大于1 那么 输出加%03d test%03d.jpg,image2 一种格式

1
2
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp

逐帧转换

-r 设定帧速率

1
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg

图片转成视频

1
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4

视频转GIF:

1
2
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif

GIF转视频:

1
ffmpeg -f gif -i image2.gif image2.mp4

屏幕录制:

1、使用 dshow 软件 Screen Capturer Recorder, 或者从 GitHub 下载。

但是 Screen Capturer Recorder 已经停止维护,如果 screen-capture-recorder 不兼容的话录制命令会报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 查看可用设备名字
ffmpeg -list_devices true -f dshow -i dummy
// 录制屏幕,下面使用的是 mp4 格式,更建议使用 flv,避免文件损坏。
ffmpeg -f dshow -i video="screen-capture-recorder" v-out.mp4
// 录制视频,Integrated Webcam 改成自己的摄像头名称
ffmpeg -f dshow -i video="Integrated Webcam" -y v-out2.flv
// 录制系统声音
ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.aac
// 录制系统声音和麦克风声音
ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac
// 同时录制声音和视频
ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video="screen-capture-recorder" -y av-out.flv
// 查看视频录制的可选参数
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"
// 查看声音录制的可选参数
ffmpeg -f dshow -list_options true -i audio="virtual-audio-capturer"

使用默认的参数录制屏幕会消耗很多的 CPU 资源,可以适当调小码率和帧率。

2、使用 FFmpeg 内置的 gdigrab。

1
ffmpeg -f gdigrab -i desktop -framerate 30 -video_size 1920x1080 -t 60 output.mp4

-t 60: 设置录制持续时间为 60 秒。

-f gdigrab: 使用 GDI 捕获屏幕。

-i desktop: 指定捕获整个桌面。

-framerate 30: 设置帧率为 30 FPS。

-video_size 1920x1080: 设置录制区域为 1920x1080 分辨率(可根据需要调整)。

output.mp4: 输出文件名。

1
2
3
// 查看 gdigrab 所有参数
ffmpeg -h full | findstr gdigrab
ffmpeg -h input=gdigrab
参数 说明
-framerate 设置捕获的帧率(如 30、60)。默认值是 30。
-offset_x 设置捕获区域的水平起始位置(像素)。
-offset_y 设置捕获区域的垂直起始位置(像素)。
-video_size 设置捕获区域的分辨率(如 1920x10801280x720)。
-i desktop 捕获整个桌面(默认输入为 desktop)。
-i title="窗口标题" 捕获指定窗口的画面,窗口标题需要精确匹配(不区分大小写)。
-draw_mouse 1 是否捕获鼠标指针(1 表示捕获,0 表示不捕获)。默认值是 1。

示例命令

捕获整个桌面

1
ffmpeg -f gdigrab -framerate 30 -i desktop output.mp4
  • 捕获整个屏幕,帧率为 30,输出为 MP4 文件。

捕获特定窗口

1
ffmpeg -f gdigrab -framerate 30 -i title="记事本" output.mp4
  • 捕获窗口标题为 “记事本” 的画面。

捕获特定区域

1
ffmpeg -f gdigrab -framerate 30 -offset_x 100 -offset_y 100 -video_size 1280x720 -i desktop output.mp4
  • 捕获屏幕从 (100, 100) 开始、分辨率为 1280x720 的区域。

去掉鼠标指针

1
ffmpeg -f gdigrab -draw_mouse 0 -framerate 30 -i desktop output.mp4
  • 捕获屏幕画面,但不显示鼠标指针。

gdigrab 不支持通过摄像头录制。

直播拉流: