两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

碼流發(fā)送方法和裝置的制作方法

文檔序號(hào):7895183閱讀:220來源:國知局
專利名稱:碼流發(fā)送方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及視頻技木,特別涉及碼流發(fā)送方法和裝置。
背景技術(shù)
寬帶網(wǎng)絡(luò)通信的快速發(fā)展,使得多媒體應(yīng)用也越來越廣泛,如視頻會(huì)議、視頻監(jiān)控、IPTV、全球眼等。目前,這些多媒體應(yīng)用的碼流,也稱為多媒體碼流,在發(fā)送至目的端之前,需要在服務(wù)端的用戶態(tài)下進(jìn)行碼流封裝、打包和數(shù)據(jù)拷貝操作,下面對(duì)碼流的發(fā)送進(jìn)行具體描述參見圖1,圖I為現(xiàn)有碼流發(fā)送示意圖。在圖I中,以請求流的一端作為目的端,而發(fā)送流的一端作為服務(wù)端為例。如圖I所示,服務(wù)端在用戶態(tài)先根據(jù)實(shí)際應(yīng)用中碼流被允 許的封裝格式對(duì)待傳輸?shù)拇a流進(jìn)行封裝。之后,服務(wù)端在用戶態(tài)將封裝后的碼流打包,形成一個(gè)數(shù)據(jù)包。目前,UDP或者TCP來承載多媒體應(yīng)用比如多媒體音頻、視頻的碼流成為視頻監(jiān)控行業(yè)首選方案,基于此,服務(wù)端可將封裝后的碼流在用戶態(tài)打包成UDP或TCP數(shù)據(jù)包。在完成數(shù)據(jù)包打包后,服務(wù)端調(diào)用用戶態(tài)上的發(fā)送模塊將所述數(shù)據(jù)包從用戶態(tài)拷貝至內(nèi)核態(tài),以使得通過內(nèi)核態(tài)的發(fā)送模塊發(fā)送所述數(shù)據(jù)包至目的端。從圖I所示的碼流發(fā)送過程可以看出,在碼流發(fā)送過程中,需要服務(wù)端將數(shù)據(jù)包從用戶態(tài)拷貝至內(nèi)核態(tài),雖然這ー數(shù)據(jù)拷貝操作能夠保證碼流發(fā)送至目的端,但是會(huì)導(dǎo)致系統(tǒng)內(nèi)存碎片的產(chǎn)生加劇。

發(fā)明內(nèi)容
本發(fā)明提供了碼流發(fā)送方法和裝置,避免碼流發(fā)送過程中用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝。本發(fā)明提供的技術(shù)方案包括—種碼流發(fā)送方法,該方法中,在服務(wù)端的內(nèi)核態(tài)增加一個(gè)驅(qū)動(dòng)設(shè)備,該驅(qū)動(dòng)設(shè)備執(zhí)行以下操作接收所述服務(wù)端的用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端ロ標(biāo)識(shí)創(chuàng)建套接字Socket,設(shè)置所述Socket為無效,以指示目前暫不向所述目的端發(fā)送數(shù)據(jù),并設(shè)置與該Socket相關(guān)聯(lián)的流標(biāo)識(shí)ID,返回給用戶態(tài)維護(hù);接收所述用戶態(tài)發(fā)送的啟動(dòng)流指令,根據(jù)所述啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,以指示目前允許向目的端發(fā)送數(shù)據(jù),井根據(jù)所述啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端。ー種應(yīng)用于碼流發(fā)送方法中的驅(qū)動(dòng)設(shè)備,驅(qū)動(dòng)設(shè)備被設(shè)置在服務(wù)端的內(nèi)核態(tài),該驅(qū)動(dòng)設(shè)備包括創(chuàng)建流處理單元,用于接收所述服務(wù)端的用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端ロ標(biāo)識(shí)創(chuàng)建套接字Socket,設(shè)置所述Socket為無效,以指示目前暫不向所述目的端發(fā)送數(shù)據(jù),并設(shè)置與該Socket相關(guān)聯(lián)的流標(biāo)識(shí)ID,返回給用戶態(tài)維護(hù);發(fā)送流處理單元,用于接收所述用戶態(tài)發(fā)送的啟動(dòng)流指令,根據(jù)所述啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,以指示目前允許向目的端發(fā)送數(shù)據(jù),井根據(jù)所述啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端。由以上技術(shù)方案可以看出,本發(fā)明中,在服務(wù)端的內(nèi)核態(tài)增加一個(gè)驅(qū)動(dòng)設(shè)備,由該驅(qū)動(dòng)設(shè)備根據(jù)用戶態(tài)告知的數(shù)據(jù)包打包格式進(jìn)行碼流的數(shù)據(jù)包打包和發(fā)送,無需執(zhí)行用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝,這一方面減少了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝導(dǎo)致的系統(tǒng)開銷,另一方面避免了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝而導(dǎo)致內(nèi)存碎片產(chǎn)生加劇的缺陷。



