当前位置:网站首页>ffmpeg命令行使用

ffmpeg命令行使用

2022-07-06 09:29:00 狗蛋儿l

查看视频信息

ffmpeg -i 视频名字

在这里插入图片描述
视频名字这里输入前几个字符按 tab 键可以自动补全

返回结果:
在这里插入图片描述

红框之内的内容没什么用

编码器 :encoder : Lavf57.25.100
持续时间:Duration: 00:14:20.58, start: 0.000000, bitrate: 381 kb/s
Duration 持续时间,start 开始时间,bitrate比特率

视频流: Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yu
v420p, 1360x768, 182 kb/s, 29.94 fps, 30 tbr, 15360 tbn, 30720 tbc (default)
h264编码格式,avc1封装格式,yuv420p每一帧的格式,1360x768分辨率,182 kb/s 视频比特率,29.94 fps帧数

音频流: Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, flt
p, 191 kb/s (default)
aac 编码格式,mp4a 封装格式,44100 Hz 采样率,stereo 立体声,fltp 浮点型,191 kb/s (default)音频比特率

去除音频

ffmpeg -i 文件名 -an -vcodec copy 文件名.mp4

-an去除音频,-vcodec copy拷贝源数据的视频流到文件名.mp4文件里面

去除视频

ffmpeg -i 文件名 -vn -acodec copy 文件名.mp4

-vn去除音频,-acodec copy拷贝源数据的音频流到文件名.mp4文件里面

保存音频为AAC文件

 ffmpeg -i 文件名.mp4 -vn -acodec copy 文件名.aac

改变视频分辨率

ffmpeg -i 文件名.mp4 -vf scale=640:360 文件名.mp4

scale=后面填写的是修改后的分辨率

ffmpeg -i 文件名.mp4 -vf scale=iw*2:ih*2 文件名.mp4

把分辨率变成两倍,也可以*0.5变成二分之一

隐藏无用信息

ffmpeg -i 文件名.mp4 -hide_banner

在这里插入图片描述

添加水印

ffmpeg -i 文件名.mp4 -i 水印.png -filter_complex overlay out.mp4

默认左上角,overlay=W-w 是右上角,overlay=0:H-h 是左下角,overlay=W-w:H-h 是右下角
大写的 H 是视频的高度,大写的 W 是视频的宽度,小写的 h 是水印的高度,小写的 w 是水印的宽度。

去除水印

ffmpeg -i 文件名.mp4 -vf delogo=x:y:w:h:show out.mp4

x,y 确定logo的位置坐标
w,h 设置logo的宽高
show 表示是否显示矩形框,默认是 0 不显示,1 是显示

添加文字水印

ffmpeg -i 文件名.mp4 -vf drawtext=text='内容':fontcolor='颜色':fontsize=字号 out.mp4

截取视频

ffmpeg -i 文件名.mp4 -ss 秒 -to 时间 out.mp4

从多少秒开始,截取多长时间的视频

视频转换为gif

ffmpeg -i 文件名.mp4 -ss 10 -t 5 -s 640*320 -r 15 out.mp4

-ss 开始时间
-t 持续时间
-i 后面是源文件
-s 动图分辨率
-r 帧率

ffmpeg -i 文件名.mp4 -vframes 30 out.gif

-vframes 30 视频前三十帧
把视频前三十帧转换为gif

视频压缩之 -crf

ffmpeg -i 文件名.mp4 -c:v libx264 -crf 23 out.mp4

×264 默认值是 23(建议18 - 28)
×265 默认是28(建议24 - 34)
两个的可用值是 0 到 51
值越小编码质量越好,码率越高
其中 0 可以说是无损的,51质量最差
crf 差别为6就会导致文件大小加倍或者减半

视频压缩之 -preset

ffmpeg -i 文件名.mp4 -vocdec libx264 -preset xxx -crt 25 out.mp4

preset 主要影响编码的速度,并不会很大影响输出文件的大小
x264编码算法有下列参数值
ultrafast 编码速度最快压缩率低,生成文件很大
superfa
veryfast
faster
fast
medium x264默认标准
slow
slower
veryslow
placebo 编码速度最慢,压缩率高,生成文件小

xxx 就是填入下列的参数

给视频或图像加上黑边

ffmpeg -i 文件名.mp4 -vf pad=1080:720:0:56:black out.mp4

pad后面参数值依次为:宽,高,x坐标,y坐标,默认是黑边可以不写
56:(720 - 680)/2=56
1080 x 608分辨率变成 1080 x 720分辨率

转格式

ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv

上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。
copy是把原来的并不条件

  • -i: 输入文件
  • -vcodec copy : 视频编码处理方式
  • -acodec copy: 音频编码处理方式

音视频合并

ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4

提取YUV数据

ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv

ffplay -s (wxh分辨率,stream中看) out.yuv
  • -an: a代表audio,n代表no不包括音频的
  • -c:v rawvideo 指定将视频转成原始数据
  • -pixel_format yuv420p 指定转换格式为yuv420p(4:2:0)

YUV转H264

ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264

提取PCM数据

ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm

播放的时候参数也要和上面一样,因为不知道你用什么采样率和声道是啥

ffplay -ar 44100 -ac 2 -f s16le -i out.pcm
  • -vn: v代表video,n代表不要视频
  • -ar: a代表audio,r代表read,采样率44100 44.1k
  • -ac: a代表audio,c2代表双声道还有立体声,环绕立体声
  • -f: 音频抽取出来的存取格式, s16 s代表有符号的,每一位16位表示

PCM转WAV

ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i input.raw output.wav

查看有哪些设备

