我正在开发一个可以同时显示多个视频的应用程序。视频以充满图像文件的目录形式存储。对于每个帧编号,最多必须从磁盘加载9个图像。我想为图像实现缓存和预读。这将非常简单,但复杂的是文件系统(有时是网络FS)远远不足以显示每个图像。因此,预读应该选择它将尝试加载哪些帧,并且只发出对这些图像的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
有人有建议吗? 谢谢你的帮助! -Thomas
答案 0 :(得分:0)
这是用于实时操作吗?
我见过的一些性能最差的视频编辑器会通过将每个帧存储到自己的图像文件中来“索引”每个帧。你是否坚持使用这种存储机制?如果源视频已经以视频格式存储(每个文件一个)并且每个视频有一个索引(基本上每个帧的文件偏移),则效率会大大提高。然后,您可以使用操作系统的缓存机制来帮助提高性能。
您可能想要考虑的另一件事是,虽然它可能对网络文件系统没有多大帮助,但是以YUV格式存储图像。显示视频的应用程序可能运行得更快(部分原因是因为不需要进行RGB到YUV的转换,并且通常是因为您可以将YUV图像绘制到视频卡的工作卸载),从而为文件系统留出更多时间工作。我在绘制X显示器时这样做是为了避免抖动。
就缓存图像而言,我可能会使用一个单独的线程,在主线程组装并呈现图像时尽可能快地从磁盘读取图像。主线程可以每帧呈现间隔执行一次循环,并且当缓冲/准备的图像的量达到特定阈值时,单独的线程可以阻止。像mplayer这样的视频播放器使用这样的策略。