据我所知,当我们运行某个程序时,存储在辅助存储器(硬盘)中的一个或多个文件进入主存储器(RAM),然后只运行程序。我的问题是,如果,一个电影文件大约10 GB,我有一个1 GB的RAM,我们可以得出结论,电影文件中的所有数据都没有加载到RAM中,
那么它(电影文件)怎么加载到RAM中?我想了解完整的 内部。
他们遵循哪些算法来管理相同的算法?请帮忙。
答案 0 :(得分:2)
电影播放器通常从电影文件中一次读取一个块。我会使用2个线程来处理视频,使用这样的伪代码:
解码线程:
do
read next chunk (a chunk contains one or more frames)
decode chunk
add decoded frames to frame queue
while #frames in queue > safety margin
sleep((#frames in queue - safety margin)/framerate)
until EOF
End of movie
显示主题:
do
get next frame from frame queue
got frame?
if yes
display frame
if no
End of movie?
return
else
display the previous frame
sleep until it is time to display the next frame
until
编辑(回应OP:评论中的问题):
如何设置安全边际?
安全边际的目的是避免在计算机出现负载峰值时图像冻结(解码使用大量处理能力)。如果电影每秒有25帧,则将安全边界设置为25帧将保留1秒的解码帧缓冲区。我会将它设置为某个值,可能是1/3秒,然后根据用户反馈进行更改。它必须大于解码块所需的时间,否则电影将开始冻结,因此在决定安全边际时块大小是一个因素。
当我们暂停视频并打开另一个视频时,说5 GB如何进行内存交换?
当我们暂停视频时,解码器线程将停止解码(请注意,我已将if
更改为睡眠周围的while
。
当我们开始一个新视频时,解码器线程关闭旧电影文件,清空帧缓冲区,然后开始解码新文件。以编程方式我可能会让旧的解码器线程死掉并为新的电影文件启动一个新的解码器线程。