为什么在将图像转换为视频时总是排除最后一帧?

ig9co6j1  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(384)

我有一个文件夹,里面有225张Map。所以,我用 imageio . 不管是汇编10张Map、150张Map,还是全部225张Map,最后一张图片总是不包括在视频中。

import os
from natsort import humansorted
import imageio

os.chdir(r'folder/path/')
filenames = humansorted((fn for fn in os.listdir('.') if fn.endswith('.png')))
with imageio.get_writer('earthquake_video.mp4', mode='I', fps=2) as writer:
    for filename in filenames:
        image = imageio.imread(filename)
        writer.append_data(image)
    writer.close()
w7t8yxp5

w7t8yxp51#

对我来说,只要我在windows media player中打开生成的视频,你的代码就可以处理10、150甚至225个图像。如果我打开视频在vlc媒体播放器,我得到扭曲的播放,不仅跳过了最后一帧(我有从0到224的数字,所以每一个错误的帧都会被注意到。)所以,如果你使用vlc媒体播放器,你的问题很可能就是这个stackoverflow问答中讨论的问题。
imageio github问题追踪者,也有这个问题,链接到另一个stackoverflow问题,这个问题似乎和你的问题一样。但是,我仍然认为这是vlc媒体播放器的上述问题。
不幸的是,我无法从使用 output_paramsimageio ,即设置 -framerate 或者 -r . 所以,我的解决方法是建立一个 fps (此处: 2 ),和 fps 对于实际播放(在vlc媒体播放器中),例如。 30 ,然后只需根据需要添加尽可能多的相同帧即可伪造所需的图像 fps ,即。 30 // 2 = 15 在这里。
下面是一些代码:

import os
import imageio

os.chdir(r'folder/path')
filenames = [fn for fn in os.listdir('.') if fn.endswith('.png')]
fps = 2             # Desired, "real" frames per second
fps_vlc = 30        # Frames per second needed for proper playback in VLC
with imageio.get_writer('earthquake_video.mp4', fps=fps_vlc) as writer:
    for filename in filenames:
        image = imageio.imread(filename)
        for i in range(fps_vlc // fps):
            writer.append_data(image)
    writer.close()

生成的视频“看起来”和以前一样(在windows media player中),但现在,它也可以在vlc media player中正常播放。
甚至,如果这不是你的实际问题,我猜这些信息将有助于其他遇到你的问题,但实际上从与vlc媒体播放器声明的问题痛苦。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
PyCharm:       2021.1.1
imageio:       2.9.0
----------------------------------------

相关问题