码流发送方法和装置的制作方法

文档序号:7895183阅读:184来源:国知局
专利名称:码流发送方法和装置的制作方法
技术领域
本发明涉及视频技木,特别涉及码流发送方法和装置。
背景技术
宽带网络通信的快速发展,使得多媒体应用也越来越广泛,如视频会议、视频监控、IPTV、全球眼等。目前,这些多媒体应用的码流,也称为多媒体码流,在发送至目的端之前,需要在服务端的用户态下进行码流封装、打包和数据拷贝操作,下面对码流的发送进行具体描述參见图1,图I为现有码流发送示意图。在图I中,以请求流的一端作为目的端,而发送流的一端作为服务端为例。如图I所示,服务端在用户态先根据实际应用中码流被允 许的封装格式对待传输的码流进行封装。之后,服务端在用户态将封装后的码流打包,形成一个数据包。目前,UDP或者TCP来承载多媒体应用比如多媒体音频、视频的码流成为视频监控行业首选方案,基于此,服务端可将封装后的码流在用户态打包成UDP或TCP数据包。在完成数据包打包后,服务端调用用户态上的发送模块将所述数据包从用户态拷贝至内核态,以使得通过内核态的发送模块发送所述数据包至目的端。从图I所示的码流发送过程可以看出,在码流发送过程中,需要服务端将数据包从用户态拷贝至内核态,虽然这ー数据拷贝操作能够保证码流发送至目的端,但是会导致系统内存碎片的产生加剧。

发明内容
本发明提供了码流发送方法和装置,避免码流发送过程中用户态至内核态的数据拷贝。本发明提供的技术方案包括—种码流发送方法,该方法中,在服务端的内核态增加一个驱动设备,该驱动设备执行以下操作接收所述服务端的用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端ロ标识创建套接字Socket,设置所述Socket为无效,以指示目前暂不向所述目的端发送数据,并设置与该Socket相关联的流标识ID,返回给用户态维护;接收所述用户态发送的启动流指令,根据所述启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,以指示目前允许向目的端发送数据,井根据所述启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端。ー种应用于码流发送方法中的驱动设备,驱动设备被设置在服务端的内核态,该驱动设备包括创建流处理单元,用于接收所述服务端的用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端ロ标识创建套接字Socket,设置所述Socket为无效,以指示目前暂不向所述目的端发送数据,并设置与该Socket相关联的流标识ID,返回给用户态维护;发送流处理单元,用于接收所述用户态发送的启动流指令,根据所述启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,以指示目前允许向目的端发送数据,井根据所述启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端。由以上技术方案可以看出,本发明中,在服务端的内核态增加一个驱动设备,由该驱动设备根据用户态告知的数据包打包格式进行码流的数据包打包和发送,无需执行用户态至内核态的数据拷贝,这一方面減少了由于用户态至内核态的数据拷贝导致的系统开销,另一方面避免了由于用户态至内核态的数据拷贝而导致内存碎片产生加剧的缺陷。



