关于ffmpeg height not divisible by 2的错误

在我们线上视频生产过程中,我们用ffmpeg对视频做了resize,讲原有的分辨率resize到1280p,使用了参数 -vf "scale=1280:-1",作用是将原始视频宽度缩放成1280,-1是指高度等比例缩放。 之前一直运行的好好的,直到我们出现了一种新的视频分辨率,结果就运行不了,如下图:

排查发现我们出现了一部分原始分辨率为3312x3040的输入视频,当宽缩放成1280的时候,高恰好等比例缩放成为了1175,而奇数分辨率对部分视频编码而言是一个非法参数 ,原因主要如下:

FFmpeg 默认不允许生成视频的分辨率宽度或高度为奇数主要与视频压缩标准和编解码过程中的某些算法要求有关。许多视频编码标准,例如H.264和H.265,使用了块为基础的编码方法。这些块通常是宽度和高度都是2的倍数的矩形(例如,4x4, 8x8, 16x16等)。当编码器处理视频帧时,如果帧的宽度或高度是奇数,将不能够将图像完整地分割成标准的块,这可能会导致编码过程中出现问题。例如,如果有一个奇数宽度的视频帧,最右边会有一个无法形成完整块的列像素。这样的非标准块需要编码器进行额外的处理,可能会降低编码效率,增加复杂性,并可能导致兼容性问题。**

解决方案当然很简单,那就是将分辨率强行指定成偶数即可,在当我思索难道要放弃-1这个好用的自适应参数,在指定宽为1280时,自己去计算出一个高来的时候。突然发现了-2这个参数。

在ffmpeg的scale 参数中,可以使用 -1 和 -2 这样来等比例缩放视频大小,但二者略有差异,建议使用-2而不是-1,之前我们就是使用了-1才出现的问题,二者的具体差异如下:

  • -1scale 过滤器中用作自动计算宽度或高度的占位符,同时保持源视频的宽高比不变。例如,如果你只指定宽度为1280,然后将高度设置为-1,FFmpeg 会计算出一个高度值,使新视频保持原始视频的比例。

    bash 复制代码
    ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4
  • -2 的作用与 -1 类似,也是用于自动计算另一个尺寸,同时保持宽高比。但 -2 的特殊之处在于,它会确保计算出的宽度或高度是偶数,这是为了满足某些视频编码器的要求,它们需要偶数的分辨率尺寸。这对于编码像H.264这样的视频时特别重要,因为(如前所述)这些编码器使用基于块的编码算法,其要求块的尺寸(通常是16×16像素或其它偶数尺寸)能够完全适应视频帧的尺寸。

    bash 复制代码
    ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4
相关推荐
小神.Chen16 小时前
YouTube音视频合并批处理基于 FFmpeg的
ffmpeg·音视频
昱禹2 天前
记一次因视频编码无法在浏览器播放、编码视频报错问题
linux·python·opencv·ffmpeg·音视频
寻找09之夏2 天前
【FFmpeg 深度解析】:全方位视频合成
ffmpeg·音视频
zanglengyu2 天前
ffmpeg取rtsp流音频数据保存声音为wav文件
ffmpeg·音视频
cuijiecheng20182 天前
音视频入门基础:FLV专题(11)——FFmpeg源码中,解析SCRIPTDATASTRING类型的ScriptDataValue的实现
ffmpeg·音视频
汪子熙3 天前
什么是 LDAC、SBC 和 AAC 音频编码技术
ffmpeg·音视频·aac
cpp_learners3 天前
Windows环境 源码编译 FFmpeg
windows·ffmpeg·源码编译·ffmpeg源码编译
cuijiecheng20183 天前
音视频入门基础:FLV专题(8)——FFmpeg源码中,解码Tag header的实现
ffmpeg·音视频
职场人参3 天前
如何改变音频声音大小?关于改变音频大小的方法介绍
android·ffmpeg
这样咯3 天前
javacv FFmpegFrameGrabber 阻塞重连解决方法汇总
java·ffmpeg