http://wenku.baidu.com/link?url=VzncB4tXsVJ4ueJ0AeAQXvmXW4ua6qc_VOYdaVUytWte3ujm4GP4L9DxnuG48zuh-356vE3M0x3YFLQtRrJKdnfKwKeuXLaJ8HRloRxpRAG###

PS:DVB字幕,类似于互联网播放器弹幕,区别在于字幕数据为广播下去。

DVB字幕、网络视频弹幕这些和电视台播出滚动字幕不同,电视台滚动字幕做在视频里。而DVB、网络视频均为单独的字幕数据下发,机顶盒或播放器来合成显示。

 1引言

随着数字电视的蓬勃发展,数字电视已逐渐进入千家万户,除了传统的电视节目外,通过利用先进的数字电视技术为广大用户提供更多的信息服务,是广播电视事业发展的必然趋势。字幕(subtitle)作为一种简便而直观的信息提供途径,其重要性主要体现在两个方面。一是字幕可以为听力有障碍的人提供另一个"语音"信息途径;二是字幕功能可以通过简单的后期制作(如多语言显示),配合电视节目的全球化推广提供便捷的平台。DVB作为全球应用最广泛的数字电视传输标准,也为多种语言的字幕提供了相应的规范,从而使字幕成为不同国家和地区电视节目交流的良好载体。

2 DVB 数字电视字幕规范

2.1 字幕控制信息规范
    控制信息的规范主要包括有效数据的加载和提取索引信息的存放两个方面。DVB中规定,字幕信息要以节目的私有数据包形式复用到节目的基本流中,与音视频数据加载形式类似。提取索引信息则是利用DVB中的描述符(descriptor)语法插入到节目映射表(PMT)的私有数据段中。

流类型为0×06的私有数据段,承载本节目私有数据提取的相关信息:私有数据包的PID及其描述符。字幕描述符的标签值(descriptor_tag)为0×59,语法如下:

分析字幕描述子可得出该字幕的语言代码(ISO639_language_code)、字幕类型、合成页及可选的辅助页。这些信息在字幕数据的提取中将作为数据提取的索引信息。

2.2 字幕数据编码规范

字幕显示在终端是以页的形式显示出来,每一页又分成多个区域,每一个区域里又关联着多个图形对象和区域的颜色。因此,字幕数据编码是根据这些需求来定义的。字幕数据承载在PES包的负载中,结构如图1所示。

图1字幕数据的数据结构

  分析字幕的数据结构可知,前两个字节是字幕数据的确定信息,包括一个数据定义字节(该字段定义该数据流为DVB字幕,其值为0×20)和一个字节的字幕流识别id(其值为0×00);最后一个字节为字幕数据结束标志(其值为0×ff)。中间填充的数据则是字幕段数据。在字幕段数据中前6个字节为字幕段的头信息,包括1个同步字节(其值为0×0f)、1个类型字节(用来确定data_field()里携带的是哪种类型的数据分段)、2个字节的页ID(用来唯一标志一个字幕段)以及2个字节的段长度标识(标识其后面携带负载的大小)。

字幕段类型主要有以下四种:

页分段(pagecomposition)。通过页id(page_id)定义了该页显示终止时间、页的状态、该页中区域数、各区域号、各区域的水平及垂直位置。

区域分段(regioncomposition)。用于定义该区域的宽高、水平垂直位置、所使用的CLUT表的CLUT_id值、对象的id、区域背景色以及像素深度等信息。

CLUT分段(CLUTdefinition)。用于定义颜色,以便把传输的虚颜色转换成实际色板中的颜色。
    对象数据分段(objectdata)。用于定义对象的编码方法和编码数据。编码方法包括像素编码和字符编码。每一个对象可以看作是一个可显示的图像单元。

每一页数据的完整显示都至少需要这四个数据分段,所以在解析字幕流时,需要利用各种结构体及链表对这几个数据段数据进行解析并存储。

3 机顶盒字幕解码显示系统设计

在STB上实现字幕接收和显示主要包括四大模块:数据提取模块、数据解码模块、图层显示模块和用户控制模块。各模块关系如图2所示。
    图中,用户控制模块用于响应用户按键,并发送消息控制其它各模块;数据提取模块根据接收控制模块发来的滤波启动、停止或提取字幕数据等控制消息,并完成数据的提取工作;数据解码模块负责对数据提取模块送来的字幕原始数据进行解码,并将解码后的数据送到指定的缓冲区内供图层显示模块调用;图层显示模块用于实现字幕界面的各种OSD显示操作。

