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是垂直坐标

参考资料

ffmpeg.org

FFmpeg 基本常识及编码流程

使用 ffmpeg 将图片合成为视频(附完整参数介绍)