发明内容
为解决上述问题,本发明提供一种能够解决数字电视中Gstreamer不能直接读取数字电视数据以及第三下载数据、源元件功能单一等问题的数字电视中
Gstreamer外部数据读取方法及其装置。
为达上述目的,本发明数字电视中Gstreamer读取外部数据的方法方法为:
在管道中创建一个用于存储外部数据的buffer;
将存储有数据的buffer交由源元件管理。
进一步地,所述Gstreamer读取外部数据的方法还包括:
创建playbin2管道;
playbin2管道选择添加所述源元件。
进一步地,所述源元件为appsrc元件。
进一步地,所述playbin2管道选择添加appsrc元件的方法为:
步骤A1:修改playbin2管道的uri属性为所述appsrc元件所对应的属性;
步骤A2:playbin2管道根据uri属性将appsrc元件添加到管道中;
步骤A3:修改appsrc元件的属性以使其处于就绪状态。
进一步地,在所述步骤A3包括以下具体步骤:
步骤A3.1:playbin2管道添加完所述appsrc元件后输出source-setup信号;
步骤A3.2:状态改写函数根据上述信号source-setup信号改写appsrc元件的属性。
进一步地,在appsrc元件属性修改完后,所述将存储有数据的buffer交由源元件管理包括以下步骤:
B1:所述appsrc元件发出need_data信号激活数据读取函数;
B2:所述数据读取函数将所述playbin2管道所需读取的数据存储至所述buffer中,并向所述appsrc元件返回所述buffer中数据存储状态;
B3:appsrc元件根据所述返回的buffer中数据存储状态的判断是否所述buffer中是否有数据,有则发出push-buffer信号,由回调函数将所述buffer添加到所述appsrc管理的队列中。
进一步地,所述buffer为Gstreamer框架下的GSTbuffer类的实例。
进一步地,所述外部数据为数字电视数据或第三方下载数据。
进一步地,所述外部数据还包括本地硬盘数据、网络服务器数据;其中,读取本地硬盘数据或网络服务器数据,所述的数据电视中Gstreamer读取外部数据的方法还包括由上层应用将本地硬盘数据或网络服务器数据存储到指定存储区域。
为达上述目的,本发明数字电视中Gstreamer读取外部数据的装置,包括管道;所述管道内设有用于存储外部数据的buffer以及管理存储有数据的所述buffer的源元件。
具体地,所述管道为playbin2管道;管理存储有数据的所述buffer的源元件为appsrc元件。
本发明数字电视中Gstreamer读取外部数据的方法及其装置通过一个或多个实施例的中所描述的技术方案至少具有以下有益效果:
本发明数字电视中Gstreamer读取外部数据的方法及其装置,利用了‘数据所对应的数据来源对于本发明数字电视中Gstreamer加载数据时是透明’这一特点,由Gstreamer创建buffer,并将新的数据来源的数据加载至buffer中,并利用,再交由一定的源元件对所述buffer进行管理,完成Gsteamer中对外部数据的加载特性,故而解决了传统的数字电视中Gstreamer流媒体框架下,不能够直接读取数字电视数据以及第三方下载数据的问题,且打破了一个源元件只能对单一的数据来源进行加载的局限;简化了新的数据来源的数据加载。
具体实施方式
本发明数字电视中Gstreamer读取外部数据的方法及其装置解决了Gstreamer流媒体框架中不能直接读取已经位于数字电视中Gstreamer外部的buffer中的数字电视数据以及第三方下载数据、源元件功能单一等问题;其总体思路如下:
本发明数字电视中Gstreamer读取外部数据的方法为首先在管道中创建一个用于存储外部数据的buffer,再由源元件管理存储有数据的buffer,从而实现向管道加载数据。
本发明数字电视中Gstreamer读取外部数据的装置包括管道;所述管道内设有用于存储外部数据的buffer以及管理存储有数据的所述buffer的源元件。
上述方法以及装置改变了过去由源元件直接从数据源如硬盘加载数据必须与相应的数据源创建连接,然后通过传输协议从数据源获取数据的方式,源元件不再关心数据的来源,需要加载的数据只要位于其管道中的buffer中就能加载。从而有效的解决了数字电视数据以及第三方下载数据等新的来源的数据不可以直接加载到Gstreamer中的问题。
下面结合说明书附图对本发明数字电视Gstreamer读取外部数据做进一步的描述。
实施例一:
本实施例数字电视中Gstreamer读取外部数据的方法为:
首先在管道中创建一个用于存储数据的buffer,其次将存储有数据的buffer交由源元件进行管理,以完成Gstreamer流媒体框架下管道中对外部数据的加载。
在传统的Gstreamer流媒体框架下,采用如图2所述的Gstreamer管道中的输入部分的源元件负责为管道读取数据(如从磁盘等地方读取数据,首先的建立连接,然后根据通信协议读取数据);与数据处理部分对应过滤元件负责对数据进行转化等处理(例如音频文件的解码、解复用等);再经过与输出部分对应的元件的接收元件负责对数据的接收(如写磁盘、将声音送入声卡播放器中)。读取外部数据的时候需要由专门的源元件来实现,特别是相对于Gstreamer来说新数据来源的数据,需要重新编写一个新的源元件来进行数据的读取,而本实施例所述的Gstreamer读取外部数据的方法,则是只要数据位于上述的buffer中就可以直接读取,不管数据是来自Gstreamer管道外的buffer中或硬盘或网络。
而在本实施例中所述数字电视中Gsteamer读取外部数据的方法,位于管道中输入部分的源元件可以是专门编写的为管理有数据的buffer的通用源元件,也可以是采用在现有的Gstreamer流媒体框架下存在的元件appsrc元件(如图3所示)。
具体地,传统的Gstreamer中不能直接读取的已经下载在Gstreamer外部的buffer中的数字电视数据或第三方下载数据。而在本实施例所述的Gstreamer流媒体框架读取数据的时候,由于其已经位于数字电视中的某一个缓存空间中,只需通过一个的数据读取函数,将上述数据直接复制或搬移到Gstreamer流媒体框架下管道中的buffer中,再交由一定的源元件对所述buffer进行管理,就完成Gsteamer中对外部数据的加载,故而解决了传统的数字电视中Gstreamer流媒体框架下,不能够直接读取数字电视数据以及第三方下载数据的问题。且复制数据或搬移数据在现有的通信技术中是一个相当成熟的技术,故实现简单。
此外,该方法还可以用来读取本地硬盘数据以及网络服务器数据。如硬盘多媒体数据,传统的方法中所述的Gstreamer流媒体框架由其自身与数据来源建立连接,并根据一定的通信协议读取数据。而采用本实施例所述的数字电视中Gstreamer流媒体框架读取时,可由上层应用将硬盘数据存储到特定存储区域,再由数据读取函数将数据填充到其所创建的buffer中,再由源元件进行管理即可。在具体的实施过程中上层应用将硬盘数据存储到特定空间中,已是很成熟的技术了。如可以通过C函数中的fread将数据直接写入上述特定空间(如缓存)即可。这样就大大的简化了数字电视中Gstreamer读取外部数据。
综合上述,本实施例数字电视中Gstreamer读取外部数据的方法首先为数字电视中Gstreamer流媒体框架读取外部数据提供了一种直接读取已经存储在Gstreamer外部的特定空间的数字电视数据以及第三方下载数据的方法;其次提供了一种更为灵活、快捷,一个源元件实现了对各种不同来源的数据实现加载的简便外部数据读取方法。仅针对数字电视数据的处理而言,可以简便的由Gstreamer框架下的过滤元件、接收元件等进行处理,从而数据处理更加简便,降低了应用程序的开发难度,开发过程中开发人员能更加专注流媒体本身的开发。从而本实施例所述的数字电视中Gstreamer读取外部数据的方法具有所能处理外部数据的来源广,实现简便的优点。
实施例二:
本实施例数字电视中Gstreamer读取外部数据的方法在实施例一的基础上还包括:
创建playbin2管道;
在playbin2管道中选择添加管理buffer的源元件;
由上述被添加的源元件管理有数据的buffer。
Gstreamer中数据处理是一个相对较为复杂的过程,不同的数据由于编码、类型等参数不一致所需进行的数据处理也不尽相同。因此数据进行处理所需的元件以及元件处理链也不相同,在Gstreamer中设有一种能自动查找元件并组成数据处理链以实现不同数据处理的管道——playbin2管道。
在本实施例数字电视中所述Gstreamer读取外部数据的方法,采用playbin2这个高智能的管道,自动添加专门管理由Gstreamer创建的buffer的专门源元件,更加简便快捷,实现更加方便。
实施例三:
如图4所示,本实施例数字电视中Gstreamer读取外部数据的方法在上一实施例一的基础上;所述playbin2选择添加的用于管理所述有数据的buffer的源元件为appsrc元件。
在现有的数字电视中Gstreamer流媒体框架下已经存在的元件appsrc元件管理有数据的buffer,降低了开发的难度。
具体的所述playbin2选择appsrc元件用于读取buffer的方法为:
步骤A1:将playbin2管道的uri属性修改成appsrc元件所对应的属性;
步骤A2:playbin2管道根据其自身的uri属性选择appsrc添加到管道中;
步骤A3:修改appsrc元件的属性以使其处于就绪状态。
当appsrc元件的属性修改完毕后,appsrc元件就可以用来接管存储有数据的buffer,进而完成数据向playbin2管道的添加。通常步骤3中修改的属性如block、is_live等。通过这些属性的修改可以合理的控制数据的加载,如block设置了appsrc读取数据时的上限值,从而避免了管道因为一次性接收数据溢出带来的系统混乱、崩溃等故障。
由于存储在不同储存区域的数据的uri不同,如file:///home/canon.mp3或rtsp://mp3.test.com/canon.mp3,表示这些数据直接来自硬盘均与来自buffer缓存区的数据的地址不同,故playbin2管道可以根据解析到的数据的uri来判断是以一般的源元件加载还是修改uri后加载appsrc元件,实现智能化高且简便。
具体的实施过程中,可以采用Gstreamer的系统函数g_object_set()函数对playbin2管道的属性进行修改也可以是根据需要例外撰写的函数。
更加具体的,所述步骤3又分为以下具体的步骤:
步骤A3.1:playbin2管道添加完所述appsrc元件后输出source-setup信号;
步骤A3.2:状态改写函数根据上述信号source-setup信号改写appsrc元件的属性。
所述source-setup信号是现有的Gstreamer流媒体框架内已经固有的信号。这个信号是playbin2注册到Gobject对象系统是一起注册的。源元件被成功添加到管道中,playbin2管道就会将信号发出。将上source-setup信号与状态改写函数关联,当发出信号状态改写函数被调用。在具体的实施过程中该信号可以与多个函数进行连接,信号在元件上发射后,对应的函数会依照与信号连接的顺序进行逐个调用。
在本实施例中以source-setup信号作为状态改写函数的触发信号或触发输入,实现简单,不需要例外编写触发信号或触发输入或调用信号,具有实现简单、简便的特点。
实施例四:
本实施例数字电视中Gstreamer读取外部数据的方法,在上述实施例的基础上,所述appsrc元件判断buffer中有数据方法为在appsrc元件属性修改完后,所述appsrc元件接管所述buffer的分为以下步骤:
1:所述appsrc元件发出need_data信号激活数据读取函数;
2:数据读取函数将所需的外部数据复制到所述buffer中,并返回所述buffer的存储状态:;
3:appsrc元件根据所述返回的buffer中数据存储状态的判断是否所述buffer中是否有数据,有则发出push-buffer信号,由回调函数将所述buffer添加到所述appsrc管理的队列中。
need_data信号是appsrc元件的固有信号,是其自身注册到Gobject对象系统是一起注册的,利用该信号作为触发数据读取函数,数据函数读取外部数据并填充buffer中后携带buffer存储状态的返回值,具有实现简单、方便、可靠的特点。相应的位于buffer中的数据如数字电视信号、网络媒体数据如P2P数据将被appsrc元件加载到管道中,再进行后续的数据处理以及数据的输出。
实施例五:
本实施例数字电视中Gstreamer读取外部数据的方法为:
在管道中创建一个用于存储外部数据的buffer;
将存储有数据的buffer交由源元件管理;
其中所述buffer为Gstreamer框架下的GSTbuffer类的实例。所述buffer继承了GSTbuffer类中的属性,包括存储空间大小等属性,以便在加载数据时进行数据的合理的分割和搬移。
本发明数字电视中Gstreamer读取外部数据方法中的buffer有别于其他应用程序中buffer,它继承GSTbuffer类的属性,专为所述Gstreamer读取外部数据用。
下面对本发明数字电视中Gstreamer读取外部数据的装置做进一步的描述。
第一实施例:
数字电视在当下生活中扮演者越来越重要的角色,作为一个重要的显示播放装置为了尽可能的实现其多功能,在其系统中安装有嵌入式Gstreamer处理芯片实现Gstreamer流媒体框架下多种数据的播放和显示,但是针对于从电视网络中下载的已存储在buffer中的数字电视信号以及从第三方下载的已存储在buffer中的数据无法直接的写入Gstreamer的pipeline管道中。且一种源元件只能处理一种数据来源的数据,从而导致了源元件功能单一。
为了解决上述问题,本实施例所述的数字电视中Gstreamer读取外部数据的装置,包括管道,管道内设有负责加载外部数据的源元件以及用于加载外部数据的buffer,所述源元件接管存储有外部数据的所述buffer即完成了向管道向所述playbin2管道中添加数据。
针对上述的数字电视信号或第三方下载的数据需要通过Gstreamer处理的,只需将数据下载时直接加载到本实施例所述的数字电视中Gstreamer读取外部数据装置管道的buffer中,就能由源元件直接加载到Gstreamer的管道中了。
针对硬盘数据或网络服务器数据,则首先由上层应用将数据存储到指定存储区域,再由所述数字电视中Gstreamer读取外部数据的装置将数据复制到buffer中,再交由源元件进行管理就完成了向Gstreamer中加载数据。
由上述可知本实施例所述的数字电视中Gstreamer读取外部数据的装置采用的是上述实施例中所述的所述的数字电视中Gstreame读取外部数据的方法,从而具有以下优点;
第一:可以直接将接收到的数字电视信号以及第三方网络媒体的数据从Gstreamer外部的缓存中加载到Gstreamer流媒体框架的管道中,实现数据的优质播放。
第二:本发明数字电视中Gstreamer读取外部数据的装置可从由其在管道中创建的buffer中直接加载数据,数据来源的对于Gstreamer加载数据时是透明,从而可以从buffer中加载不同数据来源的数据,从而打破了一个源元件只能对一种数据来源进行加载的局限。
所述的外部数据包括为数字电视数据、网络媒体数据、第三方网络数据以及硬盘数据。在本实施例中,所述的外部数据相对传统数字电视中Gstreamer读取外部数据的装置而言所能处理的数据来源更加宽泛。
第二实施例:
本实施例数字电视中Gstreamer读取外部数据的装置,包括playbin2管道,所述playbin2管道包括负责读取外部数据的appsrc源元件、负责对数据进行转换的过滤元件、负责对输出数据的接收元件,所述数字电视Gstreamer还包括用于存储外部数据的buffer;所述appsrc元件接管存储有外部数据的所述buffer,从而完成外部数据添加到playbin2管道中。
本实施例所述数字电视Gstreamer直接采用现有的Gstreamer中已有的的元件appsrc元件来管理buffer,即不需要另外编写一个专门管理上述buffer中源元件,实现更加简便快捷。
在具体的实施过程中,所述数字电视为LED电视或OLED电视或PDP等离子电视。
数字电视以及数字电视信号的传输的应用越来越成熟,数字电视中的LED电视、OLED电视、小型的PDP等离子电视因为其符合现有的电子设备薄型化、轻便化越来越受到大众的追捧。从而要求实现的功能也越来越强大,而本实施例中数字电视中Gstreamer读取外部数据的装置,满足了用户的对各种流媒体数据进行简便处理的需求,从而实用性强。
以上,仅为本发明的较佳实施例,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求所界定的保护范围为准。