CN111800669A - 安卓系统下文本字幕的渲染方法和装置 - Google Patents

安卓系统下文本字幕的渲染方法和装置 Download PDF

Info

Publication number
CN111800669A
CN111800669A CN202010794134.0A CN202010794134A CN111800669A CN 111800669 A CN111800669 A CN 111800669A CN 202010794134 A CN202010794134 A CN 202010794134A CN 111800669 A CN111800669 A CN 111800669A
Authority
CN
China
Prior art keywords
text content
layer
skia
native
subtitle
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202010794134.0A
Other languages
English (en)
Other versions
CN111800669B (zh
Inventor
尹鹏飞
章一帆
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Seerof Information Technology Shanghai Co ltd
Original Assignee
Seerof Information Technology Shanghai Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Seerof Information Technology Shanghai Co ltd filed Critical Seerof Information Technology Shanghai Co ltd
Priority to CN202010794134.0A priority Critical patent/CN111800669B/zh
Publication of CN111800669A publication Critical patent/CN111800669A/zh
Application granted granted Critical
Publication of CN111800669B publication Critical patent/CN111800669B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/47End-user applications
    • H04N21/488Data services, e.g. news ticker
    • H04N21/4884Data services, e.g. news ticker for displaying subtitles
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/43Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
    • H04N21/431Generation of visual interfaces for content selection or interaction; Content or additional data rendering
    • H04N21/4312Generation of visual interfaces for content selection or interaction; Content or additional data rendering involving specific graphical features, e.g. screen layout, special fonts or colors, blinking icons, highlights or animations
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/43Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
    • H04N21/435Processing of additional data, e.g. decrypting of additional data, reconstructing software from modules extracted from the transport stream
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/43Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
    • H04N21/443OS processes, e.g. booting an STB, implementing a Java virtual machine in an STB or power management in an STB

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Signal Processing (AREA)
  • Software Systems (AREA)
  • Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)

Abstract

本申请公开了一种安卓系统下文本字幕的渲染方法和装置。其中,该方法包括:Native层通过JNI接收Java层创建的用于字幕显示的Surface;Native层从字幕数据中获取待渲染的文本内容;Native层利用Skia引擎对待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到Surface上。本申请解决了相关技术中由于Java层与Native层之间的通信损耗导致安卓系统下文本字幕渲染效率低的技术问题。

Description

