FFMPEG常用命令-格式转换-持续更新中
---恢复内容开始---
ffmpeg是一个强大的工具,在工作中各种格式转换,编码,提取视频中的帧需要用到,记录下工作中常用的一些ffmpeg命令,持续更新中...
将输入的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(CRF和QP的区别详见另一篇博文)
将输入的handshake视频文件转码成dest1视频文件
ffmpeg -i handshake.avi -c:v libx264 -preset slow -qp 37 -c:a copy dest1.mp4
-i input file -c:v 和-codec:v以及-vcodec是一个意思,设置video的codec方式
-preset 设置一些编码参数,有很多level
- ultrafast
- superfast
- veryfast
- faster
- fast
- medium – default preset
- slow
- slower
- veryslow
- placebo(一般不用)
可以省略,默认是"medium",越慢质量越高
-qp 设置固定的量化参数 -c:a 等同于-acodec和-codec:a 设置audio的codec方式是copy
将一个文件夹的所有视频每隔一定帧数提取出图片
for %%i in (*.mov) do ( ffmpeg -i %%i -vf "select=not(mod(n\,50))" -vsync vfr "%%~ni_%%03d.bmp" )
for %%i in (*.mov) 遍历文件夹中所有mov为后缀的文件
-i input video -vf 等同于-filter:v 具体信息参见ffmpeg官方文档 select选择哪些输入帧会输出,这边选择的是所有整除50的需要输出 第0,50,100... -vsync 设置视频的同步方式 这里的vfr是指传timestamp,如果两帧相同的timestamp需要丢掉 最后"%%~ni_%%03d.bmp"是指输出的bmp的名字是输入的video的名字后面加上001 002 003等
从一个input raw 视频中抽取出每一帧
ffmpeg -f rawvideo -framerate 25 -s 1280x720 -pixel_format yuv420p -i in.yuv -c copy -f segment -segment_time 0.01 frames%d.yuv
-f 指定输入的format为rawvideo -framerate设置帧率 -s 设置输入视频的分辨率 -pixel_format设置输入视频的格式 -i 输入的raw视频 -c 设置输入到输出的codec方式,这里为copy,不需要编解码 -f 指定输出格式,把输入的video分成好多个小段,只要后面设置的segment_time(0.01)比一帧的时间短(这里是1/25=0.04),就会把一帧分成一段,然后存入到yuv中
---恢复内容结束---
ffmpeg是一个强大的工具,在工作者各种格式转换,编码,提取视频中的帧需要用到,记录下工作中常用的一些ffmpeg命令,持续更新中...
将输入的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(CRF和QP的区别详见另一篇博文)
将输入的handshake视频文件转码成dest1视频文件
ffmpeg -i handshake.avi -c:v libx264 -preset slow -qp 37 -c:a copy dest1.mp4
-i input file -c:v 和-codec:v以及-vcodec是一个意思,设置video的codec方式
-preset 设置一些编码参数,有很多level
- ultrafast
- superfast
- veryfast
- faster
- fast
- medium – default preset
- slow
- slower
- veryslow
- placebo(一般不用)
可以省略,默认是"medium",越慢质量越高
-qp 设置固定的量化参数 -c:a 等同于-acodec和-codec:a 设置audio的codec方式是copy
将一个文件夹的所有视频每隔一定帧数提取出图片
for %%i in (*.mov) do ( ffmpeg -i %%i -vf "select=not(mod(n\,50))" -vsync vfr "%%~ni_%%03d.bmp" )
for %%i in (*.mov) 遍历文件夹中所有mov为后缀的文件
-i input video -vf 等同于-filter:v 具体信息参见ffmpeg官方文档 select选择哪些输入帧会输出,这边选择的是所有整除50的需要输出 第0,50,100... -vsync 设置视频的同步方式 这里的vfr是指传timestamp,如果两帧相同的timestamp需要丢掉 最后"%%~ni_%%03d.bmp"是指输出的bmp的名字是输入的video的名字后面加上001 002 003等
从一个input raw 视频中抽取出每一帧
ffmpeg -f rawvideo -framerate 25 -s 1280x720 -pixel_format yuv420p -i in.yuv -c copy -f segment -segment_time 0.01 frames%d.yuv
-f 指定输入的format为rawvideo -framerate设置帧率 -s 设置输入视频的分辨率 -pixel_format设置输入视频的格式 -i 输入的raw视频 -c 设置输入到输出的codec方式,这里为copy,不需要编解码 -f 指定输出格式,把输入的video分成好多个小段,只要后面设置的segment_time(0.01)比一帧的时间短(这里是1/25=0.04),就会把一帧分成一段,然后存入到yuv中
利用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