关于实现视频剪辑软件流畅拖动预览方式的猜测
作者:互联网
分情况讨论:
一、快速粗略拖动:
1、以10ms为一个时间单位,若在时间轴拖动时超过一定阈值(例如超过1个GOP),则仅显示GOP的关键帧(I帧),并且先试从映射表中找数据,如果找不到再进行解码。因为即使渲染出B、P帧,人眼也无法来得及看清,不如直接显示I帧来得实际。并把已经渲染过的I帧放到<pts,帧>的映射表中。
1.1、若GOP长度超过一定时间阈值,则依然需要在阈值时间点中渲染对应位置的图像,以防快速拖动长距离时,本应出现图像变化时却并不出现图像变化。
1.2、为防止1.1和1过程中显示线程要等待解码过程导致卡顿问题,当前拖动位置附近的GOP将由(CPU核心数 - 1)数量的子线程进行解码,并放到<pts,帧>映射表中。
二、慢速精确拖动:
1、此时用户很可能会在一个GOP中逐帧拖动,若B、P帧也要带着GOP里面多个帧一起解码,一定会导致多次无用功的出现。为了避免耗时的无用功,应在指向到某个pts时,就把当前操作的GOP和临近的GOP中每一个帧的实际合成画面渲染,并放到映射表中,在当前GOP中拖动时,即可只解码一次,就能从映射表中知道附近每个PTS对应的画面应是什么样子。
三、节约内存的技术方案:
映射表可能随着用户拖动时间轴的方位增加而增大,最终可能会导致物理内存不足。此时,可以使用MMAP等方式,把外存中的一部分映射为内存地址,使用LRU原则,映射表的树结构保留在内存中,但里面的内容按照使用次数,低于阈值的放到MMAP映射中,并替换映射表中的内存指针为MMAP指针,高于阈值的放到内存中,删除MMAP的值,实现内存和外存的使用动态平衡,在通过牺牲空间换取时间的方法,以保证拖动效率的同时,不至于有可能因内存不足导致程序无法继续执行。
标签:映射,预览,拖动,解码,表中,阈值,视频剪辑,GOP 来源: https://blog.csdn.net/cjzjolly/article/details/122761540