查询相关
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