ffmpeg在windows命令行的简单应用
ffmpeg在windows的简单应用
1.视频生成图片和gif
在文件夹路径下打开CMD
ffmpeg -i 2.mp4 -r 25 -f image2 data/image%3d.jpg
-i 2.mp4: 指定输入文件为2.mp4。
-r 25: 设置输出图像的帧率为每秒25帧。
-f image2: 指定输出格式为图像序列。
-data/image%3d.jpg: 指定输出图像文件名的格式,其中%3d表示使用三位数字作为图像的编号,并以.jpg作为文件扩展名。生成的图像文件将保存在一个名为"data"的文件夹中。
转码过程
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2024-03-16T18:02:30.000000Z
com.android.version: 13
Duration: 00:01:31.37, start: 0.000000, bitrate: 7568 kb/s
Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 720x1584, 7405 kb/s, 22.23 fps, 45k tbr, 90k tbn (default)
Metadata:
creation_time : 2024-03-16T18:02:30.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 156 kb/s (default)
Metadata:
creation_time : 2024-03-16T18:02:30.000000Z
handler_name : SoundHandle
vendor_id : [0][0][0][0]
这是对输入视频文件2.mp4的详细信息的解释:
- 输入文件格式为mov/mp4/m4a/3gp/3g2/mj2。
- 其元数据包括主要品牌(major_brand)、次要版本(minor_version)、兼容品牌(compatible_brands)、创建时间(creation_time)和Android版本(com.android.version)等信息。
- 视频时长为1小时31分37秒,起始时间为0秒,比特率为7568 kb/s。
- 视频流(Stream #0:0)的详细信息:
- 编码格式为h264(High Profile)。
- 色彩空间为yuv420p(电视标准,bt709),扫描类型为逐行扫描(progressive)。
- 分辨率为720x1584。
- 视频比特率为7405 kb/s。
- 帧率为22.23帧每秒。
- 时间基(tbn)为90k。
- 音频流(Stream #0:1)的详细信息:
- 编码格式为AAC(LC,Low Complexity)。
- 采样率为48000 Hz。
- 声道为单声道(mono)。
- 比特率为156 kb/s。
Output #0, image2, to 'data/image%3d.jpg':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
com.android.version: 13
encoder : Lavf60.3.100
Stream #0:0(eng): Video: mjpeg, yuvj420p(pc, bt709, progressive), 720x1584, q=2-31, 200 kb/s, 25 fps, 25 tbn (default)
Metadata:
creation_time : 2024-03-16T18:02:30.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
encoder : Lavc60.3.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame= 2286 fps=408 q=24.8 Lsize=N/A time=00:01:31.40 bitrate=N/A dup=294 drop=39 speed=16.3x
video:37143kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
这是转换过程的输出信息:
- 输出文件格式为图像序列(image2),保存在'data/image%3d.jpg'中。
- 输出文件的元数据与输入文件相似,包括主要品牌(major_brand)、次要版本(minor_version)、兼容品牌(compatible_brands)和Android版本(com.android.version)等信息。
- 视频流(Stream #0:0)的详细信息:
- 编码格式为MJPEG(Motion JPEG)。
- 色彩空间为yuvj420p(计算机标准,bt709),扫描类型为逐行扫描(progressive)。
- 分辨率为720x1584。
- 视频质量(q)范围为2-31,平均比特率为200 kb/s。
- 帧率为25帧每秒。
- 时间基(tbn)为25。
- 转换过程中输出的帧数为2286帧,帧速率为408 fps(帧每秒),转换时间为1小时31分40秒。
- 视频大小为37143kB,音频和字幕均为0kB。
视频生成gif
从视频中生成GIF图片
ffmpeg-i test.mp4 -t 5 -r 1 image1.gif
ffmpeg-i test.mp4 -t 5 -r 25 -s 640x360 image2.gif
2.图片生成视频
合成的视频没有音频
ffmpeg -r 25 -f image2 -i data/image%3d.jpg -vcodec libx264 -s 720*1584 -g 1 -keyint_min 25 -sc_threshold 0 -pix_fmt yuv420p out.mp4
- `-r 25`: 设置输出视频的帧率为每秒25帧。
- `-f image2`: 指定输入格式为图像序列。
- `-i data/image%3d.jpg`: 指定输入图像文件名的格式,其中`%3d`表示使用三位数字作为图像的编号。
- `-vcodec libx264`: 指定视频编码器为libx264,这是一个常用的H.264编码器。
- `-s 720*1584`: 设置输出视频的分辨率为720x1584像素。
- `-g 1`: 设置关键帧间隔为1,即每一帧都是关键帧。
- `-keyint_min 25`: 设置最小关键帧间隔为25帧。
- `-sc_threshold 0`: 设置场景切换阈值为0,这意味着不考虑场景切换。
- `-pix_fmt yuv420p`: 设置像素格式为yuv420p,这是H.264编码器的常用格式。
- `out.mp4`: 指定输出文件名为out.mp4。
这个命令将"data"文件夹中的图像序列转换为720x1584分辨率的H.264编码的视频文件,并以每秒25帧的速率保存为out.mp4。
查看命令和参数
ffmpeg的一些常用的参数
ffmpeg常用参数命令
主要参数
◼ -i 设定输入流
◼ -f 设定输出格式(format)
◼ -ss 开始时间
◼ -t 时间长度
音频参数:
◼ -aframes 设置要输出的音频帧数
◼ -b:a 音频码率
◼ -ar 设定采样率
◼ -ac 设定声音的Channel数
◼ -acodec 设定声音编解码器,如果用copy表示复制原文件的数据
◼ -an 不处理音频
◼ -af 音频过滤
例子:
ffmpeg-i test.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out2.mp3
视频参数:
◼-vframes 设置要输出的视频帧数
◼-b 设定视频码率
◼-b:v 视频码率
◼-r 设定帧速率
◼-s 设定画面的宽与高
◼-vn不处理视频
◼-aspect aspect 设置横纵比4:3 16:9 或 1.3333 1.7777
◼-vcodec 设定视频编解码器,如果用copy表示复制原文件的数据。
◼-vf视频过滤器
例子:
ffmpeg-i test.mp4 -vframes 300 -b:v 300k -r 30-s 640x480 -aspect 16:9 -vcodec libx265 output.mp4
查看帮助 ffmpeg -h
Getting help:
-h -- print basic options//获得基本帮助选项,这个代码就是这个命令
-h long -- print more options
-h full -- print all options (including all format and codec specific options, very long)
-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol
See man ffmpeg for detailed description of the options.
Print help / information / capabilities:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-dispositions show available stream dispositions
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods
Global options (affect whole program instead of just one file)://全局选项
-loglevel loglevel set logging level
-v loglevel set logging level
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-y overwrite output files
-n never overwrite output files
-ignore_unknown Ignore unknown stream types
-filter_threads number of non-complex filter threads
-filter_complex_threads number of threads for -filter_complex
-stats print progress report during encoding
-max_error_rate maximum error rate ratio of decoding errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.
Per-file main options://文件主选项
-f fmt force format
-c codec codec name
-codec codec codec name
-pre preset preset name
-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile
-t duration record or transcode "duration" seconds of audio/video
-to time_stop record or transcode stop time
-fs limit_size set the limit file size in bytes
-ss time_off set the start time offset
-sseof time_off set the start time offset relative to EOF
-seek_timestamp enable/disable seeking by timestamp with -ss
-timestamp time set the recording timestamp ('now' to set the current time)
-metadata string=string add metadata
-program title=string:st=number... add program with specified streams
-target type specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
-apad audio pad
-frames number set the number of frames to output
-filter filter_graph set stream filtergraph
-filter_script filename read stream filtergraph description from a file
-reinit_filter reinit filtergraph on input parameter changes
-discard discard
-disposition disposition
Video options://视频选项
视频选项详细解释:
-vframes number:设置输出的视频帧数。
-r rate:设置帧率(每秒帧数,可以是Hz值、分数或缩写,如25、25/1、25.00)。
-fpsmax rate:设置最大帧率(每秒帧数,可以是Hz值、分数或缩写,如25、25/1、25.00)。
-s size:设置帧大小(宽度x高度,或使用缩写,如1920x1080)中间是英文x。
-aspect aspect:设置纵横比(如4:3、16:9或1.3333、1.7777)。
-display_rotation angle:设置视频流的纯逆时针旋转角度(度)。
-display_hflip:设置视频流水平翻转(如果未设置显示旋转,则覆盖之)。
-display_vflip:设置视频流垂直翻转(如果未设置显示旋转,则覆盖之)。
-vn:禁用视频。
-vcodec codec:强制使用指定的视频编解码器('copy'用于复制流)。
-timecode hh:mm:ss[:;.]ff:设置初始时间码值。
-pass n:选择第n次转码过程(1到3次)。
-vf filter_graph:设置视频过滤器。
-b bitrate:设置视频比特率(请使用-b:v)。
-dn:禁用数据。
Audio options:
音频选项详细解释:
-aframes number:设置输出的音频帧数。
-aq quality:设置音频质量(编解码器特定)。
-ar rate:设置音频采样率(赫兹)。
-ac channels:设置音频通道数。
-an:禁用音频。
-acodec codec:强制使用指定的音频编解码器('copy'用于复制流)。
-ab bitrate:设置音频比特率(请使用-b:a)。
-af filter_graph:设置音频过滤器。
Subtitle options:
字幕选项详细解释:
-s size:设置帧大小(宽度x高度,或使用缩写,如1920x1080)。
-sn:禁用字幕。
-scodec codec:强制使用指定的字幕编解码器('copy'用于复制流)。
-stag fourcc/tag:强制使用指定的字幕标签/四字符代码。
-fix_sub_duration:修复字幕持续时间。
-canvas_size size:设置画布大小(宽度x高度,或使用缩写,如1920x1080)。
-spre preset:将字幕选项设置为指定的预设。
ffmpeg分类查询
-version 显示版本
-bsfs 显示可用比特流filter
-buildconf 显示编译配置
-protocols 显示可用的协议
-filters 显示可用的过滤器
-pix_fmts 显示可用的像素格式
-formats 显示可用格式(muxers+demuxers)
-layouts 显示标准声道名称
-sample_fmts 显示可用的音频采样格式
-decoders 显示可用解码器
-colors 显示可用的颜色名称
-codecs 显示可用编解码器(decoders+encoders)
-demuxers 显示可用解复用器
-decoders 显示可用解码器
-encoders 显示可用编码器
-muxers 显示可用复用器
查看具体方法的参数
比如:ffmpeg -h encoder=libx264
或是:ffmpeg -h filter=atempo (atempo调整音频播放速率)
Filter atempo
Adjust audio tempo.
Inputs:
#0: default (audio)
Outputs:
#0: default (audio)
atempo AVOptions:
tempo <double> ..F.A....T. set tempo scale factor (from 0.5 to 100) (default 1)
比如:ffmpeg -encoders | findstr mp3 //查找MP3解码器,可以看到mp3解码器的全称
A....D libmp3lame libmp3lame MP3 (MPEG audio layer 3) (codec mp3)
A....D libshine libshine MP3 (MPEG audio layer 3) (codec mp3)
A....D mp3_mf MP3 via MediaFoundation (codec mp3)
抽取完整视频的视频和音频
保留封装格式
ffmpeg-i test.mp4-acodec copy -vn audio.mp4
ffmpeg-i test.mp4 -vcodec copy -an video.mp4
提取视频
保留编码格式:ffmpeg-itest.mp4 -vcodeccopy -an test_copy.h264
强制格式:ffmpeg-itest.mp4 -vcodec libx264 -an test.h264
提取音频
保留编码格式:ffmpeg-itest.mp4 -acodeccopy -vn test.aac
强制格式:ffmpeg-itest.mp4 -acodeclibmp3lame -vn test.mp
ffmpeg提取像素格式(YUV和RGB格式)转换格式
提取YUV
◼ 提取3秒数据,分辨率转为320x240
ffmpeg-i test.mp4 -t 3 -pix_fmt yuv420p -s 320x240 YUV_320x240.yuv
提取RGB
◼ 提取3秒数据,分辨率转为320x240
ffmpeg-i test.mp4 -t 3 -pix_fmt rgb24-s 320x240 rgb24_320x240.rgb
RGB和YUV之间的转换
ffmpeg-s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 rgb24_320x240_2.rgb
更改视频和音频文件参数,输出新文件
保持编码格式:
ffmpeg-i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg-i test.mp4 -codec copy test_copy2.ts
改变编码格式:
ffmpeg-i test.mp4 -vcodec libx265-acodec libmp3lame out_h265_mp3.mkv
修改帧率:
ffmpeg-i test.mp4 -r 15 -codec copy output.mp4 (错误命令)
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
如果不想重新编码video,需要加上-vcodec copy
修改音视频码率:
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
参考其他人的命令
生成m3u8切片(1)
ffmpeg -i input.mp4 -c:v libx264 -c:a copy -f hls -hls_time 10 -hls_list_size 0
-hls_start_number 0 input/index.m3u8
备注:-hls_time n: 设置每片的长度,默认值为2。单位为秒
-hls_list_size n:设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5
-hls_start_number n:设置播放列表中sequence number的值为number,默认值为0
-hls_wrap n:设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.
这个选项能够避免在磁盘上存储过多的片,而且能够限制写入磁盘的最多的片的数量
生成m3u8切片(2)
ffmpeg -i input.mp4 -fflags flush_packets
-max_delay 2 -flags -global_header
-hls_time 5 -hls_list_size 0 -vcodec libx264 -acodec aac -r 30 -g 60 index.m3u8
指定码率转换
ffmpeg -i input.mp4 -b:v 10M -b:a 10M -c:v libx264 -c:v aac out.mp4
备注:切记一点,命令行中涉及编解码时,-c:v copy 不要使用,否则 比如指定的码率参数,分辨率参数
等就会失效,而且很难找到原因
-b:v 10M 指定视频重新编码的码率为10M/s
-b:a 10M 指定音频重新编码的码率为10M/s
指定时间段录制
ffmpeg -i input.mp4 -c:v copy -c:a copy -ss 00:10:20 -to 00:30:20 out.mp4
指定录制时长
ffmpeg -i input.mp4 -c:v copy -c:a copy -t 30 out.mp4
备注: -t 30 表示指定30秒的录制时长
提取h264 裸码流
ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
播放h264 裸码流
ffplay -stats -f h264 out.h264
ffplay -i out.h264
提取aac 裸码流
ffmpeg -i input.mp4 -acodec copy -vn out.aac
备注:-vn (disable video)
播放aac 裸码流
ffplay -i out.aac
视频倒放,音频不变
ffmpeg -i input.mp4 -vf reverse input_video_reversed.mp4
音频倒放,视频不变
ffmpeg -i input.mp4 -map 0 -c:v copy -af "areverse" input_audio_reversed.mp4
视频音频同时倒放
ffmpeg -i input.mp4 -vf reverse -af areverse input_reversed.mp4
提取h264 裸码流(指定编码质量)
ffmpeg -i input.mp4 -an -c:v libx264 -crf 18 out.h264
备注: -an (disable audio)
-c:v libx264(等价于 -vcodec h264 或 -vcodec libx264)
-crf 18 (固定质量值18)
转码->AVC(指定转码的部分参数)
ffmpeg -i input.mp4 -c:v libx264 -preset slow -tune film -profile:v main out.mp4
备注:-tune film (主要配合视频类型和视觉优化的参数)
-preset slow
编码预设,主要调节 编码速度和质量的平衡
10个选项如下 从快到慢:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo
-profile:v main
h264有四种画质级别,分别是baseline, extended, main, high:
1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced), 也支持CAVLC 和CABAC 的支持;
4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;
转码->HEVC
ffmpeg -i input.mp4 -c:v libx265 -c:a copy out.mp4
转码->AVC(指定转码的部分参数)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2048k -vf scale=1280:-1 -y out.mp4
备注:-vf scale=1280:-1 (指定输出视频的宽高,高-1代表按照比例自动适应)
-b:v 2048k(指定输出视频的码率,即输出视频每秒的bit数)
查看当前支持的编码器
ffmpeg -codecs
查看当前支持的封装格式
ffmpeg -formats
查看当前支持的滤镜
ffmpeg -filters
使用指定解码器播放视频
ffplay -vcodec h264 -i out.mp4
查看指定解码器的相关参数
ffmpeg -h decoder=h264_cuvid
查看当前支持的硬件加速选项
ffmpeg -hwaccels
例如:mac核显支持的选项(videotoolbox)英伟达显卡支持的选项(cuvid)
使用cuvid进行解码和编码实现转码
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2048k -vf scale=1280:-1 -y out.mp4
备注: -hwaccel cuvid (指定使用cuvid硬件加速)
-c:v h264_cuvid (使用h264_cuvid进行视频解码)
-c:v h264_nvenc (使用h264_nvenc进行视频编码)
-b:v 2048k (指定输出视频的码率,即输出视频每秒的bit数)
-vf scale=1280:-1 (指定输出视频的宽高,高-1代表按照比例自动适应)
使用videotoolbox进行编码实现转码
ffmpeg -i input.mp4 -vcodec h264_videotoolbox -b:v 2048k -vf scale=1280:-1 -y out.mp4
备注:-vcodec h264_videotoolbox (使用h264_videotoolbox 进行视频编码)
-b:v 2048k (指定输出视频的码率,即输出视频每秒的bit数)
-vf scale=1280:-1 (指定输出视频的宽高,高-1代表按照比例自动适应)