FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可轻易实现多种视频格式之间的相互转换。
ffmpeg支持的选项:
可用的bit流 :ffmpeg –bsfs
可用的编解码器:ffmpeg –codecs
可用的解码器:ffmpeg –decoders
可用的编码器:ffmpeg –encoders
可用的过滤器:ffmpeg –filters
可用的视频格式:ffmpeg –formats
可用的声道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的协议:ffmpeg -protocals
将输入的infile视频文件通过avc编码成h264的视频流:
ffmpeg -i infile.mp4 -an -vcodec libx264 -crf 23 outfile.h264
-i input file -an disable audio -vcodec 指定编码类型 -crf 采用cf的编码方式并设定level为23,是指编码后图像的质量。
利用ffmpeg计算ssim/psnr
ffmpeg -s 1920x1080 -i F1.yuv -s 1920x1080 -i F2.yuv -lavfi"ssim=“stats_file=stats_ssim.log”;[0:v][1:v]"psnr=“stats_psnr.log”-f null -
F1.yuv为需要计算ssim的视频 F2.yuv为参考视频 -s设置分辨率 -i设置input视频ffmpeg-filters.html -lavfi是跟-filter_complex一个意思,设置滤波器,ffmpeg支持的filter有很多种类型,在下载的ffmpeg的包里面有一个叫做ffmpeg-filters.htm的网页就是讲的支持的各种filter, 详见 https://ffmpeg.org/ffmpeg-filters.html 。ssim是其中支持的一个filter,在使用ssim的时候,要求输入的两个video要有相同的format resolution,而且帧数要一样,每一帧都会算一个ssim的值 。stats_file是将结果存在指定的文件stats_ssim.log中[0:v][1:v]指的是第一个视频的video和第二个视频的video。
ffmpeg码率控制
ffmpeg -i input.mp4 -b:v 2000k output.mp4
-b:v主要是控制平均码率上面把码率从原码率转成2Mbps码率,这样其实也间接让文件变小了。目测接近一半。不过,ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize ,-bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
ffmpeg截取视频保存图像
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒几帧 -q:v表示存储jpeg的图像质量,一般2是高质量。 如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。
设置开始的时间,和想要截取的时间:
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示开始时间 -t 表示共要多少时间,上述命令就是ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧
ffmpeg编码
h264编码
E:\ffmpeg.exe -s 1920x1080 -pix_fmt yuv420p -i E:\Demo_1920_1080_HD.yuv -vcodec libx264 -x264-paramsfps=25:bframes=7:keyint=24:bitrate=2000:preset=fast Demo_1920_1080_2M.h264
h265编码
E:\ffmpeg1.exe -s 720x576 -pix_fmt yuv420p -i
E:\demo_720_576.yuv -vcodec libx265 -x265-params
fps=25:bframes=7:keyint=24:bitrate=2000:preset=fast demo_720_576_2M.h265
调整视频分辨率:
ffmpeg -i input.mp4 -s 1920x1080 output.mp4
视f频缩小一倍
fmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4
-vf scale 指定使用简单过滤器 scale,iw/2:-1 中的iw指定按整型取视频的宽度。 -1 表示高度随宽度一起变化。
图像合成视频
ffmpeg -loop 1 -start_number 000001 -f image2 -i D:\Tools\YUV\cif\image\pic-%06d.jpeg -vcodec libx264 -r 25 -t 3 video.mp4
ffmpeg -loop 1 -start_number 000001 -f image2 -i D:\Tools\YUV\cif\image\pic-%06d.jpeg -r 25 -t 3 video1.yuv
-loop 表示是否循环读入1表示循环,0表示读完结束,-start_number 从第几帧开始,-r 是输出的帧率,-t 合适视频的长度,单位是秒
mp4转换为YUV
ffmpeg -i .\video.mp4 -s 352x288 -pix_fmt yuv420p video_352x288.yuv
ffmpeglinux录制视频
ffmpeg -framerate 25 -f x11grab -s 1920x1080 -i :0.0 v-out.mp4
-f 指定使用 x11grab 采集数据
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-i 指定从哪儿采集数据,它是一个文件索引号。在我的MAC上,1和2(外界显示器)都代表桌面
先写到这吧,后续在更新