图2字幕系统模块关系图。

3.1 字幕数据提取模块

字幕数据提取模块包括两部分:字幕控制信息的提取和字幕数据包的提取。

用户控制模块发送字幕启动请求时,提取模块就启动SI引擎。首先,启动本节目的PMT表滤波工作,获取PMT数据并进行分析。若当前节目没有字幕信息,则发送无字幕消息至用户模块;若当前节目带有字幕信息,则根据PMT中的私有数据段和字幕描述符,获取字幕数据对应的PID、字幕的语言代码、字幕类型、合成页及可选的辅助页,并存放到字幕索引信息表中。其次,根据字幕索引信息表启动字幕有效数据的PES滤波,提取对应字幕数据包。字幕数据提取总体流程如图3所示。

图3字幕数据提取流程

当获得字幕的PID及其它信息后,则按字幕语言的不同,把当前节目所携带的所有语言的字幕列表,供用户选择。当用户选择完一个条目后,可利用该条目相应的控制信息获取字幕PES包,把字幕PID,合成页id和辅助页id注册进滤波通道,并启动滤波器。

此时,若滤波器接收到相匹配的数据,则会产生相应的中断,通知上层进程读取数据;当获取一个完整的PES包后,就传送给字幕解码器进行解码显示。

3.2 字幕数据解码模块

字幕数据解码模块负责对字幕PES包进行解码。
字幕PES包解码流程如图4所示。

图4字幕PES包解析流程。

字幕解码主要是对PES包进行分析,包括PES包头的检测,PES包头信息的提取和字幕段的分析。

滤波得到一个PES包后,首先判断包头是否合法,包括判断前四个字节是否为0×000001BD和PES包长度是否合法。

PES包头信息提取包括提取PTS、PES包头长度等。PTS是该分组中承载的所要显示的数据的显示时间。根据包头长度可以定位到PES的负载位置,进而分析PES包的负载。

分析PES包的负载,首先判断前两个字节(定义字节和字幕流id)是否分别为0×20、0×00.若都符合,则可以确定这个包就是所要的封装有字幕数据的PES包。然后进入字幕段分析,字幕字段的内容有四种情况。先找到同步头字节0×0f,再往后分析8bit的段类型(segment_type),通过判断该字节值来确定data_field()携带的是哪种类型的数据。当segment_type为0×10时[3],该段为页分段;当segment_type为0×11时,则该段为区域分段;当segment_byte为0×12时,该段为CLUT分段;当segment_byte为0×13时,该段为对象数据分段。最后,根据不同的类型调用不同的函数对各种类型的分段进行下一步的分析。

在页分段的解析中找到该页的页id、显示终止时间、显示状态、该页由几个区域组成、每个区域的区域id和每个区域的水平垂直坐标,并把这些数据存储起来。然后,根据从页分段中获取的区域的id找到相应的区域分段,获取该区域的宽高、像素深度、该区域填充的颜色、颜色表id(CLUT_id)、区域的数据对象个数、每个数据对象编号(object_id),并存储这些数据。

最后,通过CLUT_id找到颜色表,得到颜色的Y、Cr、Cb、T值。通过object_id找到对象数据的内容,包括编码方式及编码数据。用相应的解码方式把这些相关的编码数据解码出来,并放入缓冲区。其中,在页分析时,当解析出的该页的显示终止时间已经过了,则并不需要分析该页,把跟与该页相关的数据缓冲区进行清空操作。

由于一个PES包可能包含多个字幕段(subtitling_segment),因此必须循环分析到最后一个字幕段。对每个字幕段分析完后,都要判断下一个字节是下一个字幕段的同步头(0×0f)还是字幕数据结束标志(0×ff)。若是下一个字幕段的同步头则继续分析,若是数据结束标志则代表该PES包携带的负载分析完毕。最后,把得到的数据存放到显示缓冲区,通过分析得到的PTS创建一个定时时间,当时间到的时候从缓冲区中把数据读出,并调用OSD层驱动显示数据。

在该解码中,对于合成页(composition_page_id)的处理分为两种,这是因为同一个PID可能传送不同语言的字幕流,即语言不同的多个信息共享同一个PID流,所以在处理的时候可以把合成页设置为滤波器的深度。当一路数据流进来的时候,对符合该PID的PES包中对应的页ID进行判断,与页ID相同的就提取,不同的就丢弃,这是其中的一种解析提取方式。另一种方式是采用多种语言共用的PID值去设置滤波器,把与该PID值符合的字幕流提取出来,送去PES包解析。经过PES解析出该页ID,这时再判断该页ID是否与在PMT表解析得到的页ID一样。如果一样的话,说明正是要找的包,反之则说明是一个无效的PES包,则丢弃该包。

