FFMpeg常用命令总结

2,260 阅读5分钟

查询相关

FFMpeg版本相关信息

ffmpeg -version

显示可用的格式(包括设备)。

ffmpeg -formats

显示可用的解复用器

ffmpeg -demuxers

显示可用的复用器

ffmpeg -muxers

显示可用的设备:音视频采集(摄像头,麦克风)

ffmpeg -devices

显示所有的编解码器

ffmpeg -codecs

显示所有的编码器

ffmpeg -encoders

显示所有的解码器

ffmpeg -decoders

显示可用的协议

ffmpeg -protocols

显示可用的libavfilter过滤器

ffmpeg -filters

显示可用的比特流filter

ffmpeg -bsfs

显示可用的像素格式

ffmpeg -pix_fmts

显示可用的采样格式

ffmpeg -sample_fmts

录制相关

首先查看MAC支持的音视频采集设备

ffmpeg -f avfoundation -list_devices true -i ""

输出

[AVFoundation input device @ 0x7fb0d1f00240] AVFoundation video devices://视频设备
[AVFoundation input device @ 0x7fb0d1f00240] [0] FaceTime HD Camera//摄像头采集
[AVFoundation input device @ 0x7fb0d1f00240] [1] Capture screen 0//屏幕采集
[AVFoundation input device @ 0x7fb0d1f00240] AVFoundation audio devices://音频设备
[AVFoundation input device @ 0x7fb0d1f00240] [0] Built-in Microphone//麦克风采集

屏幕录制无声音

ffmpeg -f avfoundation -i 1 -r 30  out.yuv

-f : 指定使用avfundation(MAC媒体框架) 采集数据
-i : 指定采集数据的设备的索引,通过上一条命令结果可知,0为屏幕
-r : 指定采集帧率。 -r 限制输出,-framerate 限制输入

播放录制的YUV视频

ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv

-s : 指定分辨率
-pix_fmt: 指定原始数据格式。yuv 有444 422 420三种

录屏带声音

ffmpeg -f avfoundation -i 1:0 -r 30 out.flv

-i : 冒号前为视频采集设备索引,冒号后为音频采集设备索引

封装格式直接播放

ffplay out.flv

摄像头录制视频

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

-framerate : 限制视频采样帧率,不设置会报错
-i : 0表示摄像头

摄像头视频加声音录制

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

录音

ffmpeg -f avfoundation -i :0 out.wav

-i : :0表示只录制音频

录制音频原始数据

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

-ar : 音频采样率为44.1K 

分解与复用

提取音频流

ffmpeg -i 1578361708648565.mp4 -acodec copy -vn out3.aac

-i : 输入文件
-acodec : 指定音频编码器,copy 为只拷贝,不编码
-vn : v代表视频 n代表no 无视频

提取视频流

ffmpeg -i 1578361708648565.mp4 -vcodec copy -an out4.h264

-an : 无音频
-vcodec : 拷贝视频

格式转换

ffmpeg -i 1578361708648565.mp4 -vcodec copy -acodec copy 3333.flv

音频和视频数据都通过拷贝,不做编解码处理。 重新muxer为新的格式

音频流视频流合并

ffmpeg -i out4.h264 -i out3.aac -vcodec copy -acodec copy 4444.mp4

音视频数据通过拷贝,不做编解码处理,直接muxer为新的文件

处理原始数据

提取YUV数据

ffmpeg -i 1578361708648565.mp4 -an -c:v rawvideo -pixel_format yuv420p 555.yuv

-c:v rawvideo : 将视频转为原始数据
-pixel_format : 指定yuv格式为yuv420p

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 1578361708648565.mp4 -vn -ar 44100 -ac 2 -f s16le 666.pcm

-ac : audio channl 音频双通道
-f s16le : 音频格式,silk格式为16位有符号小端存储模式

播放: ffplay -ar 44100 -ac 2 -f s16le -i 666.pcm

PCM转WAV

ffmpeg -f s16be -ar 44100 -ac 2 -acodec pcm_s16be -i 666.pcm output.wav

播放:ffplay -f s16be -ar 44100 -ac 2 -i output.wav

滤镜

添加水印

$ ffmpeg -i 1578361708648565.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 -i water.mp4 -vf delogo=x=806:y=20:w=70:h=80:show=1

使用delogo滤镜删除

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

视频裁剪

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 -i out.mp4 -ss 00:00:00 -t 10 out1.mp4

-ss : 指定开始裁剪的实践
-t : 裁剪后的时长

合并

创建filelist.txt文件

file '1.flv'
file '2.flv'
file '3.flv'

然后执行命令

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

视频与图片转换

视频转jpeg

ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg

视频转gif

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

图片合并为视频

ffmpeg  -f image2 -i image-%3d.jpeg images.mp4