FFmpeg命令行使用技巧
音视频从采集到播放流程:
命令查询:
命令参数 | 内容 | 命令参数 | 内容 |
---|---|---|---|
-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 |
设置捕获区域的分辨率(如 1920x1080 、1280x720 )。 |
-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 不支持通过摄像头录制。
直播拉流: