前言&常见问题
并非专业介绍,只是萌新刚使用的心得,有些问题可能你不会发生,或者本文介绍的并不严谨_(:з)∠)_据说大部分编码软件内核就是ffmpeg。从上到下记录重要的点,尽量不重复,看不懂就往上翻翻。
- 输出输入目录是否加双引号:如果目录文字不含特殊符号可以不用加。
- 编码器参数最好先自己看一遍,这里不做详细介绍,可以用
ffmpeg -h encoder=编码器名字
看到相关参数
一、libx264编码
网上找的一个B站4K输出(示例,为方便观看进行了换行!):点击跳转
ffmpeg -i 输入目录 -c:v libx264 -profile:v main -b:v 19000k -r 60 -x264opts crf=12
-profile:v main -preset veryslow -c:a aac -b:a 192k -maxrate:v 60000k -bufsize 60000k -pix_fmt yuv420p 输出目录
不知道为什么有2个-profile:v main
-c:v是视频编码器,后面的:v是指video,会经常用到。
-profile,-crf,-profile 是libx264的参数,参数介绍说的很详细。要注意的是preset是越慢质量越高,部分编码都有类似选项。其中crf模式相对于8bit量化比例范围是0-51,10bit是0-63(不知道怎么手动调整10bit,默认就当作8bit吧)。最常用的8bit为例18~28为合适范围。crf加6,视频码率减半,相反则翻倍。配合crf 模式使用的时候,如果设置的 crf 值过低,视频码率可能超出 maxrate 的时候,编码器会自动调整 crf,避免出现较大的码率波动。然而,x264不会严格控制你指定的最大码率,除非使用 2 pass 模式。
-r和-b:v是帧数和码率,这些参数不会在编码器参数里显示,类似公共参数。vbr编码视频好像会自动识别,-b变成平均帧率?
-maxrate 码率峰值,-bufsize码率缓冲区大小,一般是maxrate=bufsize
-c:a和-b:a就是audio相关的了,很多专业编码工具和录像工具都有。
-pix_fmt yuv420p是像素格式,大部分用不到。
无损压缩
ffmpeg -i input -c:v libx264 -preset veryslow -qp 0 output.mkv ,用qp=0代替crf=0是因为8bit和10bit视频的crf=0底层参数不一样。
小结:
- libx264的crf模式不能使用-pass 2,具体怎么使用2pass没研究了。这个编码速度很慢。
- -profile:v mian crf=18可能某些画面会部分花屏(不是全屏花了),-profile:v high就不会了。
- CPU编码,直接100%占用拉满了。
二、h264_nvenc编码
上面B站4K命令行改的(示例,为方便观看进行了换行!):
ffmpeg -i "输入目录" -c:v h264_nvenc -profile:v high -level 5.1 -rc vbr -preset slow -bf 2 -cq 25 -b:v 19000k
-maxrate:v 60000k -bufsize 60000k -c:a copy "输出目录"
部分参数都是参考他人在部分编码软件的预设配置,套用到ffmpeg里面,毕竟内核都是ffmpeg。具体意思百度都有就不说了,都是照搬也不懂。不过ffmpeg -h encoder=h264_nvenc
能看到该编码特有参数。
-bf2 使用2个B帧,支持mpeg1,mpeg2,mpeg4(即如果-bf 2的话,在两个非b帧中间隔的b帧数目为2,即IBBPBBPBBP结构),很多地方都是这样介绍的,去掉也感觉不到区别。。。。。。
-cq就是h264_nvenc自带的了,是动态编码的一个质量,越低越好。
vbr编码视频好像会自动识别,-b变成平均帧率?
小结:
- 用N卡编码,速度提升飞快。
批处理
处理该文件夹所有MP4
以标题二的h264_nvenc举例(示例,为方便观看进行了换行!)参考链接
for %%i in (.\*.mp4) do ffmpeg -i "%%i" -c:v h264_nvenc -profile:v high -level 5.1 -rc vbr -preset slow -bf 2
-cq 25 -b:v 19000k -maxrate:v 60000k -bufsize 60000k -c:a aac -b:a 192k "%%~dpni_new.mp4"
新建文本复制进去,另存为后缀改为bat,编码为ANSI。放到需要编码的视频文件夹里双击就把该文件夹的mp4视频全编码了。
简单介绍:%i
指(.\*.mp4)
里后缀为mp4的文件,for %i in (.\*.mp4) do
就是指这个目录下的所有后缀为mp4的文件都执行下列操作。%~dpni
1就是这个文件的盘符,文件夹名,文件名照抄过来。然后接了个自定义的_new.mp4
。例如1.mp4处理完就在原目录下生成一个1_new.mp4文件,批处理中的for写法系统会屏蔽一个%
,所以多加一个%
,cmd窗口中不用。
只处理拖拽文件
示例(为了方便观看进行了换行):
ffmpeg -i "%~dpnx1" -c:v h264_nvenc -profile:v high -level 5.1 -rc vbr -preset slow -bf 2 -cq 25 -b:v 19000k
-maxrate:v 60000k -bufsize 60000k -c:a aac -b:a 192k "%~dpn1_new.mp4"
会在源文件所在处新建一个原名_new.mp4文件
总结
继续完善中;
%~dpni里的i和 %~dpn1,没找到区别在哪,不过写成i的时候经常在for语句里。 ↩︎