基本用法
1.获取视频的基本信息:
ffprobe -v error -show_format -show_streams input.mp4
计算帧数:
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
2.将视频解码为图片:
ffmpeg -i test.mp4 -f image2 %d.png
3.将图片编码为视频:
ffmpeg -r 30 -f image2 -i %d.png -b:v 100000k -vf "fps=30,format=yuv420p" output.mp4
4.视频缩放
假设原始视频尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以缩小到 480p:
命令如下:
ffmpeg -i input.mp4 -vf scale=853:480:flags=bicubic -acodec aac -vcodec h264 视频输出地址(如:out.mp4)
5.压缩视频
命令行参数-crf
在优先保证画面质量(也不太在乎转码时间)的情况下,使用-crf参数来控制转码是比较适宜的。这个参数的取值范围为0~51,其中0为无损模式,数值越大,画质越差,生成的文件却越小。从主观上讲,18~28是一个合理的范围。18被认为是视觉无损的(从技术角度上看当然还是有损的),它的输出视频质量和输入视频相当。
我们的策略是,在保证可接受视频画质的前提下,选择一个最大的crf值——如果输出视频质量很好,那就尝试一个更大的值;如果看起来很糟,那就尝试一个小一点的值。
旋转视频角度:
ffmpeg -i success.mp4 -metadata:s:v rotate="90" -codec copy output_success.mp4
让我们先执行下面这条命令(关于FFmpeg运行环境的配置,请参阅这篇文章):
ffmpeg -i D:\src.mov -c:v libx264 -preset veryslow -crf 18 -c:a copy D:\dest1.mp4
可能遇到下面的问题:
Past duration 0.603325 too large
Past duration 0.603325 too large
Past duration 0.603325 too large
Past duration 0.603325 too large
原因:This warning message appears when trying to encode a high frame rate source to a low frame rate output, which means frames need to be dropped. 问题链接:https://stackoverflow.com/questions/30782771/what-does-past-duration-x-xxx-too-large-mean
设置帧率可以解决这个问题,设置-r 30,但如果要HR保存为LR的同时保证帧对齐,就需要保证帧率一致,不能随便设置-r的参数值,可以忽略上面的异常
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
1 2 3 |
|
6.视频旋转+scale
使用-vf参数
ffmpeg -i input.mp4 -vf "scale=640:480,transpose=1" output.mp4
For rotation operations, transpose keyword must be used. Available parameters:
- 0 for rotate 90-deg counter-clockwise and vertically flip
- 1 for rotate 90-deg clockwise
- 2 for rotate 90-deg counter-clockwise
- 3 for rotate 90-deg clockwise and vertically flip
ffmpeg常用命令:
# merge image to video
## change framerate for speed 1=slow, 2=faster, 3=more faster and so on
ffmpeg -framerate 2 -pattern_type glob -i '*.jpg' -c:v libx264 -r 30 -pix_fmt yuv420p input.mp4
# rotate vertically image
ffmpeg -i input.mp4 -vf vflip output.mp4
# wav to mp3
ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3
# resize
ffmpeg -i output.mp4 -vf scale=320:240:flags:bicubic final.mp4
# or larger
ffmpeg -i output.mp4 -vf scale=960:480 final.mp4
# take first image to png
ffmpeg -i video.mp4 -ss 00:00:00 -vframes 1 out.png
# convert .mov to .mp4 try one of them
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -c:a aac -strict experimental output.mp4
# change framerate
ffmpeg -y -i avioncote-original.mp4 -r 25 -s 960x540 -c:v libx264 -b 3M -strict -2 -movflags faststart destination.mp4
# cut video
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
# extract sound
ffmpeg -i input_video.mp4 -async 1 output_audio.wav
# info / bitrate / etc
ffmpeg -i "filename.mp4" -hide_banner
# change bitrate (2M) = 2100000 ~= 2M
ffmpeg -i input.mp4 -b 2100000 output.mp4
参考:https://www.jianshu.com/p/053665062f22
参考:https://blog.csdn.net/happydeer/article/details/52610060
参考:http://einverne.github.io/post/2015/02/ffprobe-show-media-info.html