安卓系统下文本字幕的渲染方法和装置
技术领域
本申请涉及可信计算领域,具体而言,涉及一种安卓系统下文本字幕的渲染方法和装置。
背景技术
现有技术中安卓系统下文本字幕显示方式一般流程如图1所示,具体包括以下步骤:步骤S1,Native层下载外置字幕文件数据、或者从下载的视频文件中分离出内置字幕数据;步骤S2,Native层解析字幕数据,得到带时间戳和格式的文本内容;步骤S3,当达到显示的时间,Native层把带格式的文本内容发送给应用层(Java层);步骤S4,在应用层(Java层)利用TextView类提供的接口进行文本字幕的渲染。
现有技术的步骤S3从Native层发送文本内容到应用层(Java层),需要通过JNI层;且安卓系统中Java层TextView类所提供的接口,其内部是通过JNI层调用到Native的Skia引擎提供的接口进行渲染。因此现有技术的步骤S4在应用层(Java层)利用TextView类进行文本字幕渲染,也需要通过JNI层,其本质是用Native的Skia。
现有技术存在以下两点缺陷:
1、安卓系统中使用JNI层进行Java层与Native层的通信,这个过程是有时间损耗的,现有技术步骤S3和步骤S4一共经过了两次JNI,消耗时间较大,进而导致文本字幕渲染效率较低;
2、应用层(Java层)对文本的渲染本质是在用Native层的Skia引擎,步骤S3和步骤S4从Native层到Java层,又回到Native层,架构上来看也是不简洁的。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本申请实施例提供了一种安卓系统下文本字幕的渲染方法和装置,以至少解决相关技术中由于Java层与Native层之间的通信损耗导致安卓系统下文本字幕渲染效率低的技术问题。
根据本申请实施例的一个方面,提供了一种安卓系统下文本字幕的渲染方法,包括:
Native层通过JNI接收Java层创建的用于字幕显示的Surface;
所述Native层从字幕数据中获取待渲染的文本内容;
所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
根据本申请实施例的另一方面,还提供了一种安卓系统下文本字幕的渲染装置,包括:
接收单元,用于Native层通过JNI接收Java层创建的用于字幕显示的Surface;
获取单元,用于所述Native层从字幕数据中获取待渲染的文本内容;
渲染单元,用于所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
根据本申请实施例的另一方面,还提供了一种存储介质,该存储介质包括存储的程序,程序运行时执行上述的方法。
根据本申请实施例的另一方面,还提供了一种电子装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器通过计算机程序执行上述的方法。
在本申请实施例中,在Native层解析完字幕数据得到待渲染的文本内容之后,不再发送给应用层(Java层)渲染,而在Native层直接利用安卓系统的2D图像处理引擎Skia进行渲染,并把内容显示到Java层创建的Surface上,可以解决相关技术中由于Java层与Native层之间的通信损耗导致安卓系统下文本字幕渲染效率低的技术问题,进而达到减少Java层与Native层的通信损耗,优化字幕显示的设计架构,提高文本字幕渲染效率的技术效果。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据现有技术的安卓系统下文本字幕显示方法的流程图;
图2是根据本申请实施例的安卓系统下文本字幕的渲染方法的硬件环境的示意图;
图3是根据本申请实施例的一种可选的安卓系统下文本字幕的渲染方法的流程图;
图4是根据本申请优选实施例的安卓系统下文本字幕的渲染方法的流程图;
图5是根据本申请优选实施例的本地窗口中各个显示区域位置关系的示意图;
图6是根据本申请实施例的一种可选的安卓系统下文本字幕的渲染装置的示意图;以及,
图7是根据本申请实施例的一种终端的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为了方便理解,下面对本申请中出现的名词进行解释:
Skia:即安卓系统底层2D图形处理引擎,是一种C++的开源函数库,包括字型处理和位图处理等功能,通常应用于安卓系统或者Chrome浏览器,利用Skia可以对2D的文本、图像进行渲染。
Native层:安卓系统中,Native层(采用C/C++语言编写)与Java层(采用Java语言编写)进行通信,用于处理较为复杂的运算以及访问操作系统底层(比如系统硬件)。通常情况下,上述Skia即位于Native层。
JNI(Java Native Interface,Java本地接口):即位于Java层和Native层之间的接口,通过提供若干API(Application Programming Interface,应用程序编程接口)实现Java层与Native层之间的通信。比如,当Java程序需要执行一个复杂运算时,由于Java代码的实现效率较低,而C/C++代码的实现效率较高,因此可以由Native层完成复杂运算,并通过JNI将运算结果返回给Java层。
根据本申请实施例的一方面,提供了一种安卓系统下文本字幕的渲染方法的方法实施例。
可选地,在本实施例中,上述安卓系统下文本字幕的渲染方法可以应用于如图2所示的由终端集合101和服务器103所构成的硬件环境中。如图2所示,服务器103通过网络与终端集合101进行连接,可用于管理各个终端,上述网络包括但不限于:广域网、城域网或局域网,终端集合101并不限定于PC、手机、平板电脑等终端的集合。
本申请实施例的安卓系统下文本字幕的渲染方法可以由终端来执行,可以由服务器来执行,还可以是由服务器和终端共同执行。其中,终端执行本申请实施例的安卓系统下文本字幕的渲染方法也可以是由安装在其上的客户端来执行。
图3是根据本申请实施例的一种可选的安卓系统下文本字幕的渲染方法的流程图,如图3所示,该方法可以包括以下步骤:
步骤S202,Native层通过JNI接收Java层创建的用于字幕显示的Surface(表层);
步骤S204,Native层从字幕数据中获取待渲染的文本内容;
步骤S206,Native层利用Skia引擎对待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到Surface上。
通过上述步骤,在Native层解析完字幕数据得到待渲染的文本内容之后,不再发送给应用层(Java层)渲染,而在Native层直接利用安卓系统的2D图像处理引擎Skia进行渲染,并把内容显示到Java层创建的Surface上,可以解决相关技术中由于Java层与Native层之间的通信损耗导致安卓系统下文本字幕渲染效率低的技术问题,进而达到减少Java层与Native层的通信损耗,优化字幕显示的设计架构,提高文本字幕渲染效率的技术效果。
可选地,上述步骤S202Native层通过JNI接收Java层创建的用于字幕显示的Surface可以包括以下过程:
所述Java层创建Surface View(表层视图);
所述Java层从所述Surface View获取对应的Surface;
所述Java层通过所述JNI将所述Surface传递给所述Native层;
所述Native层用所述JNI的接口从所述Surface获取Native Window(本地窗口);
所述Native层将所述Native Window传递给字幕控制模块和字幕渲染模块,其中,所述字幕控制模块用于从字幕数据中获取所述待渲染的文本内容,所述字幕渲染模块用于利用所述Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
其中,所述Java层从所述Surface View获取对应的Surface可以包括以下过程:
所述Java层获取所述Surface View的Holder(控制对象);
所述Java层通过所述Holder的接口设置所述Surface View为透明;
所述Java层通过所述Holder的接口获取所述Surface。
可选地,步骤S204所述Native层从字幕数据中获取待渲染的文本内容可以包括以下过程:
所述Native层下载外置字幕数据或者从视频文件中分离出内置字幕数据;
所述Native层解析所述字幕数据,得到带有时间戳和格式的所述待渲染的文本内容;
在所述Native层从字幕数据中获取待渲染的文本内容之后,所述Native层检测当前播放时间是否有字幕需要显示;若当前播放时间有字幕需要显示,则执行步骤S206中的所述Native层利用所述Skia引擎对所述待渲染的文本内容进行渲染;若当前播放时间没有字幕需要显示,则执行步骤S206中的所述Native层利用所述Skia引擎清除已显示的文本内容。
可选地,步骤S206中所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,并刷新到所述Surface上可以包括以下过程:
所述Native层使用所述Native Window的buffer(缓存)地址,创建与所述NativeWindow宽高相同的Skia Surface(Skia表层);
通过所述Skia Surface的接口获取对应的Skia Canvas(Skia画布)对象;
利用所述Skia Canvas的接口渲染所述待渲染的文本内容;
提交所述Native Window的buffer。
其中,利用所述Skia Canvas的接口渲染所述待渲染的文本内容可以包括以下过程:
渲染字幕显示区域背景;
当所述待渲染的文本内容中的剩余待显示的文本内容不为空时,循环执行以下步骤:
设置所述剩余待显示的文本内容的字体格式;
根据内容区域、所述剩余待显示的文本内容以及所述剩余待显示的文本内容的字体格式计算内容区域的宽度内够显示的字节数,并取出所述字节数的字符得到chunk(组块)字符串,其中,所述内容区域为所述字幕显示区域去掉四周内边距的区域;
渲染所述chunk字符串以及所述chunk字符串的背景区域;
若内容区域的宽度内不够显示所有剩余待显示的文本内容,则进行换行处理;
从所述待渲染的文本内容中截掉所述chunk字符串,更新所述剩余待显示的文本内容。
可选地,步骤S206中所述Native层利用Skia引擎清除已显示的文本内容,并刷新到所述Surface上可以包括以下过程:
所述Native层使用所述Native Window的buffer地址,创建与所述Native Window宽高相同的Skia Surface;
通过所述Skia Surface的接口获取对应的Skia Canvas对象;
利用所述Skia Canvas的接口清除所述显示的文本内容;
提交所述Native Window的buffer。
为了清楚详细地说明本申请的安卓系统下文本字幕的渲染方法,下面提供了一种优选实施例,具体地:
如图4所示,该优选实施例的总体流程包括以下步骤:
步骤S1,在使能字幕功能时,应用层(Java层)创建用于字幕显示的Surface,并通过JNI传给Native层;
步骤S2,Native层的字幕控制模块下载外置字幕文件数据、或者从下载的视频文件中分离出内置字幕数据;
步骤S3,Native层的字幕控制模块解析字幕数据,得到带时间戳和格式的文本内容;
步骤S4,Native层的字幕控制模块起线程循环检查当前播放时间是否有字幕需要显示;
步骤S5,Native层的字幕渲染模块利用Skia引擎渲染带格式的文本内容,或者清除已显示的内容,并刷新到Surface上。
其中上述每个步骤具体内容分别介绍如下:
步骤S1:Java层创建用于字幕显示的Surface,并通过JNI传给Native层,包括以下过程:
1,Java层创建SurfaceView;
2,Java层从SurfaceView获取对应的Surface;
3,Java层通过JNI将Surface传给Native层,Native层用JNI的接口从Surface获取NativeWindow;
4,Native层将NativeWindow传给字幕控制模块,进而传给字幕渲染模块。
步骤S2:Native层获取字幕数据,包括以下过程:
1,对于外置字幕,字幕控制模块使用CURL库下载字幕文件数据;
2,对于内置字幕,由视频解复用模块分离出字幕数据,传给字幕控制模块。
步骤S3:Native层解析字幕数据,得到带时间戳和格式的文本内容,包括以下过程:
1,字幕控制模块根据字幕类型创建对应的parser(解析器)(本实施例创建TTMLparser);
2,parser将S2获取的数据解析为一条一条带时间戳和格式的文本。
步骤S4:Native层循环检查当前播放时间是否有字幕需要显示,包括以下过程:
1,字幕控制模块起子线程,循环检查当前播放时间是否有匹配的字幕需要显示,需要显示则调用渲染模块进行显示;
2,当检查到当前显示的字幕时长已经达到,则调用渲染模块清除显示。
步骤S5-1:Native层利用Skia引擎渲染带格式的文本内容,并显示到Surface上,包括以下过程:
1,字幕渲染模块获取NativeWindow的buffer用于本次显示;
2,使用NativeWindow的buffer地址,创建与NativeWindow宽高相同的SkiaSurface;
3,从Skia Surface得到Skia Canvas对象;
4,利用Skia Canvas的接口,渲染指定格式的文本;
5,提交NativeWindow的buffer(系统会刷新Surface显示)。
步骤S5-2:Native层利用Skia引擎清除已显示的内容,并刷新到Surface上,包括以下过程:
1,字幕渲染模块获取NativeWindow的buffer用于本次显示;
2,使用NativeWindow的buffer地址,创建与NativeWindow宽高相同的SkiaSurface;
3,从Skia Surface得到Skia Canvas对象;
4,利用Skia Canvas的接口,清除已显示的内容;
5,提交NativeWindow的buffer(系统会刷新Surface显示)。
下面针对上述优选实施例中的重点步骤进行具体解释:
步骤S1:Java层创建用于字幕显示的Surface,并通过JNI传给Native层,包括以下过程:
1,Java层创建覆盖全屏的SurfaceView,使其浮于Video(视频)的上方;
2,Java层获取SurfaceView的控制对象Holder;
3,Java层通过Holder的接口设置字幕的SurfaceView为透明,以免遮挡Video;
4,Java层通过Holder的接口获取Surface;
5,Java层通过JNI将Surface传给Native层,Native层用JNI的接口从Surface获取NativeWindow;
6,Native层将NativeWindow传给字幕控制模块,进而传给字幕渲染模块。
步骤S5-1:Native层利用Skia引擎渲染带格式的文本内容,并显示到Surface上,包括以下过程:
1,字幕渲染模块获取NativeWindow的reference(参考);
2,锁住NativeWindow的buffer用于本次显示,而不会被其他进程/线程修改;
3,使用NativeWindow的buffer地址,创建与NativeWindow宽高相同的SkiaSurface;
4,从Skia Surface得到Skia Canvas对象;
5,利用Skia Canvas的接口,渲染指定格式的文本:包括以下过程:
5.1,渲染字幕显示区域(region)背景,包括以下过程:
5.1.1,新建用于渲染背景区域的Skia Paint(Skia绘画颜料),设置颜色为S3解析出的region背景色;
5.1.2设置Skia Paint为填充模式;
5.1.3新建Skia Rect(Skia区域),设置起点坐标以及宽高为S3解析出的region参数;
5.1.4使用Skia Canvas接口drawRect(绘画区域)渲染region;
5.2,设置当前文本字体格式,包括以下过程:
5.2.1,新建Skia FontStyle(Skia字体样式),设定为S3解析出的普通/斜体/加粗;
5.2.2,新建Skia Typeface(Skia字体),设定为S3解析出的字体名称,并传入上一步5.2.1的Skia FontStyle参数;
5.2.3,新建Skia Font(Skia字体设计),设置Typeface为上一步5.2.2的结果;
5.2.4,设置Skia Font的字号大小为S3解析出的值;
5.2.5,新建用于渲染文本的Skia Paint,设置颜色为S3解析出的文字颜色;
5.2.6,设置Skia Paint为填充模式;
5.3,计算内容区域宽度(一行)够显示的字节数,包括以下过程:
5.3.1,计算内容显示区域(content Rect)的起点坐标和宽高:5.1中的显示区域(region)去掉S3解析出的四周内边距(padding);
5.3.2,使用5.2中得到的Skia Font measureText(Skia字体策略文本)接口,得到剩余待显示的文本需要的显示宽度w;
5.3.3,若w<=内容区域宽度,则一行足够显示剩余的文本;若w>内容区域宽度,则将待显示文本末尾截掉一个字节,重复5.3.2-5.3.3;
5.3.4,最终得到一行够显示的字节数,取出该字节数的字符得到chunk字符串;
5.3.5,如果一行不够显示所有剩余文本,则记录下需要换行;
5.4渲染chunk字符串以及背景区域,包括以下过程:
5.4.1,使用5.2中得到的Skia Font measureText接口,得到显示chunk需要的宽W、高H;
5.4.2,渲染实际文本背景显示区域(paragraph)背景,包括以下过程:
5.4.2.1,将5.1中创建的用于渲染背景区域的Skia Paint颜色设置为S3解析出的paragraph背景色;
5.4.2.2,新建paragraph的Skia Rect,设置起点x坐标以及宽度为5.3.1得到的内容区域的参数,起点y坐标为当前行所在的y坐标,高度为5.4.1得到的显示chunk需要的高度H;
5.4.2.3,使用Skia Canvas接口drawRect渲染paragraph;
5.4.3渲染chunk文本的背景,包括以下过程:
5.4.3.1,将5.1中创建的用于渲染背景区域的Skia Paint颜色设置为S3解析出的文本背景色;
5.4.3.2,新建chunk的Skia Rect,根据S3解析出的文本对齐(左/中/右对齐)、5.4.1得到的显示chunk需要的宽度W、以及当前行的起点x坐标、宽度,计算出chunkRect(字符串显示区域)的起点x坐标,y坐标为当前行所在的y坐标,宽高为5.4.1得到的W、H;
5.4.3.3,使用Skia Canvas接口drawRect渲染文本背景;
5.4.4,渲染chunk文本,包括以下过程:
5.4.4.1,创建Skia TextBlob(Skia二进制文本),传入参数为chunk字符串、5.2中得到的Skia Font、编码为UTF-8;
5.4.4.2,使用Skia Canvas接口drawTextBlob(绘画二进制文本)渲染chunk文本,传入参数为Skia TextBlob、5.4.3.2得到的chunk Skia Rect的起点x、y坐标、5.2中得到的Skia Paint;
5.5,处理换行,包括以下过程:
5.5.1,如果5.3.5中记录了需要换行,则将当前行所在的y坐标累加上5.4.1得到的行高H;
5.6,更新剩余待显示文本,包括以下过程:
5.6.1,将剩余待显示的文本字符串截掉本次已显示的字符串chunk;
5.7,在剩余待显示的文本字符串为空之前,重复5.2~5.6;
6,解锁并提交NativeWindow的buffer(系统会刷新Surface显示);
7,释放NativeWindow的reference。
步骤S5-2:Native层利用Skia引擎清除已显示的内容,并刷新到Surface上,包括以下过程:
1,字幕渲染模块获取NativeWindow的reference;
2,锁住NativeWindow的buffer用于本次显示,而不会被其他进程/线程修改;
3,使用NativeWindow的buffer地址,创建与NativeWindow宽高相同的SkiaSurface;
4,从Skia Surface得到Skia Canvas对象;
5,利用Skia Canvas的接口,清除已显示的内容,包括以下过程:
5.1,使用Skia Canvas的clear接口,传入透明色参数,把NativeWindow的buffer全部清空为透明色;
6,解锁并提交NativeWindow的buffer(系统会刷新Surface显示);
7,释放NativeWindow的reference。
需要说明的是,如果5所示,本地窗口中(NativeWindow)中字幕显示区域(regionRect)、内容显示区域(content Rect)、文本背景显示区域(paragraph Rect)、字符串显示区域(chunk Rect)的位置关系如图5所示。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
本申请在安卓的Native层利用Skia引擎渲染带格式的文本字幕,相比现有把字幕发送给Java层显示的方案,有以下效果:
1,不需要每次显示/清除字幕都通过JNI,节约了JNI通信的时间损耗;
2,渲染字幕的过程在Native层运行,C/C++相比Java有更高的运行效率;
3,字幕相关的获取、控制、渲染都在Native层执行,Java层只需要管理用于字幕显示的SurfaceView资源,即在使能字幕功能时创建SurfaceView,并在关闭字幕时回收即可,不需要关心字幕的显示控制,降低了层级、模块间的耦合性,软件架构上更加单纯、清晰。
根据本申请实施例的另一个方面,还提供了一种用于实施上述安卓系统下文本字幕的渲染方法的安卓系统下文本字幕的渲染装置。
图6是根据本申请实施例的一种可选的安卓系统下文本字幕的渲染装置的示意图,如图6所示,该装置可以包括:
接收单元602,用于Native层通过JNI接收Java层创建的用于字幕显示的Surface;
获取单元604,用于所述Native层从字幕数据中获取待渲染的文本内容;
渲染单元606,用于所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
需要说明的是,该实施例中的接收单元602可以用于执行本申请实施例中的步骤S202,该实施例中的获取单元604可以用于执行本申请实施例中的步骤S204,该实施例中的渲染单元606可以用于执行本申请实施例中的步骤S206。
此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图2所示的硬件环境中,可以通过软件实现,也可以通过硬件实现。
通过上述模块,在Native层解析完字幕数据得到待渲染的文本内容之后,不再发送给应用层(Java层)渲染,而在Native层直接利用安卓系统的2D图像处理引擎Skia进行渲染,并把内容显示到Java层创建的Surface上,可以解决相关技术中由于Java层与Native层之间的通信损耗导致安卓系统下文本字幕渲染效率低的技术问题,进而达到减少Java层与Native层的通信损耗,优化字幕显示的设计架构,提高文本字幕渲染效率的技术效果。
可选地,接收单元602可以具体用于:所述Java层创建SurfaceView;所述Java层从所述Surface View获取对应的Surface;所述Java层通过所述JNI将所述Surface传递给所述Native层;所述Native层用所述JNI的接口从所述Surface获取Native Window;所述Native层将所述Native Window传递给字幕控制模块和字幕渲染模块,其中,所述字幕控制模块用于从字幕数据中获取所述待渲染的文本内容,所述字幕渲染模块用于利用所述Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
可选地,所述Java层从所述Surface View获取对应的Surface包括:所述Java层获取所述Surface View的控制对象Holder;所述Java层通过所述Holder的接口设置所述Surface View为透明;所述Java层通过所述Holder的接口获取所述Surface。
可选地,渲染单元606用于所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,并刷新到所述Surface上包括:所述Native层使用所述Native Window的buffer地址,创建与所述Native Window宽高相同的Skia Surface;通过所述Skia Surface的接口获取对应的Skia Canvas对象;利用所述Skia Canvas的接口渲染所述待渲染的文本内容;提交所述Native Window的buffer。
可选地,利用所述Skia Canvas的接口渲染所述待渲染的文本内容包括:渲染字幕显示区域背景;当所述待渲染的文本内容中的剩余待显示的文本内容不为空时,循环执行以下步骤:设置所述剩余待显示的文本内容的字体格式;根据内容区域、所述剩余待显示的文本内容以及所述剩余待显示的文本内容的字体格式计算内容区域的宽度内够显示的字节数,并取出所述字节数的字符得到chunk字符串,其中,所述内容区域为所述字幕显示区域去掉四周内边距的区域;渲染所述chunk字符串以及所述chunk字符串的背景区域;若内容区域的宽度内不够显示所有剩余待显示的文本内容,则进行换行处理;从所述待渲染的文本内容中截掉所述chunk字符串,更新所述剩余待显示的文本内容。
可选地,渲染单元606用于所述Native层利用Skia引擎清除已显示的文本内容,并刷新到所述Surface上包括:所述Native层使用所述Native Window的buffer地址,创建与所述Native Window宽高相同的Skia Surface;通过所述Skia Surface的接口获取对应的Skia Canvas对象;利用所述Skia Canvas的接口清除所述显示的文本内容;提交所述Native Window的buffer。
可选地,获取单元604用于所述Native层下载外置字幕数据或者从视频文件中分离出内置字幕数据;所述Native层解析所述字幕数据,得到带有时间戳和格式的所述待渲染的文本内容;所述装置还包括:检测单元,用于在所述Native层从字幕数据中获取待渲染的文本内容之后,所述Native层检测当前播放时间是否有字幕需要显示;若当前播放时间有字幕需要显示,则所述Native层利用所述Skia引擎对所述待渲染的文本内容进行渲染;若当前播放时间没有字幕需要显示,则所述Native层利用所述Skia引擎清除已显示的文本内容。
此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图2所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬件环境包括网络环境。
根据本申请实施例的另一个方面,还提供了一种用于实施上述安卓系统下文本字幕的渲染方法的服务器或终端。
图7是根据本申请实施例的一种终端的结构框图,如图7所示,该终端可以包括:一个或多个(图7中仅示出一个)处理器1101、存储器1103、以及传输装置1105,如图7所示,该终端还可以包括输入输出设备1107。
其中,存储器1103可用于存储软件程序以及模块,如本申请实施例中的安卓系统下文本字幕的渲染方法和装置对应的程序指令/模块,处理器1101通过运行存储在存储器1103内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的安卓系统下文本字幕的渲染方法。存储器1103可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器1103可进一步包括相对于处理器1101远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
上述的传输装置1105用于经由一个网络接收或者发送数据,还可以用于处理器与存储器之间的数据传输。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置1105包括一个网络适配器(Network Interface Controller,NIC),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置1105为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
其中,具体地,存储器1103用于存储应用程序。
处理器1101可以通过传输装置1105调用存储器1103存储的应用程序,以执行下述步骤:
Native层通过JNI接收Java层创建的用于字幕显示的Surface;
所述Native层从字幕数据中获取待渲染的文本内容;
所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。
本领域普通技术人员可以理解,图7所示的结构仅为示意,终端可以是智能手机(如Android手机、Android TV电视、Android STB机顶盒设备等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图7其并不对上述电子装置的结构造成限定。例如,终端还可包括比图7中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图7所示不同的配置。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(RandomAccess Memory,RAM)、磁盘或光盘等。
本申请的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于执行安卓系统下文本字幕的渲染方法的程序代码。
可选地,在本实施例中,上述存储介质可以位于上述实施例所示的网络中的多个网络设备中的至少一个网络设备上。
可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:
Native层通过JNI接收Java层创建的用于字幕显示的Surface;
所述Native层从字幕数据中获取待渲染的文本内容;
所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。
在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

Claims (10)

1.一种安卓系统下文本字幕的渲染方法,其特征在于,包括:
Native层通过JNI接收Java层创建的用于字幕显示的Surface;
所述Native层从字幕数据中获取待渲染的文本内容;
所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
2.根据权利要求1所述的方法,其特征在于,Native层通过JNI接收Java层创建的用于字幕显示的Surface包括:
所述Java层创建Surface View;
所述Java层从所述Surface View获取对应的Surface;
所述Java层通过所述JNI将所述Surface传递给所述Native层;
所述Native层用所述JNI的接口从所述Surface获取Native Window;
所述Native层将所述Native Window传递给字幕控制模块和字幕渲染模块,其中,所述字幕控制模块用于从字幕数据中获取所述待渲染的文本内容,所述字幕渲染模块用于利用所述Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
3.根据权利要求2所述的方法,其特征在于,所述Java层从所述Surface View获取对应的Surface包括:
所述Java层获取所述Surface View的控制对象Holder;
所述Java层通过所述Holder的接口设置所述Surface View为透明;
所述Java层通过所述Holder的接口获取所述Surface。
4.根据权利要求2所述的方法,其特征在于,所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,并刷新到所述Surface上包括:
所述Native层使用所述Native Window的buffer地址,创建与所述Native Window宽高相同的Skia Surface;
通过所述Skia Surface的接口获取对应的Skia Canvas对象;
利用所述Skia Canvas的接口渲染所述待渲染的文本内容;
提交所述Native Window的buffer。
5.根据权利要求4所述的方法,其特征在于,利用所述Skia Canvas的接口渲染所述待渲染的文本内容包括:
渲染字幕显示区域背景;
当所述待渲染的文本内容中的剩余待显示的文本内容不为空时,循环执行以下步骤:
设置所述剩余待显示的文本内容的字体格式;
根据内容区域、所述剩余待显示的文本内容以及所述剩余待显示的文本内容的字体格式计算内容区域的宽度内够显示的字节数,并取出所述字节数的字符得到chunk字符串,其中,所述内容区域为所述字幕显示区域去掉四周内边距的区域;
渲染所述chunk字符串以及所述chunk字符串的背景区域;
若内容区域的宽度内不够显示所有剩余待显示的文本内容,则进行换行处理;
从所述待渲染的文本内容中截掉所述chunk字符串,更新所述剩余待显示的文本内容。
6.根据权利要求2所述的方法,其特征在于,所述Native层利用Skia引擎清除已显示的文本内容,并刷新到所述Surface上包括:
所述Native层使用所述Native Window的buffer地址,创建与所述Native Window宽高相同的Skia Surface;
通过所述Skia Surface的接口获取对应的Skia Canvas对象;
利用所述Skia Canvas的接口清除所述显示的文本内容;
提交所述Native Window的buffer。
7.根据权利要求1至6中任一项所述的方法,其特征在于,
所述Native层从字幕数据中获取待渲染的文本内容包括:所述Native层下载外置字幕数据或者从视频文件中分离出内置字幕数据;所述Native层解析所述字幕数据,得到带有时间戳和格式的所述待渲染的文本内容;
在所述Native层从字幕数据中获取待渲染的文本内容之后,所述方法还包括:所述Native层检测当前播放时间是否有字幕需要显示;若当前播放时间有字幕需要显示,则所述Native层利用所述Skia引擎对所述待渲染的文本内容进行渲染;若当前播放时间没有字幕需要显示,则所述Native层利用所述Skia引擎清除已显示的文本内容。
8.一种安卓系统下文本字幕的渲染装置,其特征在于,包括:
接收单元,用于Native层通过JNI接收Java层创建的用于字幕显示的Surface;
获取单元,用于所述Native层从字幕数据中获取待渲染的文本内容;
渲染单元,用于所述Native层利用Skia引擎对所述待渲染的文本内容进行渲染,或者清除已显示的文本内容,并刷新到所述Surface上。
9.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,所述程序运行时执行上述权利要求1至7任一项中所述的方法。
10.一种电子装置,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器通过所述计算机程序执行上述权利要求1至7任一项中所述的方法。
CN202010794134.0A 2020-08-10 2020-08-10 安卓系统下文本字幕的渲染方法和装置 Active CN111800669B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010794134.0A CN111800669B (zh) 2020-08-10 2020-08-10 安卓系统下文本字幕的渲染方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010794134.0A CN111800669B (zh) 2020-08-10 2020-08-10 安卓系统下文本字幕的渲染方法和装置

Publications (2)

Publication Number Publication Date
CN111800669A true CN111800669A (zh) 2020-10-20
CN111800669B CN111800669B (zh) 2021-04-06

Family

ID=72833718

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010794134.0A Active CN111800669B (zh) 2020-08-10 2020-08-10 安卓系统下文本字幕的渲染方法和装置

Country Status (1)

Country Link
CN (1) CN111800669B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040068735A1 (en) * 1999-04-30 2004-04-08 York Justin E. Java and native application window integration
EP2475184A1 (en) * 2011-01-11 2012-07-11 Lg Electronics Inc. Multimedia device having operating system capable of procesing multiple graphic data and method for controlling the same
CN102752664A (zh) * 2012-06-29 2012-10-24 奇智软件(北京)有限公司 一种网页中文本字幕信息的显示方法和装置
CN103336816A (zh) * 2013-06-28 2013-10-02 广州市动景计算机科技有限公司 安卓系统上基于GPU实现的Canvas元素渲染方法及装置
CN106254928A (zh) * 2016-08-19 2016-12-21 青岛海信电器股份有限公司 一种图片字幕显示方法和装置
CN108632657A (zh) * 2018-07-06 2018-10-09 深圳创维-Rgb电子有限公司 一种字幕显示方法、存储介质及智能电视

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040068735A1 (en) * 1999-04-30 2004-04-08 York Justin E. Java and native application window integration
EP2475184A1 (en) * 2011-01-11 2012-07-11 Lg Electronics Inc. Multimedia device having operating system capable of procesing multiple graphic data and method for controlling the same
CN102752664A (zh) * 2012-06-29 2012-10-24 奇智软件(北京)有限公司 一种网页中文本字幕信息的显示方法和装置
CN103336816A (zh) * 2013-06-28 2013-10-02 广州市动景计算机科技有限公司 安卓系统上基于GPU实现的Canvas元素渲染方法及装置
CN106254928A (zh) * 2016-08-19 2016-12-21 青岛海信电器股份有限公司 一种图片字幕显示方法和装置
CN108632657A (zh) * 2018-07-06 2018-10-09 深圳创维-Rgb电子有限公司 一种字幕显示方法、存储介质及智能电视

Non-Patent Citations (6)

* Cited by examiner, † Cited by third party
Title
LESLIE_YU: "《浅析Android字体加载原理》", 《微博文章》 *
TGWW88: "《Android中的Surface和SurfaceView之我见》", 《微博文章》 *
VOIPMAKER: "《android ---Using java surface on the native side》", 《微博文章》 *
XIESHSH_8756: "《java层的surface创建过程》", 《微博文章》 *
YILI_XIE: "《Android Graphic : apk and Skia/OpenGL|ES》", 《微博文章》 *
程序艺: "《安卓之Skia》", 《微博文章》 *

Also Published As

Publication number Publication date
CN111800669B (zh) 2021-04-06

Similar Documents

Publication Publication Date Title
CN107766359B (zh) 一种将页面内容转换为图片的方法、装置以及计算设备
CN108021671B (zh) 一种页面透明处理方法及装置
CN109889907A (zh) 一种基于html5的视频osd的显示方法及装置
CN103297327A (zh) 消息推送方法、装置及显示终端
US9117314B2 (en) Information output apparatus, method, and recording medium for displaying information on a video display
CN108052565B (zh) 一种页面的透明处理方法及装置
US11462002B2 (en) Wallpaper management method, apparatus, mobile terminal, and storage medium
CN104156207A (zh) 一种文档显示方法以及装置
CN112416346A (zh) 界面配色方案的生成方法、装置、设备及存储介质
CN108600331A (zh) 交互界面呈现方法、客户端、终端及系统
CN111565337A (zh) 图像处理方法、装置和电子设备
CN107864384B (zh) 重定向云桌面上互联网视频播放的方法及装置
CN115328588A (zh) 一种基于浏览器前端渲染ofd文档的方法及系统
CN110888634B (zh) 游戏落地页生成方法、装置、计算机设备和存储介质
CN115731313A (zh) Svg格式的图片的处理方法、装置、设备、介质及产品
CN111800669B (zh) 安卓系统下文本字幕的渲染方法和装置
CN108874373B (zh) 向网页内插入信息的方法及装置、显示终端及存储介质
CN113313027A (zh) 图像处理方法、装置、电子设备和存储介质
CN111724455A (zh) 图像处理方法及电子设备
CN110544281B (zh) 一种图片批量压缩方法、介质、移动终端和装置
CN114925656B (zh) 富文本显示方法、装置、设备和存储介质
CN117376660A (zh) 字幕元素的渲染方法、装置、设备、介质及程序产品
US11423597B2 (en) Method and system for removing scene text from images
US20100017708A1 (en) Information output apparatus, information output method, and recording medium
CN104392410B (zh) 皮肤系统中的图片整合方法、皮肤绘制方法及设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant