关于实现视频剪辑软件流畅拖动预览方式的猜测

分情况讨论:

一、快速粗略拖动:

        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的值,实现内存和外存的使用动态平衡,在通过牺牲空间换取时间的方法,以保证拖动效率的同时,不至于有可能因内存不足导致程序无法继续执行。

上一篇:FFmpeg 获取H264流中的sps pps


下一篇:我的Go+语言初体验——Go+简单应用—选择排序