Skip to content

云笔记:记VSFilterMod的渲染方式代码解析

Last updated on 2021年11月4日

仅用于云笔记记录

Vapoursynth载入vsfm的方法,根据研究源码可得,首先是将整个ass文件读入内存,之后分析文件头,文件头会载入视频流的色彩矩阵和缩放大小,以及使用的文字Style,之后读入所有的文本,记入内存。

之后将会从vs进入【得到一帧->载入这一帧对应的每一行字幕文本->绘制在画面上->写回去->等待下一帧】的循环,从这里可以得到的是,无论怎么样,减少每一帧所具有的字幕行数,可以有效的增加压制的速度,例如在我的测试中,9900k在进行一帧的循环中,渲染800行大概是需要370ms的时间,由于这一个过程是一个单循环过程,所以是单核工作,对单核心的优化和速度十分重要,如果加上其余的滤镜时间,则会达到一行字幕约0.4ms的极慢渲染时间,这对于实时处理每秒24-30帧几乎是不可能实现的。

具体的绘制函数在subtitle项目的RTS.cpp中,名为CRenderedTextSubtitle::Render的函数。


2021/11/3

开始大概解析一下Render函数的具体渲染流程。

Render函数会先读入画面的size,之后会获取到这一帧的开始与结束时间,以及这一段时间内需要绘制的每一行字幕,之后对这些字幕进行排序,就得到了字幕的一个Array。

之后就是对这段Array进行一个循环(TODO:看完之后尝试用多线程替代)

之后遍历每一条字幕,获取其开始时间与持续时间,并且获取到视频的宽与高以及需要绘制的区域的roi与宽与高,之后会进入一个六个分支的特效循环:

[0]: \move 函数的实现


2021/11/4

case 0里面最开始会解析move函数的作用范围,也就是p1、p2代表起点和终点,t1、t2代表move函数的起终时间。注:在mod模式下有一个多参数的弧形运动方法,通过这个弧形运动方法可以实现弧形的运动,在这种情况下,参数会增加到p1、p2、r0、alp1、alp2、t1、t0,这些参数分别定义了其起终点坐标,弧形运动半径,角度以及时间。

[2]: \fad 函数的实现

fad函数有的参数比较少,其实就记载了一个起始和结束时间,其它的没什么

之后会进入一个pos点的绘图循环,这一点没有怎么仔细看。

TODO:尝试把这段写成单独的函数形式,看看能不能重复调用,如果可以的话就可以尝试双线程。

Published in技术探究

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注