Video 不可靠的缓存和预读视频帧

Video 不可靠的缓存和预读视频帧,video,caching,Video,Caching,我正在开发一个同时显示多个视频的应用程序。视频以充满图像文件的目录形式存储。对于每个帧编号,最多有9个映像必须从磁盘加载。我想为图像实现缓存和预读。这将非常简单,但复杂的是文件系统(有时是网络FS)的速度远远不够快,无法显示每个图像。因此readahead应该选择要加载的帧,并且只对这些图像发出read()请求。此外,在决定要加载哪些帧时,最好考虑哪些图像已经缓存 我提出了一个贪婪算法,它会做得很好,但我想知道这是否是一个已经研究过的问题,还有更好的/最优的算法 我假设时间是根据帧速率来度量的,

我正在开发一个同时显示多个视频的应用程序。视频以充满图像文件的目录形式存储。对于每个帧编号,最多有9个映像必须从磁盘加载。我想为图像实现缓存和预读。这将非常简单,但复杂的是文件系统(有时是网络FS)的速度远远不够快,无法显示每个图像。因此readahead应该选择要加载的帧,并且只对这些图像发出read()请求。此外,在决定要加载哪些帧时,最好考虑哪些图像已经缓存

我提出了一个贪婪算法,它会做得很好,但我想知道这是否是一个已经研究过的问题,还有更好的/最优的算法

我假设时间是根据帧速率来度量的,而不是秒,以便更容易进行伪编码

load_time_per_image = how long it takes to load an image
images_per_frame = the number of images to display simultaneously
worst_time = images_per_frame * load_time_per_image

def decide_next_frame_to_load:
    for each frame from now to now + worst_time:
        loadable = (frame - now) / load_time_per_image
        if number_of_images_cached(frame) > images_per_frame - loadable:
            # this frame is the first one it's possible to load in time.
            return frame
有人有什么建议吗? 谢谢你的帮助!
-托马斯这是用于实时操作的吗

我见过的一些性能最差的视频编辑器会通过将每一帧存储到自己的图像文件中来“索引”每一帧。您是否坚持使用此存储机制?如果源视频已经以视频格式存储(每个文件一个),并且每个视频都有一个索引(基本上是每个帧的文件偏移量),那么效率会显著提高。然后,您可以使用操作系统的缓存机制来帮助提高性能

另一件你可能想考虑的事情,虽然它可能对网络文件系统没有多大帮助,但它是以YUV格式存储图像的。显示视频的应用程序可能运行得更快(部分原因是不需要RGB到YUV的转换,通常是因为您可以将YUV图像绘制到视频卡的工作卸载),从而为文件系统工作留出更多时间。我在X显示器上绘图时这样做只是为了避免抖动


至于缓存图像,我可能会使用一个单独的线程,在主线程组装并显示图像时,尽可能快地从磁盘读取图像。主线程可以每帧显示间隔执行一次循环,当缓冲/准备的图像数量达到某个阈值时,单独的线程可以进行阻塞。像mplayer这样的视频播放器使用这样的策略。

这是用于实时操作的吗

我见过的一些性能最差的视频编辑器会通过将每一帧存储到自己的图像文件中来“索引”每一帧。您是否坚持使用此存储机制?如果源视频已经以视频格式存储(每个文件一个),并且每个视频都有一个索引(基本上是每个帧的文件偏移量),那么效率会显著提高。然后,您可以使用操作系统的缓存机制来帮助提高性能

另一件你可能想考虑的事情,虽然它可能对网络文件系统没有多大帮助,但它是以YUV格式存储图像的。显示视频的应用程序可能运行得更快(部分原因是不需要RGB到YUV的转换,通常是因为您可以将YUV图像绘制到视频卡的工作卸载),从而为文件系统工作留出更多时间。我在X显示器上绘图时这样做只是为了避免抖动


至于缓存图像,我可能会使用一个单独的线程,在主线程组装并显示图像时,尽可能快地从磁盘读取图像。主线程可以每帧显示间隔执行一次循环,当缓冲/准备的图像数量达到某个阈值时,单独的线程可以进行阻塞。像mplayer这样的视频播放器使用这样的策略。

毕竟这是一个小世界……毕竟这是一个小世界……是的,我一直在使用这种存储机制,因为这是我们在Matlab中分析视频帧的方式。我认为专用的readahead线程是一个很好的线程。如果显示线程没有看到正确的帧,它将什么也不做。readahead可以制定加载哪一帧的策略。这对于存储机制来说太糟糕了。从图像文件中进行实时视频是一个相当困难的问题。是的,我一直坚持使用这种存储机制,因为这是我们在Matlab中分析视频帧的方式。我认为专用的readahead线程是一个很好的线程。如果显示线程没有看到正确的帧,它将什么也不做。readahead可以制定加载哪一帧的策略。这对于存储机制来说太糟糕了。从图像文件执行实时视频是一个相当困难的问题。