FFmpeg视频转码关键参数详解
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1 固定码率因子crfConstant Rate Factor
固定码率因子CRF是 x264 和 x265 编码器的默认质量和码率控制设置。取值范围是 0 到 51这其中越低的值结果质量越好同时输出文件越大越高的值意味着越高的压缩比但可能会在值大到某个点的时候注意到明显的质量损失。
- 对 x264一般取值在 18 到 28 之间默认值是 23。
- 对 x265默认CRF值是 28
CRF数值 +6 会使文件大小减半为了达到最优编码效果主要在离线文件存储中使用CRF编码如下
命令行使用示例如下
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
2 指定编码速度preset
指定的编码速度越慢获得的压缩效率就越高取值范围如下
ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo
- placebo与veryslow相比提高了1%以极高的编码时间为代价
- veryslow与 slower相比提升了3%
- slower与slow相比提升了5%
- slow 与 medium相比提升了5%~10%
3 视频帧率
3.1 输入帧率
帧率(frame per second)就是视频每秒播放的图片的帧数。帧率至少要达到15fps人眼才能才能看到连贯的动作。15fps即1秒刷新15次。帧率主要分为两类一种是交错的(interlaced 缩写为i)一种是步进的(progressive 缩写为p)。
- 交错帧率(interlaced 缩写为i)一般应用在电视节目上。NTSC(美国电视标准)使用60i的帧率也就是每秒60个交错场(也就是30帧两个交错场就是一帧)。PAL和SECAM标准使用50i的帧率也就是每秒25帧。
- 步进帧率(progressive 缩写为p)通常使用在电影节目上常使用的值包括24p、25p、30p。最近一些高清的电影电视终端节目上30p已经无法满足需求最新使用的帧率通常为50p和60p。
常见帧率的使用场景说明如下表所示:
帧率 | 描述 |
24p/23.976p | 电影行业从1920年引入的标准帧率在早期电影节目上使用的比较频繁。 NTSC采用该帧率的时候将帧率降到了23.976,PAL/SECAM采用该帧率的时候将帧率升到了25fps |
25p | 使用50HZ电子频率国家中的电视电影节目的标准帧率因为25p的帧率很容易转换成50i的帧率 |
30p | 数码相机和摄像机的帧率30p的帧率很容易转换成60i用于电视直播 |
50i | PAL和SECAM电视标准的标准帧率 |
60i/59.94 | NTSC标准中的标准帧率 |
50p/60p | 高清电视(HDTV)常用的帧率 |
48p | 新提出的帧率 |
72p | 新提出的帧率 |
120p | 超高清电视节目(UHDTV)使用的帧率 |
ffmpeg -i input.mp4
输出的帧率fps如下
Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 19999 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 120k tbc (default)
3.2 输出帧率
在设置输出视频的帧率时需要使用-r选项。以下是使用-r项设置输出视频帧率为30 fps的示例命令
ffmpeg -i input.mp4 -r 30 output.mp4
使用-r选项将输出视频的帧率设置为30 fps。输出视频的文件名为output.mp4。
通过代码使用Python的subprocess模块调用ffmpeg设置输出视频帧率
import subprocess
input_file = 'input.mp4'
output_file = 'output.mp4'
frame_rate = 30
command = ['ffmpeg', '-i', input_file, '-r', str(frame_rate), output_file]
subprocess.run(command)
4 输出分辨率
将input.mp4更改为分辨率320*240的视频输出命令示例
ffmpeg -i input.mp4 -s 320x240 output.mp4
分辨率 | Bitrate | 10分钟的视频 |
---|---|---|
320p 320×240 | 180 kbit/s | ~13 MB |
360p 640×360 | 300 kbit/s | ~22 MB |
480p 864×480 | 500 kbit/s | ~37 MB |
576p 720x576 | 850 kbit/s | ~63 MB |
720p 960×720 | 1000 kbit/s | ~75 MB |
5 视频文件转gif图像
-ss | 开始截图时间秒 | 截图开始时间越接近篇尾所花费的时间就越长。 |
-t | 截图时长秒 | 省略-ss和-t转换整个视频文件。 |
-i | 输入文件 | |
-y | 覆盖旧文件 | |
-s | gif图片的宽和高 | |
-f | 生成图片格式 | 可以省略按扩展名转换 |
-r | 帧率 | 视频文件中每一秒的帧数 |
命令示例
ffmpeg -ss 5 -t 10 -i input.mp4 -y -s 640x480 -f gif -r 1 output.gif
6 用图片制作视频和gif
将test-001.jpgtest-002.jpg…顺序排列的图片文件转换为视频和gif。
ffmpeg -f image2 -r 1 -i test-%03d.jpg -y output.mp4
ffmpeg -f image2 -r 1 -i test-%03d.jpg -y output.gif