本發(fā)明涉及通訊技術(shù)領(lǐng)域,尤其涉及一種使用FFMPEG接口錄制直播網(wǎng)站視頻的方法及裝置。
背景技術(shù):
目前的直播網(wǎng)站都是使用的rtmp或http協(xié)議傳遞h264編碼視頻流,F(xiàn)FMPEG提供的exe是可以直接下載這些直播網(wǎng)站的音視頻文件的。
然而,發(fā)明人員通過(guò)研究發(fā)現(xiàn),這種FFMPEG提供的exe是直接下載這些直播網(wǎng)站的音視頻文件至少存在如下問(wèn)題:在視頻錄制的過(guò)程中,視頻開(kāi)始的部分容易出現(xiàn)花屏。
可見(jiàn),現(xiàn)有技術(shù)中的直播網(wǎng)站進(jìn)行視頻錄制時(shí),存在視頻開(kāi)始的部分容易出現(xiàn)花屏的技術(shù)問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種使用FFMPEG接口錄制直播網(wǎng)站視頻的方法及裝置,用以解決現(xiàn)有技術(shù)中的直播網(wǎng)站進(jìn)行視頻錄制時(shí),存在的視頻開(kāi)始的部分容易出現(xiàn)花屏的技術(shù)問(wèn)題。
第一方面,本發(fā)明提供了一種使用FFMPEG接口錄制直播網(wǎng)站視頻的方法,所述方法包括:
獲得所述直播間的流地址;其中,所述流地址包括視頻流地址;
根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息,其中所述流信息中包括N個(gè)幀,N為正整數(shù);
根據(jù)所述流信息創(chuàng)建本地FLV文件;
根據(jù)所述N個(gè)幀,獲得第一幀;
判斷所述第一幀是否為視頻關(guān)鍵幀;
當(dāng)所述第一視頻幀為視頻關(guān)鍵幀時(shí),將所述第一視頻幀確定為錄制開(kāi)始點(diǎn);
將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,其中M小于N,且M為正整數(shù)。
可選的,所述根據(jù)所述流信息創(chuàng)建本地FLV文件,還包括:創(chuàng)建FLV文件的文件頭;所述將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,還包括:將所述第一視頻幀進(jìn)行數(shù)據(jù)處理后,從所述文件頭處開(kāi)始寫入所述經(jīng)處理的所述第一視頻幀。
可選的,所述根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息,還包括:通過(guò)av_read_frame函數(shù)獲得所述流信息,且所述流信息為AVPacket結(jié)構(gòu);其中,所述方法還包括:判斷所述av_read_frame的返回值是否等于AVERROR;當(dāng)所述av_read_frame的返回值等于AVERROR時(shí),才結(jié)束錄制。
可選的,所述判斷所述第一幀是否為視頻關(guān)鍵幀,還包括:判斷所述第一幀是否為IDR幀;如是,則判斷所述第一幀為視頻關(guān)鍵幀。
可選的,所述將所述第一視頻幀確定為錄制開(kāi)始點(diǎn)時(shí),所述方法還包括:獲得所述第一視頻幀的第一時(shí)間戳;所述將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,還包括:獲得所述M個(gè)視頻幀中的第二視頻幀的第二時(shí)間戳;根據(jù)所述第一時(shí)間戳和所述第二時(shí)間戳獲得第三時(shí)間戳;將所述第二視頻幀的第二時(shí)間戳更改為所述第三時(shí)間戳后,寫入所述本地FLV文件中。
可選的,在所述判斷所述第一幀是否為視頻關(guān)鍵幀之前,還包括:獲得所述第一幀的數(shù)據(jù)類型;當(dāng)所述第一幀是視頻幀時(shí),則判斷所述第一幀是否為視頻關(guān)鍵幀;當(dāng)所述第一幀是音頻幀時(shí),則忽略所述第一幀。
第二方面,本發(fā)明提供了一種使用FFMPEG接口錄制直播網(wǎng)站視頻的裝置,所述裝置包括:
第一獲得單元,所述第一獲得單元用于獲得所述直播間的流地址;其中,所述流地址包括視頻流地址;
第二獲得單元,所述第二獲得單元用于根據(jù)所述視頻流地址獲得所述直播間直播過(guò)程中的流信息,其中所述流信息中包括N個(gè)幀,N為正整數(shù);
第一創(chuàng)建單元,所述第一創(chuàng)建單元用于根據(jù)所述流信息創(chuàng)建本地FLV文件;
第三獲得單元,所述第三獲得單元用于根據(jù)所述N個(gè)幀,獲得第一幀;
第一判斷單元,所述第一判斷單元用于判斷所述第一幀是否為視頻關(guān)鍵幀;
第一確定單元,所述第一確定單元用于當(dāng)所述第一視頻幀為視頻關(guān)鍵幀時(shí),將所述第一視頻幀確定為錄制開(kāi)始點(diǎn);
第一寫入單元,所述第一寫入單元用于將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,其中M小于N,且M為正整數(shù)。
可選的,所述裝置還包括:第二創(chuàng)建單元,所述第二創(chuàng)建單元用于創(chuàng)建FLV文件的文件頭;第二寫入單元,所述第二寫入單元用于所述將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,還包括:第三寫入單元,所述第三寫入單元用于將所述第一視頻幀進(jìn)行數(shù)據(jù)處理后,從所述文件頭處開(kāi)始寫入所述經(jīng)處理的所述第一視頻幀。
可選的,所述裝置還包括:第四獲得單元,所述第四獲得單元用于通過(guò)av_read_frame函數(shù)獲得所述流信息,且所述流信息為AVPacket結(jié)構(gòu);第二判斷單元,所述第二判斷單元用于判斷所述av_read_frame的返回值是否等于AVERROR;第一結(jié)束單元,所述第一結(jié)束單元用于當(dāng)所述av_read_frame的返回值等于AVERROR時(shí),才結(jié)束錄制。
可選的,所述裝置還包括:第三判斷單元,所述第三判斷單元用于判斷所述第一幀是否為IDR幀;第四判斷單元,所述第四判斷單元用于如是,則判斷所述第一幀為視頻關(guān)鍵幀。
可選的,所述裝置還包括::第五獲得單元,所述第五獲得單元用于獲得所述第一視頻幀的第一時(shí)間戳;第六獲得單元,所述第六獲得單元用于獲得所述M個(gè)視頻幀中的第二視頻幀的第二時(shí)間戳;第七獲得單元,所述第七獲得單元用于根據(jù)所述第一時(shí)間戳和所述第二時(shí)間戳獲得第三時(shí)間戳;第四寫入單元,所述第四寫入單元用于將所述第二視頻幀的第二時(shí)間戳更改為所述第三時(shí)間戳后,寫入所述本地FLV文件中。
本發(fā)明實(shí)施例中的上述一個(gè)或多個(gè)技術(shù)方案,至少具有如下一種或多種技術(shù)效果:
在本發(fā)明實(shí)施例提供的方法及裝置,在對(duì)直播網(wǎng)站的視頻進(jìn)行錄制時(shí),通過(guò)依據(jù)直播間直播過(guò)程中的流信息中N個(gè)幀,獲得第一幀,并判斷所述第一幀是否為視頻關(guān)鍵幀,如果所述第一視頻幀判斷為視頻關(guān)鍵幀時(shí),則將所述第一視頻幀確定為錄制開(kāi)始點(diǎn),以此使得所錄制的視頻在播放的時(shí)候不會(huì)出現(xiàn)花屏的現(xiàn)象??梢?jiàn),本發(fā)明實(shí)施例解決了現(xiàn)有技術(shù)中的直播網(wǎng)站進(jìn)行視頻錄制時(shí),存在的視頻開(kāi)始的部分容易出現(xiàn)花屏的技術(shù)問(wèn)題。
上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說(shuō)明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例的使用FFMPEG接口錄制直播網(wǎng)站視頻的方法流程圖;以及
圖2為本發(fā)明實(shí)施例中將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理的方法示意圖;以及
圖3為本發(fā)明實(shí)施例中使用FFMPEG接口錄制直播網(wǎng)站視頻的裝置示意圖。
具體實(shí)施方式
本發(fā)明實(shí)施例提供了一種使用FFMPEG接口錄制直播網(wǎng)站視頻的方法及裝置,解決了現(xiàn)有技術(shù)中的直播網(wǎng)站進(jìn)行視頻錄制時(shí),存在的視頻開(kāi)始的部分極易花屏的技術(shù)問(wèn)題。
本發(fā)明實(shí)施例中的技術(shù)方案,總體思路如下:
在對(duì)直播網(wǎng)站進(jìn)行視頻錄制時(shí),首先獲得所述直播間的流地址;其中,所述流地址包括視頻流地址;根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息,其中所述流信息中包括N個(gè)幀,N為正整數(shù);根據(jù)所述流信息創(chuàng)建本地FLV文件;根據(jù)所述N個(gè)幀,獲得第一幀;判斷所述第一幀是否為視頻關(guān)鍵幀;當(dāng)所述第一視頻幀為視頻關(guān)鍵幀時(shí),將所述第一視頻幀確定為錄制開(kāi)始點(diǎn);將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,其中M小于N,且M為正整數(shù)。
上述方法通過(guò)依據(jù)直播間直播過(guò)程中的流信息中N個(gè)幀,獲得第一幀,并判斷所述第一幀是否為視頻關(guān)鍵幀,如果所述第一視頻幀判斷為視頻關(guān)鍵幀時(shí),則將所述第一視頻幀確定為錄制開(kāi)始點(diǎn),以此使得所錄制的視頻在播放的時(shí)候不會(huì)出現(xiàn)花屏的現(xiàn)象。
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
實(shí)施例一
本實(shí)施例提供的一種使用FFMPEG接口錄制直播網(wǎng)站視頻的方法,請(qǐng)參閱圖1,所述方法包括:
步驟S110,獲得所述直播間的流地址;其中,所述流地址包括視頻流地址;
步驟S120,根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息,其中所述流信息中包括N個(gè)幀,N為正整數(shù);
步驟S130,根據(jù)所述流信息創(chuàng)建本地FLV文件;
步驟S140,根據(jù)所述N個(gè)幀,獲得第一幀;
步驟S150,判斷所述第一幀是否為視頻關(guān)鍵幀;
步驟S160,當(dāng)所述第一視頻幀為視頻關(guān)鍵幀時(shí),將所述第一視頻幀確定為錄制開(kāi)始點(diǎn);
步驟S170,將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,其中M小于N,且M為正整數(shù)。
具體來(lái)講,現(xiàn)有技術(shù)中直播網(wǎng)站都是使用的rtmp或http協(xié)議傳遞h264編碼視頻流,F(xiàn)FMPEG提供的exe是可以直接下載這些直播網(wǎng)站的音視頻文件的。但是,經(jīng)發(fā)明人研究發(fā)現(xiàn),這種方式至少存在視頻開(kāi)始的部分容易出現(xiàn)花屏?;诖?,本發(fā)明實(shí)施例提供的方法用于解決在視頻開(kāi)始的部分容易出現(xiàn)花屏的技術(shù)問(wèn)題。
在本申請(qǐng)實(shí)施例中,為了對(duì)本申請(qǐng)所公開(kāi)的技術(shù)方案進(jìn)行詳細(xì)的介紹,以達(dá)到清楚、明白的目的,特針對(duì)所涉及的名詞解釋如下:
FFMPEG,是一個(gè)開(kāi)源免費(fèi)跨平臺(tái)的視頻和音頻流方案,屬于自由軟件,采用LGPL或GPL許可證(依據(jù)用戶選擇的組件)。FFMPEG提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。FFMPEG包含了非常先進(jìn)的音頻/視頻編解碼庫(kù)libavcodec,為了保證高可移植性和編解碼質(zhì)量,F(xiàn)FMPEG里面里很多代碼都是從頭開(kāi)發(fā)的。在本發(fā)明實(shí)施例中即是基于FFMPEG進(jìn)行視頻流的獲取,以及音視頻文件的寫入。
H.264,是國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電信聯(lián)盟(ITU)共同提出的繼MPEG4之后的新一代數(shù)字視頻壓縮格式。H.264是ITU-T以H.26x系列為名稱命名的視頻編解碼技術(shù)標(biāo)準(zhǔn)之一。H.264是ITU-T的VCEG(視頻編碼專家組)和ISO/IEC的MPEG(活動(dòng)圖像編碼專家組)的聯(lián)合視頻組(JVT:joint video team)開(kāi)發(fā)的一個(gè)數(shù)字視頻編碼標(biāo)準(zhǔn)。H.264最大的優(yōu)勢(shì)是具有很高的數(shù)據(jù)壓縮比率,H.264在具有高壓縮比的同時(shí)還擁有高質(zhì)量流暢的圖像,正因?yàn)槿绱?,?jīng)過(guò)H.264壓縮的視頻數(shù)據(jù),在網(wǎng)絡(luò)傳輸過(guò)程中所需要的帶寬更少,也更加經(jīng)濟(jì)。在本發(fā)明實(shí)施例中即是基于到對(duì)h264的格式解析。
FLV,是Flash Video的首字母縮寫,F(xiàn)lash Video流媒體格式是隨著Flash MX的推出而發(fā)展而來(lái)的一種新興的視頻格式。FLV是被眾多新一代視頻分享網(wǎng)站所采用,是目前增長(zhǎng)最快、最為廣泛的視頻傳播格式。
RTMP,是Real Time Messaging Protocol(實(shí)時(shí)消息傳輸協(xié)議)的首字母縮寫。該協(xié)議基于TCP,是一個(gè)協(xié)議族,包括RTMP基本協(xié)議及RTMPT/RTMPS/RTMPE等多種變種。RTMP是一種設(shè)計(jì)用來(lái)進(jìn)行實(shí)時(shí)數(shù)據(jù)通信的網(wǎng)絡(luò)協(xié)議,主要用來(lái)在Flash/AIR平臺(tái)和支持RTMP協(xié)議的流媒體/交互服務(wù)器之間進(jìn)行音視頻和數(shù)據(jù)通信。RTMP協(xié)議(Real Time Messaging Protocol)是被Flash用于對(duì)象,視頻,音頻的傳輸。這個(gè)協(xié)議建立在TCP協(xié)議或者輪詢HTTP協(xié)議之上。RTMP協(xié)議可以理解為是一個(gè)用來(lái)裝數(shù)據(jù)包的容器,這些數(shù)據(jù)既可以是AMF格式的數(shù)據(jù),也可以是FLV中的視/音頻數(shù)據(jù)。
下面,結(jié)合圖1對(duì)本申請(qǐng)?zhí)峁┑氖褂肍FMPEG接口錄制直播網(wǎng)站視頻的方法進(jìn)行詳細(xì)介紹:
首先,執(zhí)行步驟S110,獲得所述直播間的流地址;其中,所述流地址包括視頻流地址;
具體而言,在對(duì)直播網(wǎng)站上正在開(kāi)播的直播間視頻進(jìn)行錄制時(shí),首先需要獲取對(duì)應(yīng)直播間的流地址,而對(duì)于流地址的獲取方式可以是多種多樣的,本發(fā)明實(shí)施例并不局限,比如可以是通過(guò)向網(wǎng)站服務(wù)器提供房間號(hào)查詢獲取,也可以是通過(guò)輸入直播間的直播名稱查詢獲取。
接下來(lái),執(zhí)行步驟S120,根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息,其中所述流信息中包括N個(gè)幀,N為正整數(shù);
具體而言,對(duì)于直播間直播過(guò)程中的流信息的獲得,可以是使用av_read_frame函數(shù),從avformat_open_input函數(shù)打開(kāi)的AVFormatContext結(jié)構(gòu)上下文中獲取的音視頻流,且該音視頻數(shù)據(jù)為AVPacket結(jié)構(gòu)。
在這里,avformat_open_input函數(shù)是用來(lái)打開(kāi)一個(gè)輸入文件或者音視頻流,返回AVFormatContext結(jié)構(gòu)的上下文,在本申請(qǐng)中是用來(lái)打開(kāi)直播網(wǎng)站的實(shí)時(shí)音視頻流。AVFormatContext結(jié)構(gòu)是用來(lái)表示一個(gè)輸入或者輸出文件的上下文,AVFormatContext是FFMPEG格式轉(zhuǎn)換過(guò)程中實(shí)現(xiàn)輸入和輸出功能、保存相關(guān)數(shù)據(jù)的主要結(jié)構(gòu)。AVPacket是存儲(chǔ)壓縮編碼數(shù)據(jù)相關(guān)信息的結(jié)構(gòu)體,AVPacket一般是一幀完整的音視頻編解碼數(shù)據(jù),對(duì)于H.264來(lái)說(shuō),1個(gè)AVPacket的data通常對(duì)應(yīng)一個(gè)NAL。av_read_frame函數(shù)是用來(lái)從輸入文件即AVFormatContext結(jié)構(gòu)的上下文中獲取音視頻流數(shù)據(jù),獲取的音視頻數(shù)據(jù),一般是編碼過(guò)的,因?yàn)閔264高壓縮比少帶寬以及廣泛性,目前直播網(wǎng)站一般都是使用的h264的視頻編碼,從數(shù)據(jù)流讀出的數(shù)據(jù)是保存在AVPacket結(jié)構(gòu)里的。
需要說(shuō)明的是,在根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息的過(guò)程中,為了避免視頻文件被輕易打斷,造成斷流比較頻繁以至于常常遺失掉精彩的瞬間畫面的技術(shù)問(wèn)題,優(yōu)選的,本發(fā)明實(shí)施例還包括:判斷所述av_read_frame的返回值是否等于AVERROR;當(dāng)所述av_read_frame的返回值等于AVERROR時(shí),才結(jié)束錄制。也即,對(duì)av_read_frame的返回值只有在等于AVERROR(EAGAIN)的時(shí)候,才結(jié)束錄制。這種容錯(cuò)處理不會(huì)導(dǎo)致本發(fā)明實(shí)施例所提供的方法在視頻錄制的過(guò)程中被頻繁打斷,而錯(cuò)過(guò)一些重要的時(shí)刻,實(shí)現(xiàn)所錄制的視頻具有連續(xù)順暢的特點(diǎn)。
當(dāng)然,在執(zhí)行步驟S120之前,或者之后,或者同時(shí),可以執(zhí)行步驟S130,根據(jù)所述流信息創(chuàng)建本地FLV文件;
其中,在該步驟S130中具體可以通過(guò)avformat_open_input函數(shù)根據(jù)步驟S110獲得的直播間流地址打開(kāi)直播間流,并通過(guò)AVFormatContext結(jié)構(gòu)的對(duì)象保存直播間的流信息,利用輸入文件的流信息使用avformat_alloc_output_context2函數(shù)創(chuàng)建本地flv文件,并使用avformat_write_header函數(shù)寫入flv文件的文件頭。
在這里,avformat_alloc_output_context2函數(shù)是用來(lái)創(chuàng)建一個(gè)輸出文件,得到該輸出文件的AVFormatContext結(jié)構(gòu)的上下文,在本發(fā)明實(shí)施例中輸出文件為本地flv錄制文件。avformat_write_header函數(shù)是用來(lái)往輸出文件寫入該音視頻流的頭信息,包含音視頻編解碼信息,以及文件大小等。
然后,執(zhí)行步驟S140,根據(jù)所述N個(gè)幀,獲得第一幀;
以及,執(zhí)行步驟S150,判斷所述第一幀是否為視頻關(guān)鍵幀;
具體而言,本申請(qǐng)實(shí)施例是針對(duì)直播網(wǎng)站的視頻信息進(jìn)行錄制,所要解決的技術(shù)問(wèn)題也是解決在視頻錄制過(guò)程中,視頻開(kāi)始的部分極易花屏的技術(shù)問(wèn)題。因此,在流信息中所包括的N個(gè)幀中,首先要確認(rèn)基于所述N個(gè)幀,所獲得第一幀是否是視頻幀,如果是視頻幀,則繼續(xù)下一步驟。如果不是(如是音頻幀),則直接忽略(這里的忽略也即pass掉的意思),并重新繼續(xù)獲取上述的流信息。
這里,對(duì)于判斷基于所述N個(gè)幀,所獲得第一幀是否是視頻幀,可以是通過(guò)如下方法判斷。即,在解析流信息的時(shí)候,先獲取視頻音頻的stream的id,然后在讀幀的時(shí)候,使用幀的stream id進(jìn)行比較進(jìn)行判斷。
緊接著,在判斷完第一幀是視頻幀之后,在繼續(xù)執(zhí)行步驟S150,也即判斷所述第一幀是否為視頻關(guān)鍵幀??梢园ㄈ缦虏襟E:判斷所述第一幀是否為IDR幀;如是,則判斷所述第一幀為視頻關(guān)鍵幀。
具體而言,可以基于當(dāng)前的流信息的視頻壓縮格式是h264,從h264視頻幀獲取nalu類型值,nalu&0x1f為5則表示該幀即為IDR幀,也即視頻關(guān)鍵幀。而當(dāng)判斷所述第一幀不是視頻關(guān)鍵幀時(shí),則放棄該第一視頻幀,并重新繼續(xù)獲取上述的流信息。
如果判斷所述第一幀是視頻關(guān)鍵幀時(shí),則繼續(xù)執(zhí)行步驟S160,當(dāng)所述第一視頻幀為視頻關(guān)鍵幀時(shí),將所述第一視頻幀確定為錄制開(kāi)始點(diǎn);也正因如此,使得通過(guò)本發(fā)明實(shí)施例在直播網(wǎng)上中進(jìn)行視頻錄制時(shí),能夠確定錄制文件的第一幀視頻幀是關(guān)鍵幀,這就使得本地錄制的視頻文件在開(kāi)始播放的時(shí)候不會(huì)出現(xiàn)花屏的現(xiàn)象。
再然后,執(zhí)行步驟S170,將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,其中M小于N,且M為正整數(shù)。
需要強(qiáng)調(diào)的是,在將所述第一視頻幀確定為錄制開(kāi)始點(diǎn)時(shí),還包括獲得所述第一視頻幀的第一時(shí)間戳;而所述步驟S170,請(qǐng)參閱圖2,也還包括如下子步驟:步驟S170a,獲得所述M個(gè)視頻幀中的第二視頻幀的第二時(shí)間戳;步驟S170b,根據(jù)所述第一時(shí)間戳和所述第二時(shí)間戳獲得第三時(shí)間戳;步驟S170c,將所述第二視頻幀的第二時(shí)間戳更改為所述第三時(shí)間戳后,寫入所述本地FLV文件中。
具體而言,在將所述第一視頻幀確定為錄制開(kāi)始點(diǎn)時(shí),為了能讓錄制文件的開(kāi)始時(shí)間從0開(kāi)始,此時(shí)可獲得該第一視頻幀的第一時(shí)間戳并保存,如記錄該第一時(shí)間戳為begin_record_pts,該第一時(shí)間戳作為錄制文件的開(kāi)始時(shí)刻。進(jìn)一步地,將M個(gè)視頻幀中的第二視頻幀AVPacket結(jié)構(gòu)對(duì)象的第二時(shí)間戳減去第一時(shí)間戳begin_record_pts值,并將所述第二視頻幀的第二時(shí)間戳更改為所述第三時(shí)間戳。然后通過(guò)av_interleaved_write_frame函數(shù),把處理過(guò)的第二視頻幀寫入所述本地FLV文件中。
值得注意的是,由于在步驟S170中由于通過(guò)av_interleaved_write_frame函數(shù),把處理過(guò)的第二視頻幀直接寫入預(yù)先創(chuàng)建的AVFormatContext結(jié)構(gòu)上下文,這就使得在本發(fā)明實(shí)施例中不需要對(duì)視頻進(jìn)行重新編解碼,繼而對(duì)cpu、內(nèi)存消耗極低,具有性能高的特點(diǎn)。
最后,通過(guò)av_write_trailer函數(shù),寫入文件結(jié)尾例如文件長(zhǎng)度等信息,關(guān)閉文件,銷毀相關(guān)資源。
在這里,av_interleaved_write_frame函數(shù)是用來(lái)往輸出文件寫音視頻流數(shù)據(jù),且av_interleaved_write_frame函數(shù)寫入的數(shù)據(jù)的結(jié)構(gòu)為AVPacket。av_write_trailer函數(shù)是用來(lái)往輸出文件寫音視頻流的結(jié)尾信息,文件的大小等信息一般是在結(jié)尾的時(shí)候才能決定的。
基于同一發(fā)明構(gòu)思,本發(fā)明實(shí)施例還提供了實(shí)施例一中方法對(duì)應(yīng)的裝置,見(jiàn)實(shí)施例二。
實(shí)施例二
本實(shí)施例提供了一種使用FFMPEG接口錄制直播網(wǎng)站視頻的裝置,請(qǐng)參考圖3,所述裝置備包括:
第一獲得單元110,被配置為獲得所述直播間的流地址;
第二獲得單元120,被配置為根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息,其中所述流信息中包括N個(gè)幀,N為正整數(shù);
第一創(chuàng)建單元130,被配置為根據(jù)所述流信息創(chuàng)建本地FLV文件;
第三獲得單元140,被配置為根據(jù)所述N個(gè)幀,獲得第一幀;
第一判斷單元150,被配置為判斷所述第一幀是否為視頻關(guān)鍵幀;
第一確定單元160,被配置為當(dāng)所述第一視頻幀為視頻關(guān)鍵幀時(shí),將所述第一視頻幀確定為錄制開(kāi)始點(diǎn);
第一寫入單元170,被配置為將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,其中M小于N,且M為正整數(shù)。
在本申請(qǐng)實(shí)施例中,所述裝置還包括:
第二創(chuàng)建單元,所述第二創(chuàng)建單元用于創(chuàng)建FLV文件的文件頭;
第二寫入單元,所述第二寫入單元用于所述將第一視頻幀之后的M個(gè)視頻幀進(jìn)行數(shù)據(jù)處理,并寫入所述本地FLV文件中,還包括:
第三寫入單元,所述第三寫入單元用于將所述第一視頻幀進(jìn)行數(shù)據(jù)處理后,從所述文件頭處開(kāi)始寫入所述經(jīng)處理的所述第一視頻幀。
在本申請(qǐng)實(shí)施例中,所述裝置還包括:
第四獲得單元,所述第四獲得單元用于通過(guò)av_read_frame函數(shù)獲得所述流信息,且所述流信息為AVPacket結(jié)構(gòu);
第二判斷單元,所述第二判斷單元用于判斷所述av_read_frame的返回值是否等于AVERROR;
第一結(jié)束單元,所述第一結(jié)束單元用于當(dāng)所述av_read_frame的返回值等于AVERROR時(shí),才結(jié)束錄制。
在本申請(qǐng)實(shí)施例中,所述裝置還包括:
第三判斷單元,所述第三判斷單元用于判斷所述第一幀是否為IDR幀;
第四判斷單元,所述第四判斷單元用于如是,則判斷所述第一幀為視頻關(guān)鍵幀。
在本申請(qǐng)實(shí)施例中,所述裝置還包括:
第五獲得單元,所述第五獲得單元用于獲得所述第一視頻幀的第一時(shí)間戳;
第六獲得單元,所述第六獲得單元用于獲得所述M個(gè)視頻幀中的第二視頻幀的第二時(shí)間戳;
第七獲得單元,所述第七獲得單元用于根據(jù)所述第一時(shí)間戳和所述第二時(shí)間戳獲得第三時(shí)間戳;
第四寫入單元,所述第四寫入單元用于將所述第二視頻幀的第二時(shí)間戳更改為所述第三時(shí)間戳后,寫入所述本地FLV文件中。
由于本發(fā)明實(shí)施例二所介紹的使用FFMPEG接口錄制直播網(wǎng)站視頻的裝置,為實(shí)施本發(fā)明實(shí)施例一的使用FFMPEG接口錄制直播網(wǎng)站視頻的方法所采用的裝置,故而基于本發(fā)明實(shí)施例一所介紹的方法,本領(lǐng)域所屬人員能夠了解該裝置的具體結(jié)構(gòu)及變形,故而在此不再贅述。凡是本發(fā)明實(shí)施例一的方法所采用的裝置都屬于本發(fā)明所欲保護(hù)的范圍。
本申請(qǐng)實(shí)施例中提供的技術(shù)方案,至少具有如下技術(shù)效果或優(yōu)點(diǎn):
一方面,通過(guò)依據(jù)直播間直播過(guò)程中的流信息中N個(gè)幀,獲得第一幀,并判斷所述第一幀是否為視頻關(guān)鍵幀,如果所述第一視頻幀判斷為視頻關(guān)鍵幀時(shí),則將所述第一視頻幀確定為錄制開(kāi)始點(diǎn),以此使得所錄制的視頻在播放的時(shí)候不會(huì)出現(xiàn)花屏的現(xiàn)象。
又一方面,在根據(jù)所述流地址獲得所述直播間直播過(guò)程中的流信息的過(guò)程中,為了避免視頻文件被輕易打斷,造成斷流比較頻繁以至于常常遺失掉精彩的瞬間畫面的技術(shù)問(wèn)題,本發(fā)明實(shí)施例還包括:判斷所述av_read_frame的返回值是否等于AVERROR;當(dāng)所述av_read_frame的返回值等于AVERROR時(shí),才結(jié)束錄制。也即,對(duì)av_read_frame的返回值只有在等于AVERROR(EAGAIN)的時(shí)候,才結(jié)束錄制。這種容錯(cuò)處理不會(huì)導(dǎo)致本發(fā)明實(shí)施例所提供的方法在視頻錄制的過(guò)程中被頻繁打斷,而錯(cuò)過(guò)一些重要的時(shí)刻,實(shí)現(xiàn)所錄制的視頻具有連續(xù)順暢的特點(diǎn)。
再一方面,由于通過(guò)av_interleaved_write_frame函數(shù),把處理過(guò)的第二視頻幀直接寫入預(yù)先創(chuàng)建的AVFormatContext結(jié)構(gòu)上下文,這就使得在本發(fā)明實(shí)施例中不需要對(duì)視頻進(jìn)行重新編解碼,繼而對(duì)cpu、內(nèi)存消耗極低,具有性能高的特點(diǎn)。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明實(shí)施例進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明實(shí)施例的精神和范圍。這樣,倘若本發(fā)明實(shí)施例的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。