圖I為現(xiàn)有碼流發(fā)送示意圖;圖2為本發(fā)明實(shí)施例提供的基本方法流程圖;圖3為本發(fā)明實(shí)施例提供的方法示意圖;圖4為本發(fā)明實(shí)施例提供的詳細(xì)方法流程圖;圖5為本發(fā)明實(shí)施例提供的緩沖區(qū)単元示意圖;圖6為本發(fā)明實(shí)施例提供的裝置結(jié)構(gòu)圖。
具體實(shí)施例方式為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)描述。本發(fā)明提供的方法為了避免碼流發(fā)送過程中用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝,需要在內(nèi)核態(tài)設(shè)置一個(gè)驅(qū)動(dòng)設(shè)備。其中,該驅(qū)動(dòng)設(shè)備執(zhí)行的操作包括圖2所示的步驟步驟201,接收所述服務(wù)端的用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端ロ標(biāo)識(shí)創(chuàng)建套接字(Socket),設(shè)置與該Socket相關(guān)聯(lián)的流標(biāo)識(shí)(ID),并返回給用戶態(tài),以及,設(shè)置所述Socket為無效,以指示目前暫不向所述目的端發(fā)送數(shù)據(jù)。其中,所述用戶態(tài)發(fā)送創(chuàng)建流指令是在接收到目的端的創(chuàng)建流請求后發(fā)送至所述內(nèi)核態(tài)的,具體為用戶態(tài)接收到目的端發(fā)送的創(chuàng)建流(Setup Stream)請求;解析所述Setup Stream請求攜帶的目的端IP地址和目的端ロ標(biāo)識(shí),并通過創(chuàng)建流指令發(fā)送至內(nèi)核態(tài)。如此,內(nèi)核態(tài)的驅(qū)動(dòng)設(shè)備就接收到所述創(chuàng)建流指令。另外,本步驟201返回給用戶態(tài)流ID,目的是便于用戶態(tài)維護(hù)該流ID與上述的目的端IP地址和目的端ロ標(biāo)識(shí)之間的對(duì)應(yīng)關(guān)系,以便用戶態(tài)后續(xù)接收到來自目的端的啟動(dòng)流(Start Stream)請求后,依據(jù)該Start Stream請求的目的端IP地址和目的端ロ確認(rèn)對(duì)應(yīng)的流ID,并將該確認(rèn)的流ID攜帯在啟動(dòng)流指令中發(fā)送給內(nèi)核態(tài),由內(nèi)核態(tài)的驅(qū)動(dòng)設(shè)置執(zhí)行數(shù)據(jù)發(fā)送操作,具體見步驟202。步驟202,接收所述用戶態(tài)發(fā)送的啟動(dòng)流指令,根據(jù)所述啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,以指示目前允許向目的端發(fā)送數(shù)據(jù),并根據(jù)所述啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包,發(fā)送打包后的數(shù)據(jù)包至目的端。其中,用戶態(tài)發(fā)送啟動(dòng)流指令是在接收到目的端發(fā)送的Start Stream請求后執(zhí)行的。優(yōu)選地,本發(fā)明中,該啟動(dòng)流指令可為ioctr中用于請求碼流傳輸?shù)闹噶睢_€有,啟動(dòng)流指令中的流ID是由所述用戶態(tài)依據(jù)其維護(hù)的上述對(duì)應(yīng)關(guān)系和所述啟動(dòng)流請求中目的端IP地址和目的端ロ標(biāo)識(shí)來確定的。
另外,本發(fā)明中,當(dāng)需要停止發(fā)送數(shù)據(jù)至目的端時(shí),本發(fā)明中,可由用戶態(tài)向所述驅(qū)動(dòng)設(shè)備發(fā)送停止流指令,而當(dāng)驅(qū)動(dòng)設(shè)備接收所述用戶態(tài)發(fā)送的停止流指令時(shí),根據(jù)停止流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,設(shè)置該Socket的狀態(tài)為無效,以實(shí)現(xiàn)停止發(fā)送數(shù)據(jù)操作。從上面可以看出,本發(fā)明中,相比于現(xiàn)有技術(shù),用戶態(tài)和內(nèi)核態(tài)均作了以下改進(jìn)用戶態(tài)僅執(zhí)行以下圖3所示的兩種操作(1),為內(nèi)核態(tài)要發(fā)送的碼流設(shè)置打包格式;(2),向內(nèi)核態(tài)中的驅(qū)動(dòng)設(shè)備發(fā)送啟動(dòng)流指令,以保證碼流發(fā)送至目的端,以及向驅(qū)動(dòng)設(shè)備發(fā)送停止流指令,以取消發(fā)送碼流至目的端。而內(nèi)核態(tài)通過増加ー個(gè)驅(qū)動(dòng)設(shè)備,僅執(zhí)行以下圖3所示的兩種操作(1),根據(jù)用戶態(tài)告知的打包格式實(shí)現(xiàn)碼流的打包,包括打包成ES流、TS流、UDP流、TCP流等;(2),向目的端發(fā)送完成打包的數(shù)據(jù)包。其中,該發(fā)送可通過建立發(fā)送數(shù)據(jù)線程實(shí)現(xiàn),下文進(jìn)行具體描述。另外,在打包碼流之前,通常還需要執(zhí)行碼流的封裝,優(yōu)選地,本發(fā)明還可由內(nèi)核態(tài)的驅(qū)動(dòng)設(shè)備進(jìn)一歩執(zhí)行碼流封裝操作,具體如圖3所示。通過圖3所示的用戶態(tài)和內(nèi)核態(tài)執(zhí)行的操作,可以看出,本發(fā)明中,在碼流發(fā)送過程中,無需執(zhí)行用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝,這一方面減少了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝導(dǎo)致的系統(tǒng)開銷,另一方面避免了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝而導(dǎo)致內(nèi)存碎片產(chǎn)生加劇的缺陷。下面對(duì)本發(fā)明實(shí)施例提供的方法進(jìn)行描述參見圖4,圖4為本發(fā)明實(shí)施例提供的方法流程圖。在該流程中,以請求碼流的一端作為目的端A,而以發(fā)送碼流的一端作為服務(wù)端A。如圖4所示,該流程可包括以下步驟步驟401,服務(wù)端A在啟動(dòng)后打開在內(nèi)核態(tài)增加的驅(qū)動(dòng)設(shè)備,以使得所述驅(qū)動(dòng)設(shè)備處于可用狀態(tài)。優(yōu)選地,為保證驅(qū)動(dòng)設(shè)備可用,本步驟401在執(zhí)行打開驅(qū)動(dòng)設(shè)備之前,還需要執(zhí)行驅(qū)動(dòng)設(shè)備的注冊等操作,因與本發(fā)明關(guān)系不大,這里不具體詳述。步驟402,服務(wù)端A接收目的端發(fā)送的Setup Stream請求,解析所述Setup Stream中的目的端IP地址和目的端ロ標(biāo)識(shí),將解析到的目的端IP地址和目的端ロ標(biāo)識(shí)通過創(chuàng)建流指令從用戶態(tài)發(fā)送至內(nèi)核態(tài)。步驟403,內(nèi)核態(tài)的驅(qū)動(dòng)設(shè)備接收到所述創(chuàng)建流指令后,確定其維護(hù)的碼流發(fā)送信息表資源當(dāng)前是否存在足夠的可用資源來記錄針對(duì)目的端A的碼流發(fā)送信息表,如果是,執(zhí)行步驟404,否則,結(jié)束當(dāng)前流程。 本發(fā)明中,針對(duì)目的端A的碼流發(fā)送信息表主要包括源標(biāo)識(shí)和用于向目的端A發(fā)送碼流的信息。其中,所述源標(biāo)識(shí)表示當(dāng)前是否存在有效的碼流發(fā)送源,其取值為第一值比如I時(shí),表示有效,取值為第二值比如O時(shí),表示無效。至于用于向目的端A發(fā)送碼流的信息其在下文進(jìn)行舉例描述。本發(fā)明中,針對(duì)目的端A的碼流發(fā)送信息表通過以下結(jié)構(gòu)示出
typcdci' struct tag_KernclSrrcamDcIiverDstln ο
int ulSrcFlag; /*源、標(biāo)識(shí)字段,表示是否存在有效的碼流發(fā)送源*/
DRV IPV4 INFO S *pstDstAddr; /*用于向目的端A發(fā)送碼流的信息字段*/
} KERNEL SD DST S;以用于向所述目的端發(fā)送碼流的信息采用IP+P0RT結(jié)構(gòu)定義,且至少包括源IP地址、源端ロ標(biāo)識(shí)、目的端IP地址、目的端ロ標(biāo)識(shí)、流ID、以及Socket信息為例,則用于向目的端A發(fā)送碼流的信息可通過以下結(jié)構(gòu)示出
typedef struct tagDrvIpv4Info
{
bool bValid; /*碼流發(fā)送標(biāo)識(shí)字段,取值為值I比如O時(shí)表示無效,取植為值2 比如I時(shí)表示有效,在有效時(shí)可以進(jìn)行碼流發(fā)送,無效時(shí)不進(jìn)行碼流發(fā)送*/ int ulPaketType;I*數(shù)據(jù)色的打包格式字段*/
int stream ID;/* 流標(biāo)識(shí)字段 */
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中的可用資源可為空閑資源,也可為以下碼流發(fā)送表資源記錄了針對(duì)其他目的端的已過期碼流發(fā)送信息的資源。步驟404,內(nèi)核態(tài)的驅(qū)動(dòng)設(shè)備接收用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端ロ標(biāo)識(shí)創(chuàng)建Socket,并將創(chuàng)建的Socket信息記錄至步驟403所示碼流發(fā)送信息表結(jié)構(gòu)的sock字段,以便后續(xù)發(fā)送數(shù)據(jù)時(shí)使用。步驟405,所述驅(qū)動(dòng)設(shè)備設(shè)置與該Socket相關(guān)聯(lián)的流ID,保存該流ID至步驟403所示碼流發(fā)送信息表結(jié)構(gòu)的流標(biāo)識(shí)字段,將該流ID返回給用戶態(tài),以及,設(shè)置步驟403所示碼流發(fā)送信息表結(jié)構(gòu)的源標(biāo)識(shí)字段為有效,并設(shè)置Socket無效。本步驟405中,設(shè)置Socket無效,可通過設(shè)置步驟403所示碼流發(fā)送信息表結(jié)構(gòu)的碼流發(fā)送標(biāo)識(shí)字段無效來體現(xiàn),用于指示目前暫不向所述目的端發(fā)送數(shù)據(jù)。步驟406,用戶態(tài)接收內(nèi)核態(tài)針對(duì)目的端A返回的流ID,并維護(hù)該流ID與目的端A在發(fā)送上述Setup Stream請求時(shí)攜帶的目的端IP地址和目的端ロ標(biāo)識(shí)之間的對(duì)應(yīng)關(guān)系。步驟407,目的端A發(fā)送Start Stream請求至服務(wù)端。步驟408,服務(wù)端A接收到Start Stream請求后,通過解析該Start Stream請求攜帶的目的端IP地址和目的端ロ來從其維護(hù)的步驟406所示對(duì)應(yīng)關(guān)系中確定出對(duì)應(yīng)的流ID,將確定的流ID以及預(yù)先針對(duì)該目的端A設(shè)置的打包格式攜帯在啟動(dòng)流指令中從用戶態(tài) 發(fā)送給內(nèi)核態(tài)。步驟409,內(nèi)核態(tài)的驅(qū)動(dòng)設(shè)備接收到啟動(dòng)流指令后,根據(jù)啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,并記錄所述啟動(dòng)流指令中的打包格式至步驟403所示碼流發(fā)送信息表結(jié)構(gòu)的打包格式字段,以便對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端。本步驟409中,更新該Socket有效,可通過將步驟403所示碼流發(fā)送信息表結(jié)構(gòu)的碼流發(fā)送標(biāo)識(shí)字段設(shè)置為有效來體現(xiàn),以指示目前允許向目的端發(fā)送數(shù)據(jù)。本步驟409中,對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端包括建立數(shù)據(jù)發(fā)送線程;啟動(dòng)所述數(shù)據(jù)發(fā)送線程,觸發(fā)所述數(shù)據(jù)發(fā)送線程依照所述打包格式對(duì)預(yù)設(shè)的每ー緩存單元存放的碼流進(jìn)行數(shù)據(jù)包打包;將打包后的數(shù)據(jù)包發(fā)送至目的端。需要說明的時(shí),本發(fā)明中,為便于數(shù)據(jù)包打包,可在實(shí)際應(yīng)用中,根據(jù)本服務(wù)端A在和目的端A之間進(jìn)行碼流傳輸時(shí)經(jīng)常使用的數(shù)據(jù)包打包格式設(shè)置緩沖區(qū)單元,以使得緩沖區(qū)單元中預(yù)留了數(shù)據(jù)位置和與打包格式對(duì)應(yīng)的數(shù)據(jù)頭位置,其中,數(shù)據(jù)位置用于存放碼流。比如圖5示出了預(yù)留了數(shù)據(jù)位置和TS頭、ES頭作為數(shù)據(jù)頭的緩沖區(qū)単元?;诒景l(fā)明所提出的緩沖區(qū)単元,則上述依照打包格式對(duì)碼流進(jìn)行數(shù)據(jù)包打包具體為依次檢測預(yù)設(shè)的每一緩沖區(qū)単元的數(shù)據(jù)位置上是否有可發(fā)送的碼流,所述可發(fā)送的碼流為操作類型被標(biāo)識(shí)為讀操作的碼流;如果是,在該緩存単元的數(shù)據(jù)頭位置上填寫所述打包格式對(duì)應(yīng)的數(shù)據(jù)頭信息,將填寫后的數(shù)據(jù)頭和所述可發(fā)送的碼流一起作為打包后的數(shù)據(jù)包。至此,通過上面描述的步驟401至步驟409完成了內(nèi)核態(tài)直接發(fā)送數(shù)據(jù)至目的端的操作,無需執(zhí)行用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝,這減少了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝導(dǎo)致的系統(tǒng)開銷,也避免了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝而導(dǎo)致內(nèi)存碎片產(chǎn)生加劇的缺陷。以上對(duì)本發(fā)明實(shí)施例提供的方法進(jìn)行了描述,下面對(duì)本發(fā)明實(shí)施例提供的裝置進(jìn)行描述。
參見圖6,圖6為本發(fā)明實(shí)施例提供的裝置結(jié)構(gòu)圖。這里,本發(fā)明提供的裝置為上面描述的驅(qū)動(dòng)設(shè)備,如上所述,該驅(qū)動(dòng)設(shè)備被設(shè)置在服務(wù)端的內(nèi)核態(tài),如圖6所示,該驅(qū)動(dòng)設(shè)備包括創(chuàng)建流處理單元,用于接收所述服務(wù)端的用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端ロ標(biāo)識(shí)創(chuàng)建套接字Socket,設(shè)置所述Socket為無效,以指示目前暫不向所述目的端發(fā)送數(shù)據(jù),并設(shè)置與該Socket相關(guān)聯(lián)的流標(biāo)識(shí)ID,返回給用戶態(tài)維護(hù);發(fā)送流處理單元,用于接收所述用戶態(tài)發(fā)送的啟動(dòng)流指令,根據(jù)所述啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,以指示目前允許向目的端發(fā)送數(shù)據(jù),井根據(jù)所述啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端。優(yōu)選地,所述創(chuàng)建流指令是所述用戶態(tài)是在接收到目的端的創(chuàng)建流請求后發(fā)送至所述內(nèi)核態(tài)的; 而所述啟動(dòng)流指令是在所述用戶態(tài)接收到目的端的啟動(dòng)流請求后發(fā)送至所述內(nèi)核態(tài)的,所述啟動(dòng)流指令中的流ID是由所述用戶態(tài)依據(jù)其維護(hù)的流ID與目的端IP地址和目的端ロ標(biāo)識(shí)之間的對(duì)應(yīng)關(guān)系,以及所述啟動(dòng)流請求中目的端IP地址和目的端ロ標(biāo)識(shí)來確定的;其中,所述對(duì)應(yīng)關(guān)系是在所述用戶態(tài)接收所述驅(qū)動(dòng)設(shè)備返回的流ID后維護(hù)的。如圖6所示,所述驅(qū)動(dòng)設(shè)備進(jìn)ー步包括停止流處理單元,用于接收所述用戶態(tài)發(fā)送的停止流指令,根據(jù)停止流指令中的流ID找到與該流ID相關(guān)聯(lián)的Socket,設(shè)置該Socket的狀態(tài)為無效,以實(shí)現(xiàn)停止發(fā)送數(shù)據(jù)操作。本發(fā)明中,所述發(fā)送流處理單元通過以下步驟實(shí)現(xiàn)根據(jù)啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端建立數(shù)據(jù)發(fā)送線程;啟動(dòng)所述數(shù)據(jù)發(fā)送線程,觸發(fā)所述數(shù)據(jù)發(fā)送線程依照所述打包格式對(duì)預(yù)設(shè)的每ー緩存單元存放的碼流進(jìn)行數(shù)據(jù)包打包;將打包后的數(shù)據(jù)包發(fā)送至目的端。優(yōu)選地,所述緩沖區(qū)単元中預(yù)留了數(shù)據(jù)位置和與打包格式對(duì)應(yīng)的數(shù)據(jù)頭位置,其中,所述數(shù)據(jù)位置存放碼流。則基于此,所述依照打包格式對(duì)可發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包具體為依次檢測預(yù)設(shè)的每一緩沖區(qū)単元的數(shù)據(jù)位置上是否有可發(fā)送的碼流,所述可發(fā)送的碼流為操作類型被標(biāo)識(shí)為讀操作的碼流;如果是,在該緩存単元的數(shù)據(jù)頭位置上填寫所述打包格式對(duì)應(yīng)的數(shù)據(jù)頭信息,將填寫后的數(shù)據(jù)頭和所述可發(fā)送的碼流一起作為打包后的數(shù)據(jù)包。至此,完成本發(fā)明提供的裝置描述。由以上技術(shù)方案可以看出,本發(fā)明中,在服務(wù)端的內(nèi)核態(tài)增加一個(gè)驅(qū)動(dòng)設(shè)備,由該驅(qū)動(dòng)設(shè)備根據(jù)用戶態(tài)告知的數(shù)據(jù)包打包格式進(jìn)行碼流的數(shù)據(jù)包打包和發(fā)送,無需執(zhí)行用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝,這一方面減少了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝導(dǎo)致的系統(tǒng)開銷,另一方面避免了由于用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝而導(dǎo)致內(nèi)存碎片產(chǎn)生加劇的缺陷。本申請發(fā)明人做了以下測試按照現(xiàn)有技術(shù)假如啟動(dòng)3路1080P 30幀SM的碼流,則會(huì)導(dǎo)致cpu使用率接近100%,而執(zhí)行本發(fā)明,仍然啟動(dòng)上述三路1080P 30幀8M的碼流,則由于內(nèi)核態(tài)的驅(qū)動(dòng)設(shè)備直接根據(jù)用戶態(tài)告知的數(shù)據(jù)包打包格式進(jìn)行碼流的數(shù)據(jù)包打包和發(fā)送,無需執(zhí)行用戶態(tài)至內(nèi)核態(tài)的數(shù)據(jù)拷貝,則會(huì)導(dǎo)致CPU的使用率還有30%左右的剰余,這顯然證明了 CPU的利用率高,降低系統(tǒng)開銷;還有,本發(fā)明中,通過上述預(yù)留了數(shù)據(jù)頭的緩沖區(qū),能夠減少數(shù)據(jù)打包時(shí)間,進(jìn)而降低系統(tǒng)性能開銷。 以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
權(quán)利要求
1.ー種碼流發(fā)送方法,其特征在于,該方法中,在服務(wù)端的內(nèi)核態(tài)增加一個(gè)驅(qū)動(dòng)設(shè)備,該驅(qū)動(dòng)設(shè)備執(zhí)行以下操作 接收所述服務(wù)端的用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端ロ標(biāo)識(shí)創(chuàng)建套接字Socket,設(shè)置所述Socket為無效,以指示目前暫不向所述目的端發(fā)送數(shù)據(jù),并設(shè)置與該Socket相關(guān)聯(lián)的流標(biāo)識(shí)ID,返回給用戶態(tài)維護(hù); 接收所述用戶態(tài)發(fā)送的啟動(dòng)流指令,根據(jù)所述啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,以指示目前允許向目的端發(fā)送數(shù)據(jù),井根據(jù)所述啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述創(chuàng)建流指令是所述用戶態(tài)在接收到目的端的創(chuàng)建流請求后發(fā)送至所述內(nèi)核態(tài)的; 所述用戶態(tài)維護(hù)所述流ID包括建立并維護(hù)所述流ID與所述目的端IP地址和目的端ロ標(biāo)識(shí)三者之間的對(duì)應(yīng)關(guān)系; 所述啟動(dòng)流指令是所述用戶態(tài)在接收到目的端的啟動(dòng)流請求后發(fā)送至所述內(nèi)核態(tài)的,所述啟動(dòng)流指令中的流ID是由所述用戶態(tài)依據(jù)其維護(hù)的所述對(duì)應(yīng)關(guān)系和所述啟動(dòng)流請求中目的端IP地址和目的端ロ標(biāo)識(shí)來確定的。
3.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述驅(qū)動(dòng)設(shè)備進(jìn)一步執(zhí)行以下操作 接收所述用戶態(tài)發(fā)送的停止流指令,根據(jù)停止流指令中的流ID找到與該流ID相關(guān)聯(lián)的Socket,設(shè)置該Socket的狀態(tài)為無效,以實(shí)現(xiàn)停止發(fā)送數(shù)據(jù)操作。
4.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述根據(jù)啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端包括 建立數(shù)據(jù)發(fā)送線程; 啟動(dòng)所述數(shù)據(jù)發(fā)送線程,觸發(fā)所述數(shù)據(jù)發(fā)送線程依照所述打包格式對(duì)預(yù)設(shè)的每ー緩存單元存放的碼流進(jìn)行數(shù)據(jù)包打包; 將打包后的數(shù)據(jù)包發(fā)送至目的端。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述緩沖區(qū)単元中預(yù)留了數(shù)據(jù)位置和與打包格式對(duì)應(yīng)的數(shù)據(jù)頭位置,所述數(shù)據(jù)位置存放碼流; 所述依照打包格式對(duì)預(yù)設(shè)的緩存單元存放的碼流進(jìn)行數(shù)據(jù)包打包具體為 依次檢測預(yù)設(shè)的每一緩沖區(qū)単元的數(shù)據(jù)位置上是否有可發(fā)送的碼流,所述可發(fā)送的碼流為操作類型被標(biāo)識(shí)為讀操作的碼流; 如果是, 在該緩存単元的數(shù)據(jù)頭位置上填寫所述打包格式對(duì)應(yīng)的數(shù)據(jù)頭信息,將填寫后的數(shù)據(jù)頭和所述可發(fā)送的碼流一起作為打包后的數(shù)據(jù)包。
6.ー種應(yīng)用于碼流發(fā)送方法中的驅(qū)動(dòng)設(shè)備,其特征在干,驅(qū)動(dòng)設(shè)備被設(shè)置在服務(wù)端的內(nèi)核態(tài),該驅(qū)動(dòng)設(shè)備包括 創(chuàng)建流處理單元,用于接收所述服務(wù)端的用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端ロ標(biāo)識(shí)創(chuàng)建套接字Socket,設(shè)置所述Socket為無效,以指示目前暫不向所述目的端發(fā)送數(shù)據(jù),并設(shè)置與該Socket相關(guān)聯(lián)的流標(biāo)識(shí)ID,返回給用戶態(tài)維護(hù); 發(fā)送流處理單元,用于接收所述用戶態(tài)發(fā)送的啟動(dòng)流指令,根據(jù)所述啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,以指示目前允許向目的端發(fā)送數(shù)據(jù),并根據(jù)所述啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端。
7.根據(jù)權(quán)利要求6所述的驅(qū)動(dòng)設(shè)備,其特征在于,所述創(chuàng)建流指令是所述用戶態(tài)在接收到目的端的創(chuàng)建流請求后發(fā)送至所述內(nèi)核態(tài)的; 所述啟動(dòng)流指令是所述用戶態(tài)在接收到目的端的啟動(dòng)流請求后發(fā)送至所述內(nèi)核態(tài)的,所述啟動(dòng)流指令中的流ID是由所述用戶態(tài)依據(jù)其維護(hù)的流ID與目的端IP地址和目的端ロ標(biāo)識(shí)之間的對(duì)應(yīng)關(guān)系,以及所述啟動(dòng)流請求中目的端IP地址和目的端ロ標(biāo)識(shí)來確定的;其中,所述對(duì)應(yīng)關(guān)系是在所述用戶態(tài)接收所述驅(qū)動(dòng)設(shè)備返回的流ID后維護(hù)的。
8.根據(jù)權(quán)利要求6所述的驅(qū)動(dòng)設(shè)備,其特征在于,所述驅(qū)動(dòng)設(shè)備進(jìn)一歩包括停止流處理單元,用于接收所述用戶態(tài)發(fā)送的停止流指令,根據(jù)停止流指令中的流ID找到與該流ID相關(guān)聯(lián)的Socket,設(shè)置該Socket的狀態(tài)為無效,以實(shí)現(xiàn)停止發(fā)送數(shù)據(jù)操作。
9.根據(jù)權(quán)利要求6所述的驅(qū)動(dòng)設(shè)備,其特征在于,所述發(fā)送流處理單元通過以下步驟實(shí)現(xiàn)根據(jù)啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端 建立數(shù)據(jù)發(fā)送線程; 啟動(dòng)所述數(shù)據(jù)發(fā)送線程,觸發(fā)所述數(shù)據(jù)發(fā)送線程依照所述打包格式對(duì)預(yù)設(shè)的每ー緩存單元存放的碼流進(jìn)行數(shù)據(jù)包打包; 將打包后的數(shù)據(jù)包發(fā)送至目的端。
10.根據(jù)權(quán)利要求9所述的驅(qū)動(dòng)設(shè)備,其特征在于,所述緩沖區(qū)単元中預(yù)留了數(shù)據(jù)位置和與打包格式對(duì)應(yīng)的數(shù)據(jù)頭位置,所述數(shù)據(jù)位置存放碼流; 所述依照打包格式對(duì)可發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包具體為 依次檢測預(yù)設(shè)的每一緩沖區(qū)単元的數(shù)據(jù)位置上是否有可發(fā)送的碼流,所述可發(fā)送的碼流為操作類型被標(biāo)識(shí)為讀操作的碼流; 如果是, 在該緩存単元的數(shù)據(jù)頭位置上填寫所述打包格式對(duì)應(yīng)的數(shù)據(jù)頭信息,將填寫后的數(shù)據(jù)頭和所述可發(fā)送的碼流一起作為打包后的數(shù)據(jù)包。
全文摘要
本發(fā)明提供了碼流發(fā)送方法和裝置。該方法中,在服務(wù)端的內(nèi)核態(tài)增加一個(gè)驅(qū)動(dòng)設(shè)備,該驅(qū)動(dòng)設(shè)備執(zhí)行以下操作接收所述服務(wù)端的用戶態(tài)發(fā)送的創(chuàng)建流指令,根據(jù)所述創(chuàng)建流指令中的目的端IP地址和目的端口標(biāo)識(shí)創(chuàng)建套接字Socket,設(shè)置與該Socket相關(guān)聯(lián)的流標(biāo)識(shí)ID,并返回給用戶態(tài),以及,設(shè)置所述Socket為無效,以指示目前暫不向所述目的端發(fā)送數(shù)據(jù);接收所述用戶態(tài)發(fā)送的啟動(dòng)流指令,根據(jù)所述啟動(dòng)流指令中的流ID找到該流ID相關(guān)聯(lián)的Socket,更新該Socket為有效,以指示目前允許向目的端發(fā)送數(shù)據(jù),并根據(jù)所述啟動(dòng)流指令中的打包格式對(duì)待發(fā)送的碼流進(jìn)行數(shù)據(jù)包打包并發(fā)送至目的端。
文檔編號(hào)H04N7/24GK102695049SQ20121014205
公開日2012年9月26日 申請日期2012年5月9日 優(yōu)先權(quán)日2012年5月9日
發(fā)明者成寶紅 申請人:浙江宇視科技有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
贞丰县| 志丹县| 阿克陶县| 中宁县| 桐梓县| 当阳市| 内江市| 宣武区| 伊金霍洛旗| 旬邑县| 大连市| 台前县| 威远县| 温宿县| 锡林浩特市| 贵港市| 商南县| 定结县| 石棉县| 加查县| 蕉岭县| 衡山县| 宜丰县| 澳门| 湟源县| 安陆市| 新建县| 陵川县| 宁武县| 濉溪县| 大厂| 皋兰县| 西充县| 将乐县| 台东市| 龙陵县| 涟水县| 永登县| 丰宁| 海口市| 常山县|