8
votes

I'm working in python with some images and I'm trying to convert a series of images with size = 961x509 into an MP4 movie file. I've already did this and it's working but I have a quite annoying problem with a warning which says something like this :

WARNING:root:IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (509L, 961L) to (512L, 976L) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to None (risking incompatibility). You may also see a FFMPEG warning concerning speedloss due to data not being aligned. [swscaler @ 04f8ac40] Warning: data is not aligned! This can lead to a speedloss

The problem that warning appears is my images resolution, that resolution should be divisible by 2, but mine it doesn't. Is it there any possibility to just make this warning to don't appear again? Because I can't change the size of my images and in the same time I don't want to resize all of them.

Here is my code:

ready_images = []

for img in videos['Images']:
    image = imageio.imread(img.fileName)
    ready_images.append(image)

videoName = videos['Images'][0].gifLocationPath + "//" + videos['Name']
imageio.mimwrite(videoName, ready_images, 'MP4')

Is anyone here how has a solution for me?

UPDATE:

If I'm gonna put macro_block_size to None in this way(That's the only way I know):

ready_images = []

for img in videos['Images']:
    image = imageio.imread(img.fileName)
    ready_images.append(image)

video_name = videos['Images'][0].gifLocationPath + "//" + videos['Name']
imageio.mimwrite(video_name, ready_images, 'MP4', macro_block_size = None)

I will receive this error message:

Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

Traceback (most recent call last): File "", line 146, in run() File "", line 136, in run for i, _ in tqdm(enumerate(pool.imap_unordered(generateGIFsWithThreads, videoList))): File "", line 953, in iter for obj in iterable: File "", line 673, in next raise value IOError: [Errno 32] Broken pipe

FFMPEG COMMAND: ffmpeg -y -f rawvideo -vcodec rawvideo -s 961x509 -pix_fmt rgb24 -r 10.00 -i - -an -vcodec libx264 -pix_fmt yuv420p -crf 25 -v warning D:\work\hero_forge\build\win32\Documents\GIFs\CH3_M1_0.mp4

FFMPEG STDERR OUTPUT:

1
The warning message is literally telling you why it's there and how to get rid of it: "To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to None (risking incompatibility)."Aran-Fey
I know this... and this is what I've already tried but I just forget to say in the question. So I've just update my question, if you have any solution for me please let me knowcavaler12345

1 Answers

2
votes

Just to follow up on this in case of anyone from the Google is looking for the answer... Better to add in extra parameters as a wildcard. You just need to add in macro_block_size as a karg with the correct formatting. For example:

kargs = { 'fps': 3, 'quality': 10, 'macro_block_size': None, 
    'ffmpeg_params': ['-s','600x450'] }
imageio.mimsave(gifOutputPath, images, 'FFMPEG', **kargs)

In the OP example it would be:

ready_images = []

for img in videos['Images']:
    image = imageio.imread(img.fileName)
    ready_images.append(image)

video_name = videos['Images'][0].gifLocationPath + "//" + videos['Name']
kargs = { 'macro_block_size': None }
imageio.mimwrite(video_name, ready_images, 'MP4', **kargs)