FFmpeg 常用命令
音频文件转换
ffmpeg -i 输入文件.m4a 输出文件.mp3
ffmpeg -i 输入文件.wav 输出文件.mp3
ffmpeg -i output_audio.aac -c:a pcm_s16le -ar 48000 -ac 2 output.wav
ffmpeg -i output.wav -y -acodec libmp3lame -aq 0 output.mp3
音频文件切割
ffmpeg -i input.mp3 -ss 00:01:00 -t 00:02:00 -acodec copy output.mp3
在这个例子中:
-i input.mp3 指定输入的音频文件。
-ss 00:01:00 设置开始时间为 1 分钟。
-t 00:02:00 设置切割的时长为 2 分钟。
-acodec copy 指定不重编码音频流,直接复制到输出文件。
output.mp3 是输出文件的名称。
查看视频文件详情
ffprobe -i .\input.mp4
给视频文件消音
ffmpeg.exe -i happy_teachers_day.mp4 –c copy -an out.mp4
参数 | 说明 |
---|---|
-an | disable audio,取消音频输出 |
视频截取
ffmpeg -ss 00:00:00 -i input.mp4 -c copy -t 10 out.mp4
从第一秒开始,取 10 秒的视频输出
ffmpeg -ss 00:00:30 -i input.mp4 -c copy out.mp4
从第 30 秒开始,直到视频结束
ffmpeg -i input.ts -ss 00:10 -to 00:20 -c:v libx264 -crf 18 out.ts
从第 10 秒开始到第 20 秒结束,以 libx264 编解码,crf 18 压缩输出
参数 | 说明 |
---|---|
-crf | Constant Rate Factor 用以平衡视频质量和文件大小的参数,ffmpeg 里取值范围为 0-51,取值越高内容损失越多,视频质量更差。 ffmpeg 的默认值是 23,建议的取值范围是 17-28,可以理解为压缩,取值越高,视频压缩越很,生成的文件越小 |
-c:v | -c[:stream_specifier] codec (input/output,per-stream) -codec[:stream_specifier] codec (input/output,per-stream) codec of video,目前 ffmpeg 针对于 mp4 默认使用的是 h264,你可以使用-c:v libx265 生成同等质量,但文件更小的 h265 视频 |
stream_specifier | v 是指视频,a 是指音频 |
视频提取音频
ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:08 -vn -acodec aac output_audio.aac
抽取视频的第一帧
常用于视频封面预览功能
ffmpeg -i happy_teachers_day.mp4 -ss 1 -f image2 happy_teachers_day-1.jpg
参数 | 说明 |
---|---|
-ss | set the start time offset 设置开始时间,开始点后多久后正常工作,时间格式:X 秒 或 HOURS:MM:SS.MICROSECONDS |
-t | 持续时间,单位秒 |
将 wmv 转成 mp4 文件
ffmpeg -i input.wmv -vcodec libx264 output.mp4
将 mp4 文件转成 ts 文件
ffmpeg -i input.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb -vcodec libx264 output.ts
参数 | 说明 |
---|---|
-bsf:v | 从本地视频文件 input.mp4 中提取 H264 数据,并导出至转换文件 output.ts 中 |
-vcodec | 视频流编解码器,通用的是 libx264 |
将 mp4 文件转成 ps 文件
基于上一步骤来完成,先将 mp4 转成 ts 文件,再将 ts 转 ps
ffmpeg -i input.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb -vcodec libx264 output.ts
ffmpeg -i output.ts -c copy -bsf:a aac_adtstoasc -f mpegts output2.ts
ffmpeg -i output2.ts -c copy -f mpegts output.ps
用一张图片,和音频文件,合成一个 mp4 格式的视频
ffmpeg -r 24 -loop 1 -i qiubao.jpeg -i qiubao.mp3 -s 1920x1080 -pix_fmt yuvj420p -t 64 -vcodec libx264 out.mp4
参数 | 说明 |
---|---|
-loop | 循环播放次数 |
-i | 入参,图片路径,正则匹配 |
-i | 入参,音频地址 |
-y | 覆盖已有生成文件,如果不填写,运行过程中需要手动输入 y[yes] |
-s | 对应图片的分辨率,输出 log 中会提示分辨率,虽然指定了分辨率,但是如果原始图片不是该分辨率,还是以原始图片为主 |
-t | 总时长,输出 log 中会提示音频时长,这里设置为音频时长即可,单位秒 |
-r | 可用于入参出参,这里是入参,指定输入文件的帧速率为 24 fps |
-pix_fmt | 图片格式,有 yuvj420p 和 yuv444p 两种,输出 log 中会提示 |
运行时日志如下:
PS D:\qiubao> ffmpeg -r 24 -loop 1 -i qiubao.jpeg -i qiubao.mp3 -s 1920x1080 -pix_fmt yuv444p -t 64 -vcodec libx264 out.mp4
ffmpeg version n4.4-80-gbf87bdd3f6-20210817 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10-win32 (GCC) 20210408
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libvmaf --enable-vulkan --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-libglslang --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20210817
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, image2, from 'qiubao.jpeg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 73799 kb/s
Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 72:72 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
[aac @ 0000019008761500] Estimating duration from bitrate, this may be inaccurate
Input #1, aac, from 'qiubao.mp3':
Duration: 00:01:03.46, bitrate: 259 kb/s
Stream #1:0: Audio: aac (LC), 48000 Hz, stereo, fltp, 259 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Stream #1:0 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[swscaler @ 0000019008d30f40] deprecated pixel format used, make sure you did set range correctly
[libx264 @ 00000190087bd3c0] using SAR=1/1
[libx264 @ 00000190087bd3c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 00000190087bd3c0] profile High 4:4:4 Predictive, level 4.0, 4:4:4, 8-bit
[libx264 @ 00000190087bd3c0] 264 - core 164 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out.mp4':
Metadata:
encoder : Lavf58.76.100
Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv444p(tv, bt470bg/unknown/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 24 fps, 12288 tbn
Metadata:
encoder : Lavc58.134.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc58.134.100 aac
frame= 1536 fps= 46 q=-1.0 Lsize= 4597kB time=00:01:03.87 bitrate= 589.5kbits/s speed= 1.9x
video:3549kB audio:1003kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.981430%
用视频生成图片
ffmpeg -i input.mp4 -r 24 -f image2 rec_%3d.jpg
参数 | 说明 |
---|---|
-r | 参数表示按照每秒 24 帧的速度提取 |
ffmpeg -i input.mp4 -r 1 -f image2 rec_%3d.jpg
参数 | 说明 |
---|---|
-r | 参数表示按照每秒 1 帧的速度提取,1 分钟的视频,生成 60 张图 |
ffmpeg -i input.mp4 -r 0.5 -f image2 rec_%3d.jpg
参数 | 说明 |
---|---|
-r | 参数表示按照每秒 0.5 帧的速度提取,也就是 2 秒钟一帧,1 分钟的视频,生成 30 张图 |
用图片生成视频
ffmpeg -y -r 0.2 -i rec_%3d.jpg -c:v libx264 -vf fps=25 out.ts
参数 | 说明 |
---|---|
-t | duration 用做输入选项(在-i 之前),是限制读取输入文件的的时长;用做输出选项(before an output url),超过这个时间停止写输出文件;比如:循环读取一个输入文件时(-loop 1),当到时间就会停止输出,生成一个 duration 时长的视频。但是如果没有循环选项,而且输入文件短于这个时长时,就会随着输入文件结束就结束,生成视频,视频时长小于 duration。所以我们可以看出 -t 并不仅仅是输出文件时长 |
-r | fps 帧率,可以指定两个帧率,输入帧率,输出帧率;输入帧率:-i 之前,设定读入帧率,比如 -r 0.5 ,也就是说 1 秒要播 0.5 个图片,那么一个图也就是要播 2s;输出频率:-i 之后,真正的输出视频播放帧率,不写话,是默认和输入频率一样。比如设 -r 30 ,对应上面的设定,一个图播 2s,那么输出文件播放时,这 2s 内,都是这张图,但是播放了 60 帧 |
视频尺寸裁剪
ffmpeg -i input.mp4 -vf "crop=1024:512:512:0" output.mp4
w:h:x:y,其中,1024是宽度,512是高度,x=512是左上角的水平坐标,y=0是垂直坐标