首先通过下面的命令查看一下 mac 上都有哪些设备。

ffmpeg -f avfoundation -list_devices true -i ""

录屏

yuv播放的时候需要指定宽高

ffmpeg -f avfoundation -i 1 -r 30 out.yuv
  • -f 指定使用 avfoundation 采集数据。
  • -i 指定从哪儿采集数据,它是一个文件索引号。在我的MAC上,1代表桌面(可以通过上面的命令查询设备索引号)(1其实是个索引,屏幕是1,摄像头是0)。
  • -r 指定帧率。按ffmpeg官方文档说-r与-framerate作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r用于限制输出。

注意,桌面的输入对帧率没有要求,所以不用限制桌面的帧率。其实限制了也没用。

播放

录制的时候会提示

Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 3360x2100,
q=2-31, 3386880 kb/s, 30 fps, 30 tbn, 30 tbc

-s 3360x2100
-pix_fmt uyvy422

ffplay -s xxxxx(你录制时候的宽高) -pix_fmt (也是你录制时候的格式) ./out.yuv

录屏+声音

ffmpeg  -f avfoundation -i 1:0  -r 29.97 -c:v libx264 -crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k  out.flv
ffmpeg -y -f avfoundation -i 1:0 -framerate 60 -c:v libx264 -r 60 -pix_fmt yuv420p -preset 0 -crf 19 -c:a aac -b:a 192k "$HOME/Screen Record $(date "+%Y-%m-%d %H-%M-%S").mp4"
  • -i 1:0 冒号前面的 “1” 代表的屏幕索引号。冒号后面的"0"代表的声音索相号。
  • -c:v 与参数 -vcodec 一样,表示视频编码器。c 是 codec 的缩写,v 是video的缩写。
  • -crf 是 x264 的参数。 0 表式无损压缩。
  • -c:a 与参数 -acodec 一样,表示音频编码器。
  • -profile 是 fdk_aac 的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据。
  • -b:a 指定音频码率。 b 是 bitrate的缩写, a是 audio的缩与

录视频

ffmpeg -framerate 30 -f avfoundation -i 0 out.mp4 
  • -framerate 限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。
  • -f 指定使用 avfoundation 采集数据。
  • -i 指定视频设备的索引号

视频+音频

ffmpeg -framerate 30 -f avfoundation -i 0:0 out.mp4 

录音

ffmpeg -f avfoundation -i :0 out.wav

0是代表设备的索引,可以去上面查看

录制好了播放

ffplay ./out.wav

录制音频裸数据

ffmpeg  -f avfoundation -i :0 -ar 44100 -f s16le out.pcm

视频缩小一倍

ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4
  • -vf scale 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。 -1 表示高度随宽度一起变化。

视频裁剪

ffmpeg -i VR.mov  -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4

crop 格式:crop=out_w:out_h : x : y

  • out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。
  • out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。
  • x : X坐标
  • y : Y坐标

如果 x和y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。

倍速播放

ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4
  • -filter_complex 复杂滤镜,[0:v]表示第一个(文件索引号是0)文件的视频作为输入。setpts=0.5*PTS表示每帧视频的pts时间戳都乘0.5,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。
  • map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]"复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。

对称视频

ffmpeg  -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4
  • hflip 水平翻转

如果要修改为垂直翻转可以用vflip。

画中画

ffmpeg -i out.mp4 -i out1.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart new.mp4

录制画中画

ffmpeg  -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" 
-r 30 -c:v libx264 -preset ultrafast 
-c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 
-filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[a];[0:v][a]overlay=x=W-w-10:y=0[out]" 
-map "[out]" -movflags faststart -map 1:a b.mp4

多路视频拼接

ffmpeg  -f avfoundation -i "1" -framerate 30 -f avfoundation   -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[0:v]scale=320:240[a];[a]pad=640:240[b];[b][1:v]overlay=320:0[out]" -map "[out]" -movflags faststart  -map 1:a  c.mp4

添加水印

ffmpeg -i out.mp4  -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4
  • -vf中的 movie 指定logo位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。

删除水印

先通过 ffplay 找到要删除 LOGO 的位置

ffplay -i test.flv -vf delogo=x=806:y=20:w=70:h=80:show=1

使用 delogo 滤镜删除 LOGO

ffmpeg -i test.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv

裁剪

ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4
  • -ss 指定裁剪的开始时间,精确到秒,时:分:秒
  • -t 被裁剪后的时长,单位为秒

合并

首先创建一个 inputs.txt 文件,文件内容如下:

file ‘1.flv’
file ‘2.flv’
file ‘3.flv’

然后执行下面的命令:

ffmpeg -f concat -i inputs.txt -c copy output.flv

hls切片

ffmpeg -i out.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls  out.m3u8
  • -strict -2 指明音频使有AAC。
  • -f hls 转成 m3u8 格式。

视频转JPEG

ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg
  • -r : 图片转出的帧率,每秒钟转出1张图片
  • -f : 将输入文件转成什么格式
  • %3d是动态的,3个数字组成的

视频转gif

ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif

图片转视频

这个会一下把所有帧全部输出

ffmpeg  -f image2 -i image-%3d.jpeg images.mp4
  • -i : 表示输入,后面是图片

播放YUV 数据

ffplay -pix_fmt nv12 -s 192x144 1.yuv 

播放YUV中的 Y平面

ffplay -pix_fmt nv21 -s 640x480 -vf extractplanes='y' 1.yuv
原网站

版权声明
本文为[狗蛋儿l]所创,转载请带上原文链接,感谢
https://blog.csdn.net/zranxi/article/details/122795801