图I为现有码流发送示意图;图2为本发明实施例提供的基本方法流程图;图3为本发明实施例提供的方法示意图;图4为本发明实施例提供的详细方法流程图;图5为本发明实施例提供的缓冲区単元示意图;图6为本发明实施例提供的装置结构图。
具体实施例方式为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。本发明提供的方法为了避免码流发送过程中用户态至内核态的数据拷贝,需要在内核态设置一个驱动设备。其中,该驱动设备执行的操作包括图2所示的步骤步骤201,接收所述服务端的用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端ロ标识创建套接字(Socket),设置与该Socket相关联的流标识(ID),并返回给用户态,以及,设置所述Socket为无效,以指示目前暂不向所述目的端发送数据。其中,所述用户态发送创建流指令是在接收到目的端的创建流请求后发送至所述内核态的,具体为用户态接收到目的端发送的创建流(Setup Stream)请求;解析所述Setup Stream请求携带的目的端IP地址和目的端ロ标识,并通过创建流指令发送至内核态。如此,内核态的驱动设备就接收到所述创建流指令。另外,本步骤201返回给用户态流ID,目的是便于用户态维护该流ID与上述的目的端IP地址和目的端ロ标识之间的对应关系,以便用户态后续接收到来自目的端的启动流(Start Stream)请求后,依据该Start Stream请求的目的端IP地址和目的端ロ确认对应的流ID,并将该确认的流ID携帯在启动流指令中发送给内核态,由内核态的驱动设置执行数据发送操作,具体见步骤202。步骤202,接收所述用户态发送的启动流指令,根据所述启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,以指示目前允许向目的端发送数据,并根据所述启动流指令中的打包格式对待发送的码流进行数据包打包,发送打包后的数据包至目的端。其中,用户态发送启动流指令是在接收到目的端发送的Start Stream请求后执行的。优选地,本发明中,该启动流指令可为ioctr中用于请求码流传输的指令。还有,启动流指令中的流ID是由所述用户态依据其维护的上述对应关系和所述启动流请求中目的端IP地址和目的端ロ标识来确定的。
另外,本发明中,当需要停止发送数据至目的端时,本发明中,可由用户态向所述驱动设备发送停止流指令,而当驱动设备接收所述用户态发送的停止流指令时,根据停止流指令中的流ID找到该流ID相关联的Socket,设置该Socket的状态为无效,以实现停止发送数据操作。从上面可以看出,本发明中,相比于现有技术,用户态和内核态均作了以下改进用户态仅执行以下图3所示的两种操作(1),为内核态要发送的码流设置打包格式;(2),向内核态中的驱动设备发送启动流指令,以保证码流发送至目的端,以及向驱动设备发送停止流指令,以取消发送码流至目的端。而内核态通过増加ー个驱动设备,仅执行以下图3所示的两种操作(1),根据用户态告知的打包格式实现码流的打包,包括打包成ES流、TS流、UDP流、TCP流等;(2),向目的端发送完成打包的数据包。其中,该发送可通过建立发送数据线程实现,下文进行具体描述。另外,在打包码流之前,通常还需要执行码流的封装,优选地,本发明还可由内核态的驱动设备进一歩执行码流封装操作,具体如图3所示。通过图3所示的用户态和内核态执行的操作,可以看出,本发明中,在码流发送过程中,无需执行用户态至内核态的数据拷贝,这一方面減少了由于用户态至内核态的数据拷贝导致的系统开销,另一方面避免了由于用户态至内核态的数据拷贝而导致内存碎片产生加剧的缺陷。下面对本发明实施例提供的方法进行描述參见图4,图4为本发明实施例提供的方法流程图。在该流程中,以请求码流的一端作为目的端A,而以发送码流的一端作为服务端A。如图4所示,该流程可包括以下步骤步骤401,服务端A在启动后打开在内核态增加的驱动设备,以使得所述驱动设备处于可用状态。优选地,为保证驱动设备可用,本步骤401在执行打开驱动设备之前,还需要执行驱动设备的注册等操作,因与本发明关系不大,这里不具体详述。步骤402,服务端A接收目的端发送的Setup Stream请求,解析所述Setup Stream中的目的端IP地址和目的端ロ标识,将解析到的目的端IP地址和目的端ロ标识通过创建流指令从用户态发送至内核态。步骤403,内核态的驱动设备接收到所述创建流指令后,确定其维护的码流发送信息表资源当前是否存在足够的可用资源来记录针对目的端A的码流发送信息表,如果是,执行步骤404,否则,结束当前流程。 本发明中,针对目的端A的码流发送信息表主要包括源标识和用于向目的端A发送码流的信息。其中,所述源标识表示当前是否存在有效的码流发送源,其取值为第一值比如I时,表示有效,取值为第二值比如O时,表示无效。至于用于向目的端A发送码流的信息其在下文进行举例描述。本发明中,针对目的端A的码流发送信息表通过以下结构示出
typcdci' struct tag_KernclSrrcamDcIiverDstln ο
int ulSrcFlag; /*源、标识字段,表示是否存在有效的码流发送源*/
DRV IPV4 INFO S *pstDstAddr; /*用于向目的端A发送码流的信息字段*/
} KERNEL SD DST S;以用于向所述目的端发送码流的信息采用IP+P0RT结构定义,且至少包括源IP地址、源端ロ标识、目的端IP地址、目的端ロ标识、流ID、以及Socket信息为例,则用于向目的端A发送码流的信息可通过以下结构示出
typedef struct tagDrvIpv4Info
{
bool bValid; /*码流发送标识字段,取值为值I比如O时表示无效,取植为值2 比如I时表示有效,在有效时可以进行码流发送,无效时不进行码流发送*/ int ulPaketType;I*数据色的打包格式字段*/
int stream ID;/* 流标识字段 */
unsigned int ulsi.cAddr; /*源丨I)地址比如源IPV4地址字段*/ unsigned int ulDstAddr; /*目的端IP地址比如目的端IPV4地址字段*/ unsigned short usSrcPoit; I* 源端 ロ 比如源 IPV4 端 ロ 字段 */ unsigned short usDstPort; /* 目的端 ロ 比如目的 IPV4 端 ロ 字段 */ struct sockaddr—in addr; struct socKet *sock; /* sock 予段 */ jDRV_IPV4_iNFO_S;另外,本步骤403中的可用资源可为空闲资源,也可为以下码流发送表资源记录了针对其他目的端的已过期码流发送信息的资源。步骤404,内核态的驱动设备接收用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端ロ标识创建Socket,并将创建的Socket信息记录至步骤403所示码流发送信息表结构的sock字段,以便后续发送数据时使用。步骤405,所述驱动设备设置与该Socket相关联的流ID,保存该流ID至步骤403所示码流发送信息表结构的流标识字段,将该流ID返回给用户态,以及,设置步骤403所示码流发送信息表结构的源标识字段为有效,并设置Socket无效。本步骤405中,设置Socket无效,可通过设置步骤403所示码流发送信息表结构的码流发送标识字段无效来体现,用于指示目前暂不向所述目的端发送数据。步骤406,用户态接收内核态针对目的端A返回的流ID,并维护该流ID与目的端A在发送上述Setup Stream请求时携带的目的端IP地址和目的端ロ标识之间的对应关系。步骤407,目的端A发送Start Stream请求至服务端。步骤408,服务端A接收到Start Stream请求后,通过解析该Start Stream请求携带的目的端IP地址和目的端ロ来从其维护的步骤406所示对应关系中确定出对应的流ID,将确定的流ID以及预先针对该目的端A设置的打包格式携帯在启动流指令中从用户态 发送给内核态。步骤409,内核态的驱动设备接收到启动流指令后,根据启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,并记录所述启动流指令中的打包格式至步骤403所示码流发送信息表结构的打包格式字段,以便对待发送的码流进行数据包打包并发送至目的端。本步骤409中,更新该Socket有效,可通过将步骤403所示码流发送信息表结构的码流发送标识字段设置为有效来体现,以指示目前允许向目的端发送数据。本步骤409中,对待发送的码流进行数据包打包并发送至目的端包括建立数据发送线程;启动所述数据发送线程,触发所述数据发送线程依照所述打包格式对预设的每ー缓存单元存放的码流进行数据包打包;将打包后的数据包发送至目的端。需要说明的时,本发明中,为便于数据包打包,可在实际应用中,根据本服务端A在和目的端A之间进行码流传输时经常使用的数据包打包格式设置缓冲区单元,以使得缓冲区单元中预留了数据位置和与打包格式对应的数据头位置,其中,数据位置用于存放码流。比如图5示出了预留了数据位置和TS头、ES头作为数据头的缓冲区単元。基于本发明所提出的缓冲区単元,则上述依照打包格式对码流进行数据包打包具体为依次检测预设的每一缓冲区単元的数据位置上是否有可发送的码流,所述可发送的码流为操作类型被标识为读操作的码流;如果是,在该缓存単元的数据头位置上填写所述打包格式对应的数据头信息,将填写后的数据头和所述可发送的码流一起作为打包后的数据包。至此,通过上面描述的步骤401至步骤409完成了内核态直接发送数据至目的端的操作,无需执行用户态至内核态的数据拷贝,这減少了由于用户态至内核态的数据拷贝导致的系统开销,也避免了由于用户态至内核态的数据拷贝而导致内存碎片产生加剧的缺陷。以上对本发明实施例提供的方法进行了描述,下面对本发明实施例提供的装置进行描述。
參见图6,图6为本发明实施例提供的装置结构图。这里,本发明提供的装置为上面描述的驱动设备,如上所述,该驱动设备被设置在服务端的内核态,如图6所示,该驱动设备包括创建流处理单元,用于接收所述服务端的用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端ロ标识创建套接字Socket,设置所述Socket为无效,以指示目前暂不向所述目的端发送数据,并设置与该Socket相关联的流标识ID,返回给用户态维护;发送流处理单元,用于接收所述用户态发送的启动流指令,根据所述启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,以指示目前允许向目的端发送数据,井根据所述启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端。优选地,所述创建流指令是所述用户态是在接收到目的端的创建流请求后发送至所述内核态的; 而所述启动流指令是在所述用户态接收到目的端的启动流请求后发送至所述内核态的,所述启动流指令中的流ID是由所述用户态依据其维护的流ID与目的端IP地址和目的端ロ标识之间的对应关系,以及所述启动流请求中目的端IP地址和目的端ロ标识来确定的;其中,所述对应关系是在所述用户态接收所述驱动设备返回的流ID后维护的。如图6所示,所述驱动设备进ー步包括停止流处理单元,用于接收所述用户态发送的停止流指令,根据停止流指令中的流ID找到与该流ID相关联的Socket,设置该Socket的状态为无效,以实现停止发送数据操作。本发明中,所述发送流处理单元通过以下步骤实现根据启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端建立数据发送线程;启动所述数据发送线程,触发所述数据发送线程依照所述打包格式对预设的每ー缓存单元存放的码流进行数据包打包;将打包后的数据包发送至目的端。优选地,所述缓冲区単元中预留了数据位置和与打包格式对应的数据头位置,其中,所述数据位置存放码流。则基于此,所述依照打包格式对可发送的码流进行数据包打包具体为依次检测预设的每一缓冲区単元的数据位置上是否有可发送的码流,所述可发送的码流为操作类型被标识为读操作的码流;如果是,在该缓存単元的数据头位置上填写所述打包格式对应的数据头信息,将填写后的数据头和所述可发送的码流一起作为打包后的数据包。至此,完成本发明提供的装置描述。由以上技术方案可以看出,本发明中,在服务端的内核态增加一个驱动设备,由该驱动设备根据用户态告知的数据包打包格式进行码流的数据包打包和发送,无需执行用户态至内核态的数据拷贝,这一方面減少了由于用户态至内核态的数据拷贝导致的系统开销,另一方面避免了由于用户态至内核态的数据拷贝而导致内存碎片产生加剧的缺陷。本申请发明人做了以下测试按照现有技术假如启动3路1080P 30帧SM的码流,则会导致cpu使用率接近100%,而执行本发明,仍然启动上述三路1080P 30帧8M的码流,则由于内核态的驱动设备直接根据用户态告知的数据包打包格式进行码流的数据包打包和发送,无需执行用户态至内核态的数据拷贝,则会导致CPU的使用率还有30%左右的剰余,这显然证明了 CPU的利用率高,降低系统开销;还有,本发明中,通过上述预留了数据头的缓冲区,能够减少数据打包时间,进而降低系统性能开销。 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
权利要求
1.ー种码流发送方法,其特征在于,该方法中,在服务端的内核态增加一个驱动设备,该驱动设备执行以下操作 接收所述服务端的用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端ロ标识创建套接字Socket,设置所述Socket为无效,以指示目前暂不向所述目的端发送数据,并设置与该Socket相关联的流标识ID,返回给用户态维护; 接收所述用户态发送的启动流指令,根据所述启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,以指示目前允许向目的端发送数据,井根据所述启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端。
2.根据权利要求I所述的方法,其特征在于,所述创建流指令是所述用户态在接收到目的端的创建流请求后发送至所述内核态的; 所述用户态维护所述流ID包括建立并维护所述流ID与所述目的端IP地址和目的端ロ标识三者之间的对应关系; 所述启动流指令是所述用户态在接收到目的端的启动流请求后发送至所述内核态的,所述启动流指令中的流ID是由所述用户态依据其维护的所述对应关系和所述启动流请求中目的端IP地址和目的端ロ标识来确定的。
3.根据权利要求I所述的方法,其特征在于,所述驱动设备进一步执行以下操作 接收所述用户态发送的停止流指令,根据停止流指令中的流ID找到与该流ID相关联的Socket,设置该Socket的状态为无效,以实现停止发送数据操作。
4.根据权利要求I所述的方法,其特征在于,所述根据启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端包括 建立数据发送线程; 启动所述数据发送线程,触发所述数据发送线程依照所述打包格式对预设的每ー缓存单元存放的码流进行数据包打包; 将打包后的数据包发送至目的端。
5.根据权利要求4所述的方法,其特征在于,所述缓冲区単元中预留了数据位置和与打包格式对应的数据头位置,所述数据位置存放码流; 所述依照打包格式对预设的缓存单元存放的码流进行数据包打包具体为 依次检测预设的每一缓冲区単元的数据位置上是否有可发送的码流,所述可发送的码流为操作类型被标识为读操作的码流; 如果是, 在该缓存単元的数据头位置上填写所述打包格式对应的数据头信息,将填写后的数据头和所述可发送的码流一起作为打包后的数据包。
6.ー种应用于码流发送方法中的驱动设备,其特征在干,驱动设备被设置在服务端的内核态,该驱动设备包括 创建流处理单元,用于接收所述服务端的用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端ロ标识创建套接字Socket,设置所述Socket为无效,以指示目前暂不向所述目的端发送数据,并设置与该Socket相关联的流标识ID,返回给用户态维护; 发送流处理单元,用于接收所述用户态发送的启动流指令,根据所述启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,以指示目前允许向目的端发送数据,并根据所述启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端。
7.根据权利要求6所述的驱动设备,其特征在于,所述创建流指令是所述用户态在接收到目的端的创建流请求后发送至所述内核态的; 所述启动流指令是所述用户态在接收到目的端的启动流请求后发送至所述内核态的,所述启动流指令中的流ID是由所述用户态依据其维护的流ID与目的端IP地址和目的端ロ标识之间的对应关系,以及所述启动流请求中目的端IP地址和目的端ロ标识来确定的;其中,所述对应关系是在所述用户态接收所述驱动设备返回的流ID后维护的。
8.根据权利要求6所述的驱动设备,其特征在于,所述驱动设备进一歩包括停止流处理单元,用于接收所述用户态发送的停止流指令,根据停止流指令中的流ID找到与该流ID相关联的Socket,设置该Socket的状态为无效,以实现停止发送数据操作。
9.根据权利要求6所述的驱动设备,其特征在于,所述发送流处理单元通过以下步骤实现根据启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端 建立数据发送线程; 启动所述数据发送线程,触发所述数据发送线程依照所述打包格式对预设的每ー缓存单元存放的码流进行数据包打包; 将打包后的数据包发送至目的端。
10.根据权利要求9所述的驱动设备,其特征在于,所述缓冲区単元中预留了数据位置和与打包格式对应的数据头位置,所述数据位置存放码流; 所述依照打包格式对可发送的码流进行数据包打包具体为 依次检测预设的每一缓冲区単元的数据位置上是否有可发送的码流,所述可发送的码流为操作类型被标识为读操作的码流; 如果是, 在该缓存単元的数据头位置上填写所述打包格式对应的数据头信息,将填写后的数据头和所述可发送的码流一起作为打包后的数据包。
全文摘要
本发明提供了码流发送方法和装置。该方法中,在服务端的内核态增加一个驱动设备,该驱动设备执行以下操作接收所述服务端的用户态发送的创建流指令,根据所述创建流指令中的目的端IP地址和目的端口标识创建套接字Socket,设置与该Socket相关联的流标识ID,并返回给用户态,以及,设置所述Socket为无效,以指示目前暂不向所述目的端发送数据;接收所述用户态发送的启动流指令,根据所述启动流指令中的流ID找到该流ID相关联的Socket,更新该Socket为有效,以指示目前允许向目的端发送数据,并根据所述启动流指令中的打包格式对待发送的码流进行数据包打包并发送至目的端。
文档编号H04N7/24GK102695049SQ20121014205
公开日2012年9月26日 申请日期2012年5月9日 优先权日2012年5月9日
发明者成宝红 申请人:浙江宇视科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1