在尝试用FFmpeg结合CV模型做视频预测时,为了提高预测效率,在对单张视频帧预测前使用Pillow对图像做了压缩,代码如下:
def img_thumbnail(img: Image.Image) -> \
(Image.Image, int, int):
"""
缩放图片
:param img:
:return: 返回图片对象的缩略图,宽,高
"""
if img.size[0] > 360 or img.size[1] > 360:
size = 360, 360 # 最高像素360
img.thumbnail(size, Image.ANTIALIAS)
return img, img.size[0], img.size[1]
之后对预测后的图片压缩成视频时,FFmpeg抛出如下异常:
...
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
[libx264 @ 0x5645875d8cc0] height not divisible by 2 (360x203)
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!
直译过来就是:高度不能被2整除。从反馈的信息可以看到,压缩后的图片是360x203,即图像的像素高度是203,查阅资料得知H264编码需要视频的宽、高可被2整除参考。
解决方法也比较简单,360x203实际上是640x360等比例缩放得到的,只要指定图片的像素为360x204即可。