視頻拍攝方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)施例涉及多媒體處理領(lǐng)域,特別涉及一種視頻拍攝方法及裝置。
【背景技術(shù)】
[0002]短視頻分享是目前在諸如智能手機(jī)、平板電腦和多媒體播放器等移動(dòng)終端上非常流行的一種功能。用戶可以通過智能手機(jī)拍攝簡短的幾秒視頻來分享給好友,使得短視頻能夠像微博一樣來傳播信息。
[0003]在采用Android系統(tǒng)的移動(dòng)終端上,短視頻分享App (Applicat1n,應(yīng)用程序)可以調(diào)用系統(tǒng)內(nèi)置的相關(guān)函數(shù)接口來拍攝短視頻。例如,短視頻分享App調(diào)用系統(tǒng)內(nèi)置的PreviewCallback接口,該P(yáng)reviewCallback接口在攝像頭每次拍攝到一巾貞預(yù)覽圖像時(shí),自動(dòng)調(diào)用onPreviewFrame回調(diào)函數(shù)向短視頻分享App返回當(dāng)前圖像巾貞數(shù)據(jù)。短視頻分享App將每幀圖像幀數(shù)據(jù)緩存在Java層,然后按順序?qū)⒚繋瑘D像幀數(shù)據(jù)編碼為短視頻。
[0004]在實(shí)現(xiàn)本發(fā)明實(shí)施例的過程中,發(fā)明人發(fā)現(xiàn)【背景技術(shù)】至少存在以下問題:Andorid系統(tǒng)中屬于Java層的每個(gè)應(yīng)用僅能夠使用有限的幾十MB內(nèi)存,而上述圖像幀數(shù)據(jù)被緩存在Java層時(shí),由于圖像幀數(shù)據(jù)的數(shù)據(jù)量較大,會(huì)頻繁觸發(fā)Java層在內(nèi)存不足時(shí)的垃圾回收(gc)機(jī)制,甚至發(fā)生內(nèi)存溢出(oom, Out Of Memory)。
【發(fā)明內(nèi)容】
[0005]為了解決圖像數(shù)據(jù)被緩存在Java層時(shí),會(huì)頻繁觸發(fā)垃圾回收機(jī)制和發(fā)生內(nèi)存溢出現(xiàn)象的問題,本發(fā)明實(shí)施例提供了一種視頻拍攝方法及裝置。所述技術(shù)方案如下:
[0006]第一方面,提供了一種視頻拍攝方法,所述方法包括:
[0007]獲取拍攝到的視頻數(shù)據(jù);
[0008]將所述視頻數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層;
[0009]根據(jù)所述native層中緩存的所述視頻數(shù)據(jù)編碼得到視頻文件。
[0010]第二方面,提供了一種視頻拍攝裝置,所述裝置包括:
[0011]數(shù)據(jù)采集模塊,用于獲取拍攝到的視頻數(shù)據(jù);
[0012]數(shù)據(jù)緩存模塊,用于將所述視頻數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層;
[0013]數(shù)據(jù)編碼模塊,用于根據(jù)所述native層中緩存的所述視頻數(shù)據(jù)編碼得到視頻文件。
[0014]本發(fā)明實(shí)施例提供的技術(shù)方案帶來的有益效果是:
[0015]通過獲取拍攝到的視頻數(shù)據(jù),將視頻數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層,根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件;解決了圖像數(shù)據(jù)被緩存在Java層時(shí),會(huì)頻繁觸發(fā)垃圾回收機(jī)制和發(fā)生內(nèi)存溢出現(xiàn)象的問題;達(dá)到了不需要觸發(fā)垃圾回收機(jī)制,也不會(huì)發(fā)生內(nèi)存溢出現(xiàn)象的效果。
【附圖說明】
[0016]為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0017]圖1是本發(fā)明一個(gè)實(shí)施例提供的視頻拍攝方法的方法流程圖;
[0018]圖2是本發(fā)明另一實(shí)施例提供的視頻拍攝方法的方法流程圖;
[0019]圖3是本發(fā)明另一實(shí)施例提供的視頻拍攝方法的方法流程圖
[0020]圖4是本發(fā)明一個(gè)實(shí)施例提供的視頻拍攝裝置的結(jié)構(gòu)示意圖;
[0021]圖5是本發(fā)明另一實(shí)施例提供的視頻拍攝裝置的結(jié)構(gòu)示意圖;
[0022]圖6是本發(fā)明一個(gè)實(shí)施例提供的電子設(shè)備的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0023]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
[0024]請(qǐng)參考圖1,其示出了本發(fā)明一個(gè)實(shí)施例提供的視頻拍攝方法的方法流程圖。該視頻拍攝方法應(yīng)用于電子設(shè)備中,特別是采用Android系統(tǒng)的電子設(shè)備,該視頻拍攝方法包括:
[0025]步驟102,獲取拍攝到的視頻數(shù)據(jù);
[0026]步驟104,將視頻數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層;
[0027]步驟106,根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件。
[0028]綜上所述,本實(shí)施例提供的視頻拍攝方法,通過獲取拍攝到的視頻數(shù)據(jù),將視頻數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層,根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件;解決了圖像數(shù)據(jù)被緩存在Java層時(shí),會(huì)頻繁觸發(fā)垃圾回收機(jī)制和發(fā)生內(nèi)存溢出現(xiàn)象的問題;達(dá)到了不需要觸發(fā)垃圾回收機(jī)制,也不會(huì)發(fā)生內(nèi)存溢出現(xiàn)象的效果。
[0029]請(qǐng)參考圖2,其示出了本發(fā)明另一實(shí)施例提供的視頻拍攝方法的方法流程圖,該視頻拍攝方法應(yīng)用于電子設(shè)備中,特別是采用Android系統(tǒng)的電子設(shè)備,該視頻拍攝方法包括:
[0030]步驟201,獲取拍攝到的視頻數(shù)據(jù);
[0031]電子設(shè)備在接收到用戶觸發(fā)的開始信號(hào)后,獲取拍攝到的視頻數(shù)據(jù)。視頻數(shù)據(jù)通常包括圖像幀(frame)數(shù)據(jù)和音頻幀(sample)數(shù)據(jù)。若拍攝無聲視頻,則視頻數(shù)據(jù)可以只包括圖像幀數(shù)據(jù),但本文中主要以視頻數(shù)據(jù)同時(shí)包括圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)來舉例說明。
[0032]電子設(shè)備獲取圖像幀數(shù)據(jù)的過程包括:電子設(shè)備調(diào)用Andorid系統(tǒng)提供的PreviewCallback接口,該P(yáng)reviewCallback接口在攝像頭每次拍攝到一巾貞圖像巾貞數(shù)據(jù)時(shí),自動(dòng)調(diào)用onPreviewFrame回調(diào)函數(shù)返回當(dāng)前圖像巾貞數(shù)據(jù)。
[0033]電子設(shè)備獲取音頻幀數(shù)據(jù)的過程包括:電子設(shè)備調(diào)用Andorid系統(tǒng)提供的Aud1Record接口,該Aud1Record接口在麥克風(fēng)每次采集到音頻巾貞數(shù)據(jù)時(shí),自動(dòng)調(diào)用onPre1dicNotificat1n回調(diào)函數(shù)返回當(dāng)前音頻巾貞數(shù)據(jù)。
[0034]另外,電子設(shè)備在接收到開始信號(hào)后,也即本次錄制開始時(shí),電子設(shè)備還新建一個(gè)與本次拍攝時(shí)間段對(duì)應(yīng)的視頻文件(此時(shí)為空文件),并調(diào)用FFmpeg (開源免費(fèi)跨平臺(tái)的音視頻流方案)寫該視頻文件的文件頭。
[0035]步驟202,將視頻數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層;
[0036]電子設(shè)備在獲取到圖像幀數(shù)據(jù)時(shí),將該圖像幀數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層,native層是C代碼運(yùn)行的層,理論上可以使用電子設(shè)備所支持的全部可用物理內(nèi)存,而不受限制。同理,電子設(shè)備在獲取到音頻幀數(shù)據(jù)時(shí),將該音頻幀數(shù)據(jù)也緩存到內(nèi)存分配不受限制的native層。本步驟可以包括:
[0037]1、電子設(shè)備將視頻數(shù)據(jù)的幀數(shù)據(jù)緩存在native層,該視頻數(shù)據(jù)包括圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)中的前一種或者全部兩種;
[0038]電子設(shè)備獲取到一幀圖像幀數(shù)據(jù)或者音頻幀數(shù)據(jù)時(shí),一方面將圖像幀數(shù)據(jù)或音頻幀數(shù)據(jù)的真實(shí)幀數(shù)據(jù)存儲(chǔ)在native層中,另一方面將圖像幀數(shù)據(jù)或音頻幀數(shù)據(jù)的相關(guān)信息插入到預(yù)先在Java層創(chuàng)建的隊(duì)列中。
[0039]2、電子設(shè)備將視頻數(shù)據(jù)的相關(guān)信息緩存在預(yù)先創(chuàng)建在Java層的隊(duì)列中,該相關(guān)信息包括各幀數(shù)據(jù)在native層中的存儲(chǔ)位置和各幀數(shù)據(jù)所對(duì)應(yīng)的時(shí)間。
[0040]圖像幀數(shù)據(jù)或音頻幀數(shù)據(jù)的相關(guān)信息可以不限于在native層中的存儲(chǔ)位置和時(shí)間,本實(shí)施例僅以一幀數(shù)據(jù)的相關(guān)信息包括該幀數(shù)據(jù)在native層中的存儲(chǔ)位置和該幀數(shù)據(jù)所對(duì)應(yīng)的時(shí)間來舉例說明。其中,該幀數(shù)據(jù)在native層中的存儲(chǔ)位置可以用一個(gè)指針表示,該指針指向該巾貞數(shù)據(jù)在native層中的內(nèi)存空間。
[0041]需要說明的是,圖像幀數(shù)據(jù)的相關(guān)信息可以單獨(dú)緩存在一個(gè)隊(duì)列中,音頻幀數(shù)據(jù)的相關(guān)信息可以單獨(dú)緩存在另一個(gè)隊(duì)列中。
[0042]步驟203,啟動(dòng)一個(gè)異步線程;
[0043]在本實(shí)施例中,除了用于緩存圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)的線程,電子設(shè)備還單獨(dú)啟動(dòng)一個(gè)異步線程來完成視頻編碼。
[0044]步驟204,通過異步線程根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件。
[0045]電子設(shè)備通過異步線程根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件。也即,該異步線程不斷從上述隊(duì)列中讀取native層中緩存的圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù),將讀取到的圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)調(diào)用FFmpeg編碼至上述步驟201中創(chuàng)建的視頻文件中。
[0046]本實(shí)施例中以視頻數(shù)據(jù)只包括同一時(shí)間段拍攝得到的視頻數(shù)據(jù)為例,則電子設(shè)備根據(jù)隊(duì)列中緩存的各幀數(shù)據(jù)各自在native層中的存儲(chǔ)位置和各幀數(shù)據(jù)所對(duì)應(yīng)的時(shí)間,從native層中讀取各幀數(shù)據(jù)并順序編碼至同一個(gè)視頻文件。
[0047]綜上所述,本實(shí)施例提供的視頻拍攝方法,通過獲取拍攝到的視頻數(shù)據(jù),將視頻數(shù)據(jù)緩存到內(nèi)存分配不受限制的native層,根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件;解決了圖像數(shù)據(jù)被緩存在Java層時(shí),會(huì)頻繁觸發(fā)垃圾回收機(jī)制和發(fā)生內(nèi)存溢出現(xiàn)象的問題;達(dá)到了不需要觸發(fā)垃圾回收機(jī)制,也不會(huì)發(fā)生內(nèi)存溢出現(xiàn)象的效果。
[0048]另一方面,【背景技術(shù)】中將圖像幀數(shù)據(jù)緩存到Java層的線程和進(jìn)行視頻編碼的線程通常為同一線程,如果onPreviewFrame回調(diào)函數(shù)被阻塞,則會(huì)導(dǎo)致編碼得到的視頻文件的幀速降低。而本實(shí)施例的視頻拍攝方法,通過異步線程來單獨(dú)進(jìn)行視頻編碼,所以不會(huì)發(fā)生阻塞現(xiàn)象,從而可以提高編碼得到的視頻文件的幀速。
[0049]由于用戶在拍攝視頻時(shí),還可能會(huì)使用斷點(diǎn)拍攝。如,用戶要拍攝6秒時(shí)長的短視頻,那么用戶的手指觸摸電子設(shè)備上顯示的錄制按鈕時(shí),開始錄制視頻;用戶的手指離開電子設(shè)備上顯示的錄制按鈕時(shí),暫停錄制視頻;當(dāng)用戶的手指再次觸摸電子設(shè)備上顯示的錄制按鈕時(shí),又繼續(xù)錄制視頻,直至錄滿6秒時(shí)長的短視頻。為了實(shí)現(xiàn)該斷點(diǎn)拍攝,提供了如下實(shí)施例:
[0050]請(qǐng)參考圖3