3.3 字幕图层显示模块

当用户在收看节目,启动字幕功能时,用户看到的是节目画面和字幕画面的叠加,OSD界面显示技术是指在图像画面上叠加图文显示,使屏幕提供更多附加信息。

为了控制字幕在屏幕上的正常显示,需要利用OSD驱动模块提供的区域操作功能。在该字幕显示实现中主要用到的OSD函数接口有OSD初始化函数、区域清除函数、OSD区域创建函数、OSD区域显示函数和OSD区域隐藏函数,在该系统中以回调函数的形式利用这些接口函数。在系统初始化中,必须先初始化字幕OSD区域,获取OSD层的设备id,注册字幕区域创建回调函数、字幕区域显示回调函数、字幕清屏回调函数和字幕区域隐藏回调函数。把这些函数的地址加以保存,当需要相应的OSD服务时,就通过函数指针调用相应的函数。

字幕显示可以根据分析PES包得到时间信息,并通过这个时间信息与音视频同步。在每区域数据解码完毕后,显示模块创建相关的OSD区域,分配内存空间,把解析完的数据连同该数据要显示的时间PTS送到显示缓冲区。此时,根据当前系统时钟STC和存储的PTS创建一个定时器,如果显示时间已经超过了系统时间,那么显示缓冲区的数据就要清空掉;反之,当显示时间到的时候,定时器被触发,显示内容输出到OSD缓冲区,并结合显示持续时间来进行字幕的显示。显示状态流程如图5所示。

图5显示状态流程

由于字幕的显示和机顶盒菜单界面的显示都是基于区域的,对于不同的应用,不能同时往同一个位置填充不同的数据。因此,在字幕显示前要把菜单OSD显示区域隐藏起来。当字幕正在显示又需要使用系统菜单时,调用字幕区域隐藏函数,设置显示标志为非需要显示状态。在菜单显示结束后,调用字幕区域显示函数,恢复字幕显示。采用这种方式可以解决字幕显示和界面显示的冲突。

3.4 字幕用户控制模块

控制模块是人机交换模块,主要负责用户请求的处理。本模块的首要任务是将用户的请求进行消息分类,再根据不同的消息与相关的模块进行通信,消息可分为以下几种:获取字幕控制信息消息、启动及停止字幕数据滤波消息、字幕数据解码及停止解码消息、OSD区域显示消息、OSD区域清除消息和OSD区域隐藏消息。

在机顶盒系统软件中,字幕的创建通过遥控器上的字幕键(SUBT)触发,发送消息启动数据控制信息提取模块,解析完毕后显示多语言字幕列表,供用户选择所要接收的语言(上下键选择及OK键触发)。用户一旦选择后,启动字幕数据提取模块,进行字幕PES数据流的滤波和缓冲,同时启动显示模块,根据各种时间进行显示或者清屏。字幕的关闭由遥控器上的退出(EXIT)键触发,进而控制停止滤波、停止数据解码,释放字幕功能创建的各内存空间,停止字幕显示。

在显示字幕的同时,进行界面菜单操作分成两种情况。一种是菜单操作进行了调台,用户控制模块发送消息关掉字幕功能、停止滤波、释放字幕功能创建的各内存空间;另一种情况是非调台的其他菜单操作,当界面操作结束后则发送字幕恢复显示消息给图层显示模块恢复显示。

4 结束语

本文采用模块化的设计思路,按照功能将机顶盒字幕解码系统分为四个模块,即数据提取、数据解码、数据显示和用户控制模块。在各个模块的实现上按照中间件和驱动层两个方面进行程序设计,使得编写的代码便于理解阅读,同时又易于实现不同平台间移植。

