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