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