本發(fā)明實(shí)施例涉及錄像技術(shù)領(lǐng)域,尤其涉及一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法、裝置及終端設(shè)備。
背景技術(shù):
生產(chǎn)生活中,很多場(chǎng)合都需要持續(xù)錄像,如街道上的監(jiān)控錄像、生產(chǎn)車間的監(jiān)控錄像、汽車上的行車記錄等。由于錄像時(shí)間越長,錄制的視頻文件越大,故持續(xù)錄像過程中,不可能將錄制的視頻都保存在一個(gè)文件中,需要根據(jù)時(shí)間進(jìn)行分段錄像,即每錄制一段時(shí)間就生產(chǎn)一個(gè)視頻文件。例如,預(yù)先設(shè)定每個(gè)視頻文件的錄制時(shí)間為5分鐘,從9:00:00開始錄制,則理論上應(yīng)該依次得到如下視頻文件:9:00:00~9:05:00內(nèi)錄制的第一個(gè)錄像文件、9:05:00~9:10:00內(nèi)錄制的第二個(gè)錄像文件、9:10:00~9:15:00內(nèi)錄制的第三個(gè)錄像文件等。
但現(xiàn)有錄像設(shè)備所采用的錄像方案,從保存一個(gè)錄像文件(停止錄像)到新建一個(gè)錄像文件(重新開始錄像),是需要一定的時(shí)間間隔的;而在這段時(shí)間內(nèi),錄像程序至少需要完成釋放解碼器和封裝器、重新創(chuàng)建封裝器和解碼器等動(dòng)作,不能進(jìn)行錄像,即所謂的漏秒現(xiàn)象,漏秒時(shí)間通常在1s左右。例如上文所述實(shí)例中,對(duì)于第二個(gè)錄像文件,其開始錄像的時(shí)間會(huì)比9:05:00晚,如可能是9:05:01,相應(yīng)的,第二個(gè)錄像文件的實(shí)際錄像時(shí)間為9:05:01~9:10:01。
可見,現(xiàn)有錄像方案并不能真正實(shí)現(xiàn)持續(xù)錄像,在漏秒的時(shí)間段內(nèi),極有可能發(fā)生重要事件,卻不能被錄制到錄像文件中。因此,亟需一種可以消除漏秒現(xiàn)象的無縫錄像方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例中提供了一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法、裝置及終端設(shè)備,以解決現(xiàn)有持續(xù)錄像方案中普遍存在的漏秒問題。
第一方面,本發(fā)明實(shí)施例提供了一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法,該方法包括:
通過編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù);所述預(yù)覽視頻數(shù)據(jù)為視頻采集器件采集到的原始視頻數(shù)據(jù)中用于在屏幕上進(jìn)行預(yù)覽顯示的預(yù)覽幀數(shù)據(jù);
通過封裝器接口mediamuxer啟動(dòng)第一封裝器,并通過所述第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作;
在所述第一封裝器停止封裝之前,通過所述mediamuxer啟動(dòng)第二封裝器,并通過所述第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作;
在所述第二封裝器停止封裝之前,通過所述mediamuxer重新啟動(dòng)所述第一封裝器。
可選的,在所述第一封裝器停止封裝之前,通過所述mediamuxer啟動(dòng)第二封裝器,包括:
當(dāng)當(dāng)前時(shí)刻到達(dá)第一預(yù)啟時(shí)刻時(shí),通過所述mediamuxer啟動(dòng)所述第二封裝器;其中,所述第一預(yù)啟時(shí)刻相對(duì)于第一分割時(shí)刻的提前量為第一預(yù)設(shè)間隔時(shí)間,所述第一分割時(shí)刻為所述第一封裝器停止封裝的時(shí)刻;
在所述第二封裝器停止封裝之前,通過所述mediamuxer重新啟動(dòng)所述第一封裝器,包括:
當(dāng)當(dāng)前時(shí)刻到達(dá)第二預(yù)啟時(shí)刻時(shí),通過所述mediamuxer重新啟動(dòng)所述第一封裝器;其中,所述第二預(yù)啟時(shí)刻相對(duì)于第二分割時(shí)刻的提前量為第二預(yù)設(shè)間隔時(shí)間,所述第二分割時(shí)刻為所述第二封裝器停止封裝的時(shí)刻。
可選的,所述方法還包括:
在當(dāng)前時(shí)刻到達(dá)所述第一分割時(shí)刻時(shí),控制所述第一封裝器停止封裝操作,并保存第一封裝器封裝得到的錄像文件;
在當(dāng)前時(shí)刻到達(dá)所述第二分割時(shí)刻時(shí),控制所述第二封裝器停止封裝操作,并保存第二封裝器封裝得到的錄像文件。
可選的,所述方法還包括:
在所述第一分割時(shí)刻和所述第二預(yù)啟時(shí)刻之間的任意時(shí)刻,所述mediamuxer在控制所述第一封裝器停止封裝操作之后,到達(dá)所述第二預(yù)啟時(shí)間之前,還包括:所述mediamuxer釋放所述第一封裝器,并重新創(chuàng)建所述第一封裝器;
在所述第二分割時(shí)刻和所述第一預(yù)啟時(shí)刻之間的任意時(shí)刻,所述mediamuxer釋放所述第二封裝器,并重新創(chuàng)建所述第二封裝器。
可選的,所述方法還包括:
在啟動(dòng)第一封裝器后,檢測(cè)所述音視頻編碼數(shù)據(jù)中是否有關(guān)鍵幀到來,并在所述關(guān)鍵幀到來后,執(zhí)行所述通過第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作的步驟;
和/或,在啟動(dòng)第二封裝器后,檢測(cè)所述音視頻編碼數(shù)據(jù)中是否有關(guān)鍵幀到來,并在所述關(guān)鍵幀到來后,執(zhí)行所述通過第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作的步驟。
可選的,所述方法還包括:
根據(jù)相鄰兩個(gè)關(guān)鍵幀的間隔時(shí)間,確定所述第一預(yù)設(shè)間隔時(shí)間和/或所述第二預(yù)設(shè)間隔時(shí)間。
可選的,所述啟動(dòng)第一封裝器,包括:創(chuàng)建第一錄像文件,并在所述第一錄像文件中寫入解碼配置數(shù)據(jù);
所述啟動(dòng)第二封裝器,包括:創(chuàng)建第二錄像文件,并在所述第二錄像文件中寫入解碼配置數(shù)據(jù)。
第二方面,本發(fā)明實(shí)施例提供了一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的裝置,該裝置包括:編碼控制單元和封裝控制單元;
所述編碼控制單元用于,通過編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù);所述預(yù)覽視頻數(shù)據(jù)為視頻采集器件采集到的原始視頻數(shù)據(jù)中用于在屏幕上進(jìn)行預(yù)覽顯示的預(yù)覽幀數(shù)據(jù);
所述封裝控制單元用于,通過封裝器接口mediamuxer啟動(dòng)第一封裝器,并通過所述第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作;在所述第一封裝器停止封裝之前,通過所述mediamuxer啟動(dòng)第二封裝器,并通過所述第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作;在所述第二封裝器停止封裝之前,通過所述mediamuxer重新啟動(dòng)所述第一封裝器。
可選的,所述封裝控制單元具體可以被配置為:當(dāng)當(dāng)前時(shí)刻到達(dá)第一預(yù)啟時(shí)刻時(shí),通過所述mediamuxer啟動(dòng)第二封裝器;其中,所述第一預(yù)啟時(shí)刻相對(duì)于第一分割時(shí)刻的提前量為第一預(yù)設(shè)間隔時(shí)間,所述第一分割時(shí)刻為所述第一封裝器停止封裝的時(shí)刻;
所述封裝控制單元還可以被配置為:當(dāng)當(dāng)前時(shí)刻到達(dá)第二預(yù)啟時(shí)刻時(shí),通過所述mediamuxer啟動(dòng)第一封裝器;其中,所述第二預(yù)啟時(shí)刻相對(duì)于第二分割時(shí)刻的提前量為第二預(yù)設(shè)間隔時(shí)間,所述第二分割時(shí)刻為所述第二封裝器停止封裝的時(shí)刻。
可選的,所述封裝控制單元還可以被配置為:在當(dāng)前時(shí)刻到達(dá)所述第一分割時(shí)刻時(shí),控制所述第一封裝器停止封裝操作,并保存第一封裝器封裝得到的錄像文件;以及,在當(dāng)前時(shí)刻到達(dá)所述第二分割時(shí)刻時(shí),控制所述第二封裝器停止封裝操作,并保存第二封裝器封裝得到的錄像文件。
可選的,所述裝置還包括:
關(guān)鍵幀檢測(cè)單元,用于在所述封裝控制單元啟動(dòng)第一封裝器后,檢測(cè)所述音視頻編碼數(shù)據(jù)中是否有關(guān)鍵幀到來,并在所述關(guān)鍵幀到來后,觸發(fā)所述封裝控制單元執(zhí)行所述通過所述第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作的步驟;
和/或,用于在所述封裝控制單元啟動(dòng)第二封裝器后,檢測(cè)所述音視頻編碼數(shù)據(jù)中是否有關(guān)鍵幀到來,并在所述關(guān)鍵幀到來后,觸發(fā)所述封裝控制單元執(zhí)行所述通過所述第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作的步驟。
第三方面,本發(fā)明實(shí)施例提供了一種終端設(shè)備,包括:攝像頭、麥克風(fēng)、處理器、及存儲(chǔ)器;
所述存儲(chǔ)器中存儲(chǔ)有可在所述處理器上運(yùn)行的計(jì)算機(jī)程序;所述處理器通過預(yù)設(shè)接口與所述攝像頭、麥克風(fēng)和存儲(chǔ)器連接;
所述攝像頭用于采集視頻數(shù)據(jù);
所述麥克風(fēng)用于采集音頻數(shù)據(jù);
所述處理器用于執(zhí)行所述計(jì)算機(jī)程序,以使所述終端設(shè)備實(shí)現(xiàn)以上任一實(shí)施例所述的無縫錄像方法。
由以上技術(shù)方案可知,區(qū)別于現(xiàn)有錄像接口mediarecoder的集成封裝式錄像流程,本發(fā)明實(shí)施例先采用編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù),然后采用封裝器接口mediamuxer對(duì)所述音視頻編碼數(shù)據(jù)進(jìn)行封裝,封裝過程為:通過兩個(gè)封裝器交替執(zhí)行對(duì)音視頻編碼數(shù)據(jù)的封裝操作,且在一個(gè)封裝器停止一次封裝過程之前,另一個(gè)封裝器已經(jīng)預(yù)先啟動(dòng)并開始封裝操作,使得相鄰兩個(gè)錄像文件存在重疊部分,可以完全消除漏秒現(xiàn)象。本實(shí)施例中,編碼器接口mediacodec在錄像開始后一直運(yùn)行,直至整個(gè)無縫錄像過程結(jié)束,不需要循環(huán)進(jìn)行編碼器資源的釋放、重建操作,封裝器接口mediamuxer所控制的兩個(gè)封裝器,即使需要在完成一次封裝后進(jìn)行資源釋放和重建,也會(huì)有另一個(gè)封裝器處于封裝工作狀態(tài),不會(huì)發(fā)生漏秒現(xiàn)象,真正實(shí)現(xiàn)無縫錄像。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本公開。
附圖說明
此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本發(fā)明的實(shí)施例,并與說明書一起用于解釋本發(fā)明的原理。
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,對(duì)于本領(lǐng)域普通技術(shù)人員而言,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例提供的一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法的流程圖;
圖2是本發(fā)明實(shí)施例提供的無縫錄像方法執(zhí)行時(shí)的時(shí)間軸示意圖;
圖3是本發(fā)明實(shí)施例提供的另一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法的信號(hào)流圖;
圖4是圖3所示無縫錄像方法對(duì)應(yīng)的信號(hào)流圖;
圖5是本發(fā)明實(shí)施例提供的一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的裝置的結(jié)構(gòu)示意圖;
圖6是本發(fā)明實(shí)施例提供的一種具有無縫錄像功能的終端設(shè)備的結(jié)構(gòu)框圖。
具體實(shí)施方式
本發(fā)明實(shí)施例提供了一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法、裝置及終端設(shè)備,以解決現(xiàn)有持續(xù)錄像方案中普遍存在的漏秒問題。
發(fā)明人在研究過程中發(fā)現(xiàn),現(xiàn)有技術(shù)在android系統(tǒng)的原始設(shè)計(jì)中,是通過高度集成封裝的錄制接口mediarecorder實(shí)現(xiàn)錄像功能的。這種高度集成封裝帶來的問題就是資源釋放和重建的耗時(shí)較長;具體的,使用mediarecorder實(shí)現(xiàn)錄像功能,mediarecorder中集成的方法遍歷執(zhí)行一次(包括錄像開始時(shí)對(duì)各種資源的創(chuàng)建/獲取,以及錄像結(jié)束時(shí)對(duì)各種資源的釋放),完成一次錄像過程,得到一個(gè)錄像文件,即每完成一個(gè)時(shí)間段的錄像(得到一個(gè)錄像文件),都要依次執(zhí)行釋放編碼器、釋放封裝器、釋放camera資源等動(dòng)作,然后在啟動(dòng)下一個(gè)時(shí)間段的錄像時(shí),再依次執(zhí)行創(chuàng)建camera資源、創(chuàng)建封裝器、創(chuàng)建編碼器等動(dòng)作??梢姡F(xiàn)有技術(shù)基于mediarecorder實(shí)現(xiàn)錄像的過程中,在錄像結(jié)束和重新開始時(shí)流程的執(zhí)行復(fù)雜度高,耗時(shí)較長,是造成漏秒問題的重要原因。
有鑒于此,本發(fā)明實(shí)施例采用多媒體編解碼的最基礎(chǔ)代碼進(jìn)行編程,包括采用編碼器接口mediacodec實(shí)現(xiàn)對(duì)音視頻的編碼,并在整個(gè)無縫錄像過程中一直工作,采用封裝器接口mediamuxer創(chuàng)建兩個(gè)封裝器muxer,實(shí)現(xiàn)對(duì)音視頻編碼數(shù)據(jù)的封裝,每個(gè)封裝器工作一次得到一個(gè)錄像文件,通過控制兩個(gè)封裝器交替工作,實(shí)現(xiàn)對(duì)編碼器持續(xù)輸出的音視頻編碼數(shù)據(jù)不間斷的封裝操作,保證封裝過程不存在漏秒,從而保證開始錄像后每一時(shí)刻的錄像數(shù)據(jù)都可以被編碼、封裝并寫入錄像文件中,消除漏秒現(xiàn)象,實(shí)現(xiàn)無縫的持續(xù)錄像。以下結(jié)合附圖對(duì)本發(fā)明實(shí)施例進(jìn)行詳細(xì)闡述。
圖1為本發(fā)明一個(gè)可行的實(shí)施例提供的在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法的流程圖。參照?qǐng)D1,所述無縫錄像方法至少包括以下步驟:
s11、通過編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù);
所述預(yù)覽視頻數(shù)據(jù)為視頻采集器件采集到的原始視頻數(shù)據(jù)中用于在屏幕上進(jìn)行預(yù)覽顯示的預(yù)覽幀數(shù)據(jù)。實(shí)際應(yīng)用中,為了使用戶實(shí)時(shí)跟蹤預(yù)覽當(dāng)前的錄像內(nèi)容,通常會(huì)根據(jù)屏幕的畫面刷新率從攝像頭采集的原始圖像中截取部分圖像幀,即上述預(yù)覽視頻數(shù)據(jù),實(shí)時(shí)顯示在屏幕上。由于攝像頭采集的原始圖像,只能在系統(tǒng)的本地框架(native)層獲取到,而預(yù)覽視頻數(shù)據(jù)是可以在系統(tǒng)的應(yīng)用層獲取到的,故本實(shí)施例中,mediacodec針對(duì)上述預(yù)覽視頻數(shù)據(jù)進(jìn)行編碼,使得本方法的實(shí)現(xiàn)不需要改變系統(tǒng)底層(如上述native層等)代碼,提高編碼自由度。
s12、通過封裝器接口mediamuxer啟動(dòng)第一封裝器,并通過所述第一封裝器接收所述音視頻編碼數(shù)據(jù);
s13、通過所述第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作,并在所述第一封裝器停止封裝之前,執(zhí)行步驟s14;
s14、通過所述mediamuxer啟動(dòng)第二封裝器,并通過所述第二封裝器接收所述音視頻編碼數(shù)據(jù);
s15、通過所述第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作,并在所述第二封裝器停止封裝之前,執(zhí)行步驟s12。
本實(shí)施例中,步驟s13在第一封裝器停止封裝之前就啟動(dòng)第二封裝器,并通過第二封裝器接收音視頻編碼數(shù)據(jù),使得,從第二封裝器啟動(dòng)到第一封裝器停止封裝的這段時(shí)間內(nèi),同時(shí)有第一封裝器和第二封裝器接收音視頻編碼數(shù)據(jù)并進(jìn)行封裝操作,從而保證從“由第一封裝器執(zhí)行封裝操作”切換到“由第二封裝器執(zhí)行封裝操作”的過程中不會(huì)發(fā)生漏秒現(xiàn)象;同樣的,步驟s15中,在第二封裝器停止封裝之前,就再次執(zhí)行步驟s12,啟動(dòng)第一封裝器,并通過第一封裝器接收音視頻編碼數(shù)據(jù),使得,從第一封裝器啟動(dòng)到第二封裝器停止封裝的這段時(shí)間內(nèi),同時(shí)有第二封裝器和第一封裝器接收音視頻編碼數(shù)據(jù)并進(jìn)行封裝操作,從而保證從“由第二封裝器執(zhí)行封裝操作”切換到“由第一封裝器執(zhí)行封裝操作”的過程中不會(huì)發(fā)生漏秒現(xiàn)象。
參照?qǐng)D2所示的本實(shí)施例提供的無縫錄像方法執(zhí)行時(shí)的時(shí)間軸示意圖,可知,本實(shí)施例中每個(gè)封裝器每執(zhí)行一次封裝操作,就會(huì)生成一個(gè)錄像文件;在開始錄像后的t1時(shí)刻,首先由第一封裝器接收音視頻編碼數(shù)據(jù)并進(jìn)行封裝;然后,在該第一封裝器的本次封裝過程停止之前的t2時(shí)刻,第二封裝器就啟動(dòng)并對(duì)當(dāng)前編碼器輸出的音視頻編碼數(shù)據(jù)進(jìn)行封裝,此時(shí),第一封裝器也在繼續(xù)接收所述音視頻編碼數(shù)據(jù)并進(jìn)行封裝;然后,在t3時(shí)刻,第一封裝器停止封裝,得到一個(gè)錄像文件f1,第二封裝器則繼續(xù)執(zhí)行封裝操作;與t2時(shí)刻類似的,在第二封裝器停止封裝前的t4時(shí)刻,第一封裝器再次啟動(dòng)執(zhí)行封裝操作;在t5時(shí)刻,第二封裝器停止封裝,得到錄像文件f2,第一封裝器繼續(xù)執(zhí)行封裝操作……可見,在t2~t3這一時(shí)間段內(nèi),兩個(gè)封裝器重疊工作,錄像文件f1和f2中都保存有t2~t3這一時(shí)間段內(nèi)錄制的音視頻數(shù)據(jù),同樣的,在t4~t5這一時(shí)間段內(nèi),兩個(gè)封裝器也重疊工作,使得錄像文件f2和f3中都保存有t4~t5這一時(shí)間段內(nèi)錄制的音視頻數(shù)據(jù)。
即,本實(shí)施例通過第一封裝器和第二封裝器之間有重疊的交替工作,使得整個(gè)錄像過程得到的相鄰兩個(gè)錄像文件中,前一個(gè)錄像文件的末尾部分都與后一個(gè)錄像文件的開頭部分有重疊,從而可以徹底避免漏秒現(xiàn)象,保證從開始錄像到錄像結(jié)束過程中的每個(gè)時(shí)刻的音視頻數(shù)據(jù)都被封裝入錄像文件中,真正實(shí)現(xiàn)無縫錄像。
由以上技術(shù)方案可知,本發(fā)明實(shí)施例舍棄現(xiàn)有錄像接口mediarecoder的集成封裝式錄像流程,先采用編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù),然后采用封裝器接口mediamuxer對(duì)所述音視頻編碼數(shù)據(jù)進(jìn)行封裝,封裝過程為:通過兩個(gè)封裝器交替執(zhí)行對(duì)音視頻編碼數(shù)據(jù)的封裝操作,且在一個(gè)封裝器停止一次封裝過程之前,另一個(gè)封裝器已經(jīng)預(yù)先啟動(dòng)并開始封裝操作,使得相鄰兩個(gè)錄像文件存在重疊部分,可以完全消除漏秒現(xiàn)象。本實(shí)施例中,編碼器接口mediacodec在錄像開始后一直運(yùn)行,直至整個(gè)無縫錄像過程結(jié)束,不需要循環(huán)進(jìn)行編碼器資源的釋放、重建操作,封裝器接口mediamuxer所控制的兩個(gè)封裝器,即使需要在完成一次封裝后進(jìn)行資源釋放和重建,也會(huì)有另一個(gè)封裝器處于封裝工作狀態(tài),不會(huì)發(fā)生漏秒現(xiàn)象,真正實(shí)現(xiàn)無縫錄像。
在一個(gè)可行的實(shí)施例中,由于mediacodec是從系統(tǒng)的應(yīng)用層獲取預(yù)覽視頻數(shù)據(jù)來進(jìn)行視頻編碼的,故可以基于java等編程語言分別實(shí)現(xiàn)上述編碼器接口mediacodec和封裝器接口mediamuxer,并將其制作為應(yīng)用程序包(如應(yīng)用于android系統(tǒng)的apk格式的安裝文件),從而任意終端設(shè)備都可以在不改變系統(tǒng)底層代碼(即不需要更換或更新系統(tǒng))的前提下,通過安裝該應(yīng)用程序包,來使終端設(shè)備實(shí)現(xiàn)本實(shí)施例所述的無縫錄像功能。可見,本實(shí)施例提供的無縫錄像方法具有很強(qiáng)的可移植性,可以通過應(yīng)用程序包輕松地移植到任意終端設(shè)備中。
在本發(fā)明一個(gè)可行的實(shí)施例中,上述步驟s12中啟動(dòng)第一封裝器,具體可以包括:創(chuàng)建第一錄像文件,并在所述第一錄像文件中寫入解碼配置數(shù)據(jù);相應(yīng)的,步驟s14中啟動(dòng)第二封裝器,具體可以包括:創(chuàng)建第二錄像文件,并在所述第二錄像文件中寫入解碼配置數(shù)據(jù)。
即,每個(gè)封裝器在開始新的一次封裝過程時(shí),首先創(chuàng)建本次封裝的錄像文件,指定該錄像文件的文件名(如根據(jù)當(dāng)前的系統(tǒng)時(shí)間命名為20160926090000.mp4,表示在2016年9月26日9點(diǎn)開始錄制),并在該錄像文件中寫入解碼配置數(shù)據(jù),以在播放該錄像文件播放時(shí),根據(jù)該解碼配置數(shù)據(jù)對(duì)該錄像文件進(jìn)行解碼。
圖3為本發(fā)明實(shí)施例提供的另一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的方法的流程圖,圖4為圖3對(duì)應(yīng)的信號(hào)流圖。參照?qǐng)D3和圖4,該方法包括以下步驟:
s11、通過編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù);
s12、通過封裝器接口mediamuxer啟動(dòng)所述第一封裝器,通過所述第一封裝器接收所述音視頻編碼數(shù)據(jù),并分別執(zhí)行步驟s131、s132和s133;
s131、通過所述第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)開始執(zhí)行封裝操作;
s132、判斷當(dāng)前時(shí)刻是否為第一預(yù)啟時(shí)刻,如果是,則繼續(xù)執(zhí)行步驟s14,否則重復(fù)執(zhí)行步驟s132;
s133、判斷當(dāng)前時(shí)刻是否為第一分割時(shí)刻,如果是,則執(zhí)行步驟s134,否則重復(fù)執(zhí)行步驟s133;
s134、控制所述第一封裝器停止封裝操作,并保存第一封裝器封裝得到的錄像文件;
s14、通過封裝器接口mediamuxer啟動(dòng)所述第二封裝器,通過所述第二封裝器接收所述音視頻編碼數(shù)據(jù),并分別執(zhí)行步驟s151、s152和s153;
s151、通過所述第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作;
s152、判斷當(dāng)前時(shí)刻是否為第二預(yù)啟時(shí)刻,如果是,則返回步驟s12,否則重復(fù)執(zhí)行步驟s152;
s153、判斷當(dāng)前時(shí)刻是否為第二分割時(shí)刻,如果是,則執(zhí)行步驟s154,否則重復(fù)執(zhí)行步驟s153;
s154、控制所述第二封裝器停止封裝操作,并保存第二封裝器封裝得到的錄像文件。
本實(shí)施例中,第一預(yù)啟時(shí)刻早于第一分割時(shí)刻,二者之間的時(shí)間差(下稱第一預(yù)設(shè)間隔時(shí)間)可以根據(jù)實(shí)際需求進(jìn)行設(shè)置;同樣的,第二預(yù)啟時(shí)刻早于第二分割時(shí)刻,二者之間的時(shí)間差(下稱第二預(yù)設(shè)間隔時(shí)間)也可以根據(jù)實(shí)際需求進(jìn)行設(shè)置。所述第一預(yù)設(shè)間隔時(shí)間與第二預(yù)設(shè)間隔時(shí)間可以相同,也可以不同。
在一個(gè)可行的實(shí)施例中,可以在開始錄像前,設(shè)置每個(gè)錄像文件的錄像時(shí)長,以及第一預(yù)設(shè)間隔時(shí)間與第二預(yù)設(shè)間隔時(shí)間,從而在通過第一封裝器進(jìn)行封裝時(shí),根據(jù)該第一封裝器封裝操作的開始時(shí)間(也即第一封裝器當(dāng)前保存的錄像文件的開始時(shí)間)和所述錄像時(shí)長開始時(shí)間確定第一分割時(shí)刻,再根據(jù)該第一分割時(shí)刻和預(yù)先設(shè)置的第一預(yù)設(shè)間隔時(shí)間確定第一預(yù)啟時(shí)刻;同樣的,在通過第二封裝器進(jìn)行封裝時(shí),根據(jù)該第二封裝器封裝操作的開始時(shí)間(也即第二封裝器當(dāng)前保存的錄像文件的開始時(shí)間)和所述錄像時(shí)長開始時(shí)間確定第二分割時(shí)刻,再根據(jù)該第二分割時(shí)刻和預(yù)先設(shè)置的第二預(yù)設(shè)間隔時(shí)間確定第二預(yù)啟時(shí)刻。
可見,本實(shí)施例通過預(yù)先設(shè)置的錄像時(shí)長、預(yù)設(shè)間隔時(shí)間等參數(shù),可以在一個(gè)封裝器執(zhí)行封裝操作的同時(shí),確定另一個(gè)封裝器的啟動(dòng)時(shí)刻,保證另一個(gè)封裝器的啟動(dòng)時(shí)刻早于本封裝器停止封裝的時(shí)刻,實(shí)現(xiàn)真正的無縫錄像。同時(shí),本實(shí)施例還可以調(diào)節(jié)預(yù)設(shè)間隔時(shí)間,從而調(diào)節(jié)兩個(gè)封裝器的重疊工作時(shí)間,也即調(diào)節(jié)相鄰兩個(gè)錄像文件的重疊時(shí)間,以滿足不同的實(shí)際應(yīng)用需求;例如,當(dāng)錄像設(shè)備的存儲(chǔ)空間較小時(shí),可以適當(dāng)減小預(yù)設(shè)間隔時(shí)間,避免錄像文件之間存儲(chǔ)較長時(shí)間的重疊,從而節(jié)省錄像文件的存儲(chǔ)空間。
在本發(fā)明一個(gè)可行的實(shí)施例中,mediamuxer在啟動(dòng)第一封裝器(步驟s12)后,可以先檢測(cè)第一封裝器獲取到的所述音視頻編碼數(shù)據(jù)(具體是視頻編碼數(shù)據(jù))中是否有關(guān)鍵幀到來,并在該關(guān)鍵幀到來后,再從該關(guān)鍵幀開始進(jìn)行封裝操作(步驟s13或s131);相應(yīng)的,mediamuxer在啟動(dòng)第二封裝器(步驟s14)后,可以先檢測(cè)第二封裝器獲取到的所述音視頻編碼數(shù)據(jù)中是否有關(guān)鍵幀到來,并在所述關(guān)鍵幀到來后,再從該關(guān)鍵幀開始執(zhí)行封裝操作(步驟s15或s151)。
由于視頻編碼過程是按組進(jìn)行的,每一組編碼數(shù)據(jù)都從一個(gè)關(guān)鍵幀(即i幀)開始,每個(gè)關(guān)鍵幀都是一個(gè)完整的畫面,但關(guān)鍵幀之間的視頻幀是不完整的,在播放解碼時(shí)需要根據(jù)相關(guān)的關(guān)鍵幀計(jì)算得到,因此,如果錄像文件的第一幀不是關(guān)鍵幀,則在播放時(shí)開頭部分不能正確解碼計(jì)算得到完整的畫面,造成馬賽克效果,因此,本發(fā)明實(shí)施例在啟動(dòng)封裝器后,對(duì)關(guān)鍵幀進(jìn)行檢測(cè),并在檢測(cè)到關(guān)鍵幀時(shí)才開始執(zhí)行封裝操作,使得每個(gè)錄像文件的首幀都為關(guān)鍵幀,可以避免在該錄像文件的開頭部分在播放時(shí)出現(xiàn)馬賽克效果。
在本發(fā)明一個(gè)可行的實(shí)施例中,基于上述關(guān)鍵幀檢測(cè)步驟,上述無縫錄像方法還可包括以下步驟:
根據(jù)相鄰兩個(gè)關(guān)鍵幀的間隔時(shí)間,確定所述第一預(yù)設(shè)間隔時(shí)間和/或所述第二預(yù)設(shè)間隔時(shí)間。
假設(shè)視頻編碼數(shù)據(jù)中相鄰兩個(gè)關(guān)鍵幀的間隔時(shí)間為1s,則可以將所述第一預(yù)設(shè)間隔時(shí)間和第二預(yù)設(shè)間隔時(shí)間,都設(shè)置為[1s,2s)之間的任意數(shù)值。結(jié)合圖2所示的時(shí)間軸示意圖,如果f1的最后一幀為關(guān)鍵幀,則t2實(shí)際是落在f1的倒數(shù)第三個(gè)關(guān)鍵幀和倒數(shù)第二個(gè)關(guān)鍵幀之間,故第二封裝器從f1的倒數(shù)第二個(gè)關(guān)鍵幀到來時(shí)開始,在f2中寫入封裝后的數(shù)據(jù),f1和f2的重疊時(shí)長為一個(gè)間隔時(shí)間,即1s;如果f1的最后一幀不是關(guān)鍵幀,則t2落在f1的最后兩個(gè)關(guān)鍵幀之間,故第二封裝器從f1的最后一個(gè)關(guān)鍵幀開始在f2中寫入數(shù)據(jù),f1和f2的重疊時(shí)長小于1s。
可見,通過上述設(shè)置,在保證相鄰兩個(gè)錄像文件有重疊的前提下,保證重疊時(shí)間不大于1s(一個(gè)間隔時(shí)間),從而避免相鄰兩個(gè)錄像文件重疊時(shí)間過長造成數(shù)據(jù)冗余,減輕相關(guān)存儲(chǔ)單元對(duì)錄像文件存儲(chǔ)壓力。
本發(fā)明實(shí)施例中,既可以通過上述方法,在錄像過程中,通過實(shí)時(shí)檢測(cè)音視頻編碼數(shù)據(jù)中關(guān)鍵幀的間隔時(shí)間,來確定所述第一預(yù)設(shè)間隔時(shí)間和第二預(yù)設(shè)間隔時(shí)間,從而確定各個(gè)封裝器對(duì)應(yīng)的分割時(shí)刻和預(yù)啟時(shí)刻;也可以在開始錄像前,預(yù)先根據(jù)終端設(shè)備中編碼器的相關(guān)參數(shù)確定關(guān)鍵幀的間隔時(shí)間,進(jìn)而確定所述第一預(yù)設(shè)間隔時(shí)間和第二預(yù)設(shè)間隔時(shí)間,從而在錄像過程中,根據(jù)所述第一預(yù)設(shè)間隔時(shí)間和第二預(yù)設(shè)間隔時(shí)間確定各個(gè)封裝器對(duì)應(yīng)的分割時(shí)刻和預(yù)啟時(shí)刻,保證對(duì)各個(gè)封裝器的啟動(dòng)和停止封裝的精準(zhǔn)控制。
在本發(fā)明一個(gè)可行的實(shí)施例中,上述無縫錄像方法中,在每個(gè)封裝器停止封裝后,可以執(zhí)行以下操作;釋放該封裝器,并利用封裝器創(chuàng)建線程重新創(chuàng)建得到該封裝器。
具體的,在所述第一分割時(shí)刻和所述第二預(yù)啟時(shí)刻之間(即圖3或圖4所示的步驟s133至s152之間,也即第一封裝器停止本次封裝之后到其下次啟動(dòng)之前)的任意時(shí)刻,所述mediamuxer可以執(zhí)行以下步驟:釋放所述第一封裝器,并重新創(chuàng)建所述第一封裝器,以所述第二預(yù)啟時(shí)刻到達(dá)時(shí)(步驟s152),可以及時(shí)啟動(dòng)該第一封裝器;相應(yīng)的,在所述第二分割時(shí)刻和所述第一預(yù)啟時(shí)刻之間(即圖3或圖4所示的步驟s153至s132之間,也即第二封裝器停止本次封裝之后到其下次啟動(dòng)之前)的任意時(shí)刻,所述mediamuxer可以執(zhí)行以下步驟:釋放該第二封裝器,并重新創(chuàng)建該第二封裝器,以待在所述第一預(yù)啟時(shí)刻到達(dá)時(shí)(步驟s132),及時(shí)啟動(dòng)該第二封裝器。
可見,本實(shí)施例中,在第一封裝器完成一次封裝,需要進(jìn)行資源釋放和重建時(shí),已經(jīng)有第二封裝器接替其封裝工作,從而可以在第二封裝器工作過程中完成第一封裝器的釋放和重建操作,以備在第二封裝器完成一次封裝需要進(jìn)行資源釋放和重建時(shí)接替第二封裝器執(zhí)行封裝工作。同時(shí),封裝器每完成一次封裝過程(得到一個(gè)錄像文件)后,就執(zhí)行一次釋放、重建,可以避免同一個(gè)封裝器長期占用同一系統(tǒng)資源,造成系統(tǒng)錯(cuò)誤等現(xiàn)象。
在本發(fā)明一個(gè)可行的實(shí)施例中,上述無縫錄像方法的步驟s134和s154中所述的保存錄像文件,具體可以為:將錄像文件保存至預(yù)先設(shè)定的緩存單元中;相應(yīng)的,該無縫錄像方法還包括:在將所述緩存單元中的錄像文件轉(zhuǎn)存至硬盤或存儲(chǔ)卡。
實(shí)際應(yīng)用中,終端設(shè)備中用于存儲(chǔ)錄像文件的存儲(chǔ)單元(如該終端設(shè)備的只讀存儲(chǔ)器(readonlymemory,rom),或嵌入的sd(securedigital)卡、tf(t-flash)卡各種等存儲(chǔ)卡)的數(shù)據(jù)寫入速度可能較慢,如果其寫入速度小于錄像文件的幀率,則會(huì)造成錄像文件難以及時(shí)存入存儲(chǔ)單元中,或者只能通過降低錄像幀率來保證錄像文件的正確存儲(chǔ)。有鑒于此,本發(fā)明實(shí)施例先通過終端設(shè)備中寫入速度較大的緩沖區(qū)(一般為隨機(jī)存取存儲(chǔ)器(ramdomaccessmemory,ram))緩存錄像文件,再將緩存的錄像文件依次轉(zhuǎn)存至存儲(chǔ)單元中。
可見,本發(fā)明實(shí)施例通過增加一級(jí)緩存,解決錄像幀率與存儲(chǔ)單元的寫入速度不匹配的問題,在不降低錄像幀率的前提下,保證錄像文件正確存儲(chǔ)至相應(yīng)的存儲(chǔ)單元中。
圖5為本發(fā)明實(shí)施例提供的一種在android系統(tǒng)應(yīng)用層實(shí)現(xiàn)無縫錄像的裝置的結(jié)構(gòu)示意圖。參照?qǐng)D5,該裝置至少包括:
編碼控制單元510,用于通過編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù);所述預(yù)覽視頻數(shù)據(jù)為視頻采集器件采集到的原始視頻數(shù)據(jù)中用于在屏幕上進(jìn)行預(yù)覽顯示的預(yù)覽幀數(shù)據(jù);
封裝控制單元520,用于通過封裝器接口mediamuxer啟動(dòng)第一封裝器,并通過所述第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作;在所述第一封裝器停止封裝之前,通過所述mediamuxer啟動(dòng)第二封裝器,并通過所述第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作;在所述第二封裝器停止封裝之前,通過所述mediamuxer重新啟動(dòng)所述第一封裝器。
由以上技術(shù)方案可知,區(qū)別于現(xiàn)有錄像接口mediarecoder的集成封裝式錄像流程,本發(fā)明實(shí)施例先采用編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù),然后采用封裝器接口mediamuxer對(duì)所述音視頻編碼數(shù)據(jù)進(jìn)行封裝,封裝過程為:通過兩個(gè)封裝器交替執(zhí)行對(duì)音視頻編碼數(shù)據(jù)的封裝操作,且在一個(gè)封裝器停止一次封裝過程之前,另一個(gè)封裝器已經(jīng)預(yù)先啟動(dòng)并開始封裝操作,使得相鄰兩個(gè)錄像文件存在重疊部分,可以完全消除漏秒現(xiàn)象。本實(shí)施例中,編碼器接口mediacodec在錄像開始后一直運(yùn)行,直至整個(gè)無縫錄像過程結(jié)束,不需要循環(huán)進(jìn)行編碼器資源的釋放、重建操作,封裝器接口mediamuxer所控制的兩個(gè)封裝器,即使需要在完成一次封裝后進(jìn)行資源釋放和重建,也會(huì)有另一個(gè)封裝器處于封裝工作狀態(tài),不會(huì)發(fā)生漏秒現(xiàn)象,真正實(shí)現(xiàn)無縫錄像。
在本發(fā)明一個(gè)可行的實(shí)施例中,上述封裝控制單元520啟動(dòng)第一封裝器,具體可以包括:創(chuàng)建第一錄像文件,并在所述第一錄像文件中寫入解碼配置數(shù)據(jù);相應(yīng)的,上述封裝控制單元520啟動(dòng)第二封裝器,具體可以包括:創(chuàng)建第二錄像文件,并在所述第二錄像文件中寫入解碼配置數(shù)據(jù)。
在本發(fā)明一個(gè)可行的實(shí)施例中,為實(shí)現(xiàn)在所述第一封裝器停止封裝之前,啟動(dòng)第二封裝器,所述封裝控制單元520具體可以被配置為:當(dāng)當(dāng)前時(shí)刻到達(dá)第一預(yù)啟時(shí)刻時(shí),通過所述mediamuxer啟動(dòng)第二封裝器;其中,所述第一預(yù)啟時(shí)刻相對(duì)于第一分割時(shí)刻的提前量為第一預(yù)設(shè)間隔時(shí)間,所述第一分割時(shí)刻為所述第一封裝器停止封裝的時(shí)刻。
同樣的,為實(shí)現(xiàn)在所述第二封裝器停止封裝之前,啟動(dòng)第一封裝器,所述封裝控制單元520具體可以被配置為:當(dāng)當(dāng)前時(shí)刻到達(dá)第二預(yù)啟時(shí)刻時(shí),通過所述mediamuxer啟動(dòng)第一封裝器;其中,所述第二預(yù)啟時(shí)刻相對(duì)于第二分割時(shí)刻的提前量為第二預(yù)設(shè)間隔時(shí)間,所述第二分割時(shí)刻為所述第二封裝器停止封裝的時(shí)刻。
在本發(fā)明一個(gè)可行的實(shí)施例中,上述無縫錄像裝置還可以包括:
關(guān)鍵幀檢測(cè)單元,用于在上述封裝控制單元520啟動(dòng)第一封裝器后,檢測(cè)所述音視頻編碼數(shù)據(jù)中是否有關(guān)鍵幀到來,并在所述關(guān)鍵幀到來后,觸發(fā)所述封裝控制單元520繼續(xù)執(zhí)行所述通過所述第一封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作的步驟;
和/或,用于在所述封裝控制單元520啟動(dòng)第二封裝器后,檢測(cè)所述音視頻編碼數(shù)據(jù)中是否有關(guān)鍵幀到來,并在所述關(guān)鍵幀到來后,觸發(fā)封裝控制單元520執(zhí)行所述通過所述第二封裝器對(duì)所述音視頻編碼數(shù)據(jù)執(zhí)行封裝操作的步驟。
本發(fā)明實(shí)施例在啟動(dòng)封裝器后,對(duì)關(guān)鍵幀進(jìn)行檢測(cè),并在檢測(cè)到關(guān)鍵幀時(shí)才開始執(zhí)行封裝操作,使得每個(gè)錄像文件的首幀都為關(guān)鍵幀,可以避免在該錄像文件的開頭部分在播放時(shí)出現(xiàn)馬賽克效果。
在本發(fā)明一個(gè)可行的實(shí)施例中,上述無縫錄像裝置還可以包括:
提前量確定單元,用于根據(jù)相鄰兩個(gè)關(guān)鍵幀的間隔時(shí)間,確定所述第一預(yù)設(shè)間隔時(shí)間和/或所述第二預(yù)設(shè)間隔時(shí)間。
在本發(fā)明一個(gè)可行的實(shí)施例中,封裝控制單元520還被配置為:在所述第一分割時(shí)刻和所述第二預(yù)啟時(shí)刻之間的任意時(shí)刻,釋放所述第一封裝器,并通過所述mediamuxer重新創(chuàng)建所述第一封裝器;以及,在所述第二分割時(shí)刻和所述第一預(yù)啟時(shí)刻之間的任意時(shí)刻,釋放所述第二封裝器,并通過所述mediamuxer重新創(chuàng)建所述第二封裝器。
可見,本實(shí)施例中,在第一封裝器完成一次封裝,需要進(jìn)行資源釋放和重建時(shí),已經(jīng)有第二封裝器接替其封裝工作,從而可以在第二封裝器工作過程中完成第一封裝器的釋放和重建操作,以備在第二封裝器完成一次封裝需要進(jìn)行資源釋放和重建時(shí)接替第二封裝器執(zhí)行封裝工作。同時(shí),封裝器每完成一次封裝過程(得到一個(gè)錄像文件)后,就執(zhí)行一次釋放、重建,可以避免同一個(gè)封裝器長期占用同一系統(tǒng)資源,造成系統(tǒng)錯(cuò)誤等現(xiàn)象。
在本發(fā)明一個(gè)可行的實(shí)施例中,上述無縫錄像裝置還可以包括:
緩存控制單元,用于分別將第一封裝器封裝得到的錄像文件和第二封裝器封裝得到的錄像文件保存至緩存單元,再將所述緩存單元中的錄像文件轉(zhuǎn)存至硬盤或存儲(chǔ)卡。
本發(fā)明實(shí)施例通過增加一級(jí)緩存,解決錄像幀率與存儲(chǔ)單元的寫入速度不匹配的問題,在不降低錄像幀率的前提下,保證錄像文件正確存儲(chǔ)至相應(yīng)的存儲(chǔ)單元中。
圖6為本發(fā)明實(shí)施例提供的一種具有無縫錄像功能的終端設(shè)備的結(jié)構(gòu)框圖。參照?qǐng)D6,該終端設(shè)備包括:攝像頭610、麥克風(fēng)620、處理器630和存儲(chǔ)器640。
其中,所述存儲(chǔ)器中存儲(chǔ)有可在所述處理器上運(yùn)行的計(jì)算機(jī)程序;所述處理器通過預(yù)設(shè)接口與所述攝像頭、麥克風(fēng)和存儲(chǔ)器連接。
所述攝像頭610用于采集視頻數(shù)據(jù);所述麥克620用于采集音頻數(shù)據(jù);所述處理器630用于執(zhí)行所述存儲(chǔ)器中存儲(chǔ)的計(jì)算機(jī)程序,以使所述終端設(shè)備實(shí)現(xiàn)前文任一項(xiàng)實(shí)施例所述的無縫錄像方法。
可見,區(qū)別于現(xiàn)有錄像接口mediarecoder的集成封裝式錄像流程,本發(fā)明實(shí)施例先采用編碼器接口mediacodec對(duì)預(yù)覽視頻數(shù)據(jù)和音頻數(shù)據(jù)進(jìn)行編碼,得到音視頻編碼數(shù)據(jù),然后采用封裝器接口mediamuxer對(duì)所述音視頻編碼數(shù)據(jù)進(jìn)行封裝,封裝過程為:通過兩個(gè)封裝器交替執(zhí)行對(duì)音視頻編碼數(shù)據(jù)的封裝操作,且在一個(gè)封裝器停止一次封裝過程之前,另一個(gè)封裝器已經(jīng)預(yù)先啟動(dòng)并開始封裝操作,使得相鄰兩個(gè)錄像文件存在重疊部分,可以完全消除漏秒現(xiàn)象。本實(shí)施例中,編碼器接口mediacodec在錄像開始后一直運(yùn)行,直至整個(gè)無縫錄像過程結(jié)束,不需要循環(huán)進(jìn)行編碼器資源的釋放、重建操作,封裝器接口mediamuxer所控制的兩個(gè)封裝器,即使需要在完成一次封裝后進(jìn)行資源釋放和重建,也會(huì)有另一個(gè)封裝器處于封裝工作狀態(tài),不會(huì)發(fā)生漏秒現(xiàn)象,真正實(shí)現(xiàn)無縫錄像。
為了描述的方便,描述以上裝置時(shí)以功能分為各種單元分別描述。當(dāng)然,在實(shí)施本發(fā)明時(shí)可以把各單元的功能在同一個(gè)或多個(gè)軟件和/或硬件中實(shí)現(xiàn)。
本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見即可,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于裝置或系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說明即可。以上所描述的裝置及系統(tǒng)實(shí)施例僅僅是示意性的,其中作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來實(shí)現(xiàn)本實(shí)施例方案的目的。
本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。以上僅是本發(fā)明的具體實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。