,其示出了本發(fā)明另一實施例提供的視頻拍攝方法的方法流程圖,該視頻拍攝方法應用于電子設備中,特別是采用Android系統(tǒng)的電子設備,該視頻拍攝方法包括:
[0051]步驟301,獲取拍攝到的視頻數(shù)據(jù);
[0052]電子設備在接收到用戶觸發(fā)的開始信號后,獲取拍攝到的視頻數(shù)據(jù)。視頻數(shù)據(jù)通常包括圖像幀(frame)數(shù)據(jù)和音頻幀(sample)數(shù)據(jù)。若拍攝無聲視頻,則視頻數(shù)據(jù)可以只包括圖像幀數(shù)據(jù),但本文中主要以視頻數(shù)據(jù)同時包括圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)來舉例說明。
[0053]電子設備獲取圖像幀數(shù)據(jù)的過程包括:電子設備調用Andorid系統(tǒng)提供的PreviewCallback接口,該PreviewCallback接口在攝像頭每次拍攝到一巾貞圖像巾貞數(shù)據(jù)時,自動調用onPreviewFrame回調函數(shù)返回當前圖像巾貞數(shù)據(jù)。
[0054]電子設備獲取音頻幀數(shù)據(jù)的過程包括:電子設備調用Andorid系統(tǒng)提供的Aud1Record接口,該Aud1Record接口在麥克風每次采集到音頻巾貞數(shù)據(jù)時,自動調用onPre1dicNotificat1n回調函數(shù)返回當前音頻巾貞數(shù)據(jù)。
[0055]另外,電子設備在每個時間段開始拍攝時,新建與當前時間段對應的視頻文件。也即電子設備在斷點拍攝的每個時間段開始拍攝時,新建與該時間段對應的視頻文件(此時為空文件),并調用FFmpeg (開源免費跨平臺的音視頻流方案)寫該視頻文件的文件頭。比如,在第I個時間段中拍攝時,新建視頻文件1,在第2個時間段中拍攝時,新建視頻文件2。
[0056]步驟302,將視頻數(shù)據(jù)緩存到內存分配不受限制的native層;
[0057]電子設備在獲取到圖像幀數(shù)據(jù)時,將該圖像幀數(shù)據(jù)緩存到內存分配不受限制的native層,native層是C代碼運行的層,理論上可以使用電子設備所支持的全部可用物理內容,而不受限制。同理,電子設備在獲取到音頻幀數(shù)據(jù)時,將該音頻幀數(shù)據(jù)也緩存到內存分配不受限制的native層。本步驟可以包括:
[0058]1、電子設備將視頻數(shù)據(jù)的幀數(shù)據(jù)緩存在native層,該視頻數(shù)據(jù)包括圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)中的前一種或者全部兩種;
[0059]2、電子設備將視頻數(shù)據(jù)的相關信息緩存在預先創(chuàng)建在Java層的隊列中,該相關信息包括各幀數(shù)據(jù)在native層中的存儲位置和各幀數(shù)據(jù)所對應的時間。
[0060]該相關信息的內容可以不限于存儲位置和時間,以圖像幀數(shù)據(jù)為例,每個圖像幀數(shù)據(jù)的相關信息可以包括:該圖像幀數(shù)據(jù)在native層中的存儲位置、該圖像幀數(shù)據(jù)的圖像格式信息、該圖像幀數(shù)據(jù)的數(shù)據(jù)量大小、該圖像幀數(shù)據(jù)所對應的時間和該圖像幀數(shù)據(jù)所對應的文件名。其中,該圖像幀數(shù)據(jù)的圖像格式信息、該圖像幀數(shù)據(jù)的數(shù)據(jù)量大小和該圖像幀數(shù)據(jù)所對應的文件名都是可選包括的內容。
[0061 ] 其中,該圖像幀數(shù)據(jù)在native層中的存儲位置可以用一個指針表示,該指針指向nat ive層中的一塊內存空間,該內存空間存儲著該圖像幀數(shù)據(jù)。
[0062]另外,由于原始拍攝的圖像幀數(shù)據(jù)的圖像格式與最終視頻文件中的期望格式可能不同,所以電子設備在緩存每幀圖像幀數(shù)據(jù)的相關信息時,還緩存每幀圖像幀數(shù)據(jù)的圖像格式信息,圖像格式信息包括圖像的寬高和角度等。
[0063]還由于用戶可能采用斷點拍攝方式,所以電子設備還將視頻數(shù)據(jù)中各幀數(shù)據(jù)各自所對應的視頻文件名作為視頻數(shù)據(jù)的一項相關信息緩存在隊列中。以圖像幀數(shù)據(jù)為例,每個圖像幀數(shù)據(jù)所對應的文件名根據(jù)該圖像幀數(shù)據(jù)所屬于的拍攝時間段而定,不同時間段拍攝的圖像幀數(shù)據(jù)對應不同的文件名,同一時間段拍攝的圖像幀數(shù)據(jù)對應同一文件名。比如,在第I個時間段中拍攝的圖像幀數(shù)據(jù),都對應視頻文件1,在第2個時間段中拍攝的圖像幀數(shù)據(jù),都對應視頻文件2。同理,電子設備在緩存每幀音頻幀數(shù)據(jù)時,還保存該幀音頻幀數(shù)據(jù)所對應的視頻文件名,比如,在第I個時間段中錄制的音頻幀數(shù)據(jù),都對應視頻文件1,在第2個時間段中錄制的音頻幀數(shù)據(jù),都對應視頻文件2。
[0064]比如,以圖像幀數(shù)據(jù)為例,電子設備預先創(chuàng)建一個先進先出的隊列,該隊列中的每個元素包括(對應文件名,幀數(shù)據(jù)的指針,幀數(shù)據(jù)的數(shù)據(jù)大小,時間,幀數(shù)據(jù)的寬,幀數(shù)據(jù)的高),當onPreviewFrame回調函數(shù)獲取到一巾貞圖像巾貞數(shù)據(jù)時,將該圖像巾貞數(shù)據(jù)的相關信息插入到預先創(chuàng)建的隊列中,而該圖像幀數(shù)據(jù)的實際幀數(shù)據(jù)緩存在native層中。
[0065]需要說明的是,圖像幀數(shù)據(jù)的相關信息可以單獨緩存在一個隊列中,音頻幀數(shù)據(jù)的相關信息可以單獨緩存在另一個隊列中。
[0066]步驟303,啟動一個異步線程;
[0067]在本實施例中,除了用于緩存圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)的線程,電子設備還單獨啟動一個異步線程來完成視頻編碼。
[0068]步驟304,通過異步線程將各個時間段拍攝得到的視頻數(shù)據(jù)分別編碼至獨立的一個視頻文件;
[0069]如果視頻數(shù)據(jù)包括不同時間段拍攝得到的視頻數(shù)據(jù),則電子設備將各個時間段拍攝得到的視頻數(shù)據(jù)分別編碼至獨立的一個視頻文件。也即,該異步線程不斷根據(jù)各幀數(shù)據(jù)在隊列中的相關信息,讀取native層中緩存的圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù),將讀取到的圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)調用FFmpeg編碼至上述步驟301中創(chuàng)建的對應的視頻文件中。
[0070]在電子設備將各個時間段拍攝得到的視頻數(shù)據(jù)分別編碼至獨立的一個視頻文件的過程中,電子設備根據(jù)視頻數(shù)據(jù)中各幀數(shù)據(jù)各自所對應的視頻文件名,將各幀數(shù)據(jù)順序編碼至對應的視頻文件中。也即,若緩存的圖像幀數(shù)據(jù)對應的視頻文件名為視頻文件1,則電子設備將該圖像幀數(shù)據(jù)編碼至視頻文件1,若緩存的音頻幀數(shù)據(jù)對應的視頻文件名為視頻文件2,則電子設備將該音頻幀數(shù)據(jù)編碼至視頻文件2。其中,相關信息中的時間用于指示各幀數(shù)據(jù)的編碼順序和時間戳。
[0071]需要補充說明的是,如果原始拍攝的圖像幀數(shù)據(jù)的圖像格式與最終視頻文件中的期望格式不同,則電子設備還在編碼前將每幀圖像幀數(shù)據(jù)根據(jù)步驟302中保存的圖像格式信息仿射變換至期望格式。也即,在步驟302中,電子設備在隊列中緩存每幀圖像幀數(shù)據(jù)的相關信息時,預先將每幀圖像幀數(shù)據(jù)的圖像格式信息也作為一項相關信息進行緩存;所以電子設備在編碼前可以將每幀圖像幀數(shù)據(jù)根據(jù)保存的圖像格式信息仿射變換至期望格式。
[0072]步驟305,將編碼得到的至少兩個視頻文件合并為同一個視頻文件。
[0073]電子設備將編碼得到的至少兩個視頻文件合并為同一個視頻文件,該同一個視頻文件將作為最終的視頻文件。
[0074]綜上所述,本實施例提供的視頻拍攝方法,通過獲取拍攝到的視頻數(shù)據(jù),將視頻數(shù)據(jù)緩存到內存分配不受限制的native層,根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件;解決了圖像數(shù)據(jù)被緩存在Java層時,會頻繁觸發(fā)垃圾回收機制和發(fā)生內存溢出現(xiàn)象的問題;達到了不需要觸發(fā)垃圾回收機制,也不會發(fā)生內存溢出現(xiàn)象的效果。
[0075]另一方面,【背景技術】中將圖像幀數(shù)據(jù)緩存到Java層的線程和進行視頻編碼的線程通常為同一線程,如果onPreviewFrame回調函數(shù)被阻塞,則會導致編碼得到的視頻文件的幀速降低。而本實施例的視頻拍攝方法,通過異步線程來單獨進行視頻編碼,所以不會發(fā)生阻塞現(xiàn)象,從而可以提高編碼得到的視頻文件的幀速。
[0076]本實施例提供的視頻拍攝方法,還通過在緩存視頻數(shù)據(jù)的同時,還緩存圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)各自所對應的視頻文件名,可以實現(xiàn)在編碼時將不同幀數(shù)據(jù)編碼至正確的視頻文件中,從而實現(xiàn)了斷點拍攝功能。
[0077]本實施例提供的視頻拍攝方法,還通過在緩存圖像幀數(shù)據(jù)的相關信息的同時,還緩存圖像幀數(shù)據(jù)所對應的圖像格式信息,可以實現(xiàn)在編碼前將每幀圖像幀數(shù)據(jù)根據(jù)圖像格式信息仿射變換至期望格式的效果。
[0078]請參考圖4,其示出了本發(fā)明一個實施例提供的視頻拍攝裝置的結構方框圖。該視頻拍攝裝置可以通過軟件、硬件或者兩者的結合實現(xiàn)成為電子設備的全部或一部分。該視頻拍攝裝置包括:數(shù)據(jù)采集模塊420、數(shù)據(jù)緩存模塊440和數(shù)據(jù)編碼模塊460。
[0079]數(shù)據(jù)采集模塊420,用于獲取拍攝到的視頻數(shù)據(jù);
[0080]數(shù)據(jù)緩存模塊440,用于將所述視頻數(shù)據(jù)緩存到內存分配不受限制的native層;
[0081]數(shù)據(jù)編碼模塊460,用于根據(jù)所述native層中緩存的所述視頻數(shù)據(jù)編碼得到視頻文件。
[0082]綜上所述,本實施例提供的視頻拍攝裝置,通過獲取拍攝到的視頻數(shù)據(jù),將視頻數(shù)據(jù)緩存到內存分配不受限制的native層,根據(jù)native層中緩存的視頻數(shù)據(jù)編碼得到視頻文件;解決了圖像數(shù)據(jù)被緩存在Java層時,會頻繁觸發(fā)垃圾回收機制和發(fā)生內存溢出現(xiàn)象的問題;達到了不需要觸發(fā)垃圾回收機制,也不會發(fā)生內存溢出現(xiàn)象的效果。
[0083]請參考圖5,其示出了本發(fā)明一個實施例提供的視頻拍攝裝置的結構方框圖。該視頻拍攝裝置可以通過軟件、硬件或者兩者的結合實現(xiàn)成為電子設備的全部或一部分。該視頻拍攝裝置包括:數(shù)據(jù)采集模塊420、數(shù)據(jù)緩存模塊440和數(shù)據(jù)編碼模塊460。
[0084]數(shù)據(jù)采集模塊420,用于獲取拍攝到的視頻數(shù)據(jù);
[0085]數(shù)據(jù)緩存模塊440,用于將所述視頻數(shù)據(jù)緩存到內存分配不受限制的native層;
[0086]數(shù)據(jù)編碼模塊460,用于根據(jù)所述native層中緩存的所述視頻數(shù)據(jù)編碼得到視頻文件。
[0087]所述數(shù)據(jù)緩存模塊440,包括:
[0088]數(shù)據(jù)緩存單元442,用于將所述視頻數(shù)據(jù)的幀數(shù)據(jù)緩存在所述native層,所述視頻數(shù)據(jù)包括圖像幀數(shù)據(jù)和音頻幀數(shù)據(jù)中的前一種或者全部兩種;
[0089]信息緩存單元444,用于將所述視頻數(shù)據(jù)的相關信息緩存在預先創(chuàng)建在Java層的隊列中,所述相關信息包括各幀數(shù)據(jù)在所述native層中的存儲