机顶盒平台的字幕数据格式分析及其显示实现相关推荐

  1. 博通机顶盒平台启动时间优化(一)

    博通机顶盒平台启动时间优化(一)CFE启动时间优化 博通机顶盒BCM97583平台上,默认不做裁剪和优化的情况下,从上电CFE启动到进入Linux命令行,这个过程大约需要4.48S.通过一系列功能裁剪 ...

  2. 20189208 2018-2019-2 《移动平台开发实践》分析小组项目代码

    20189208 2018-2019-2 <移动平台开发实践>分析小组项目代码 一.代码的组成部分 app: manifests AndroidManifest.xml java com. ...

  3. BS1063-基于大数据分析实现个性化音乐在线推荐平台,音乐资源分析平台

    本基于大数据分析实现个性化音乐在线推荐平台,音乐资源分析平台,系统主要采用java,hbase,springboot,mysql,mybatis,网络爬虫,音乐播放器,数据分析存储技术,实现基于互联网 ...

  4. 嵌入式仿真平台SkyEye的覆盖率分析

    随着嵌入式系统也越来越复杂,功能迭代越来越多,代码中就可能就会存在部分无用代码,或者在执行过程中无法测试覆盖的分支,这可能就会给软件带来很大的漏洞,严重降低软件的可靠性.因此,需要一个能够动态分析代码 ...

  5. nux 平台的 libpcap 源代码分析

    nux 平台的 libpcap 源代码分析 施聪 (javer@163.com), 高级程序员.网络设计师 简介: libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监 ...

  6. [2016][34]基于大数据的牛顿(Knewton)平台自适应学习机制分析

    自适应学习平台的关键技术与典型案例 1. 概述 2. Knewton平台 2.1 基础架构 2.1.1 数据收集与处理组件 2.1.2 推理与评估组件 2.1.3 个性化服务组件 2.2 数据模型 2 ...

  7. 当ivms平台无法登录以及服务状态显示未注册的处理办法

    一.当遇到登录iVMS资源管理系统时出现拒绝访问 打开Xshell连接到iVMS资源管理平台 输入 sh /usr/java/apache-tomcat-9.0.37/bin/startup.sh 来 ...

  8. Linux命令行如何编辑word文档,在Linux平台下用命令行工具显示Word文档

    在Linux平台下用命令行工具显示Word文档 ·Antiword ·Catdoc ·wvWare[@more@] Viewing Word files at the command line Wed ...

  9. rk3399平台电量计cw2015驱动分析

    rk3399平台电量计cw2015驱动分析 文章目录 rk3399平台电量计cw2015驱动分析 cw2015电路设计 cw2015 2芯电池设计参考 电路设计参考注意事项 板级配置 dts配置实例 ...

最新文章

  1. 2018上半年约26亿条数据泄露
  2. RibbitMQ 大数据分布式下的消息队列思
  3. python len函数_知识清单Python必备的69个函数,你掌握了吗?
  4. 扩展系统功能——装饰模式
  5. Java实验实现一个circle类,java实验报告-类的定义.doc
  6. [Java] 蓝桥杯BASIC-27 基础练习 2n皇后问题
  7. 黑马程序员-银行业务调度系统
  8. python打开rar_使用Python解压zip、rar文件
  9. 台式计算机总是重启,电脑为什么老是自动重启?我的电脑经常自动重启!!
  10. 区块链智能合约及形式化验证平台 VaaS 讲解
  11. VSCODE使用EmbeddedIDE插件开发51单片机
  12. mysql数据库输出数据语法错误_MySQL数据库定义存储过程总是报语法错误的解决方法...
  13. html5 uc qq,(进阶版)手机浏览器用户体验报告:UC、QQ、360,到底哪个好?
  14. 将 libVLC 视频渲染到 QWidget 中
  15. 史上最全,几百本常用书籍等你来取(面试,java,c,大数据,AI,python,数据结构等)
  16. IllegalArgumentException :argument type mismatch
  17. 全国大学生数学建模大赛入门1——赛前准备及注意事项
  18. CSS,font-family,好看,常用,中文,字体(更新中)
  19. 3月16日---3月20日课程表
  20. 如何做好跨境电商店铺定位—扬帆牧哲

热门文章

  1. 龙珠激斗服务器一直维护,龙珠激斗初始角色哪个好 六大新手角色评析
  2. 三星手机不想使用html,你的三星手机越用越卡?教你简单调整这4个设置,再用3年也不会卡...
  3. js判断微信内置/QQ内置/QQ浏览器
  4. oracle常用用户有哪几个,oracle解锁用户的命令有哪些
  5. 推荐一个悄悄赚钱的小神技Python
  6. mysql 游标 时间类型_mysql 游标类型
  7. python发送qq邮件(加密非加密)
  8. UG\NX二次开发 创建UDO特征
  9. java时间戳,时间格式之间的转换
  10. 20P74 pr预设模板800种信号干扰调色RBG色彩分离扭曲变形炫光溶解图形遮罩特效