本發(fā)明涉及音視頻處理技術(shù)領(lǐng)域,尤其涉及一種視頻文件生成和檢索播放方法、裝置。
背景技術(shù):
隨著錄像錄音設(shè)備的普及,用戶錄制、傳播音視頻的需求也越來越多。通過微信、qq等網(wǎng)絡(luò)方式進(jìn)行音視頻分享,已經(jīng)成為大眾網(wǎng)絡(luò)用戶的常態(tài),也已經(jīng)成為傳播知識(shí)、文化的最重要途徑。但用戶錄制講座、課堂教學(xué)等場(chǎng)合的音視頻時(shí)常常遇到一個(gè)兩難的問題:只錄制音頻時(shí)一些關(guān)鍵的圖像信息就難以同時(shí)采集,不能給人直觀印象,并且長(zhǎng)音頻在回放時(shí)不好精確定位其中的某一部分;直接錄制為帶有聲音的視頻的話就會(huì)面臨視頻尺寸龐大、不便存儲(chǔ)傳輸?shù)膯栴}。因此,一種能在音頻中嵌入關(guān)鍵圖片的錄制方式將是一種好的解決方案:既控制了文件尺寸的大小,也便于給人直觀信息以及精確定位?,F(xiàn)有技術(shù)中,對(duì)音視頻的去信息冗余和檢索多采用后期處理的方式實(shí)現(xiàn),操作比較麻煩,缺少一種在錄制時(shí)直接對(duì)信息高效采集并整合成可檢索視頻的方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種由音頻和圖片組成的視頻文件的生成和檢索播放方法。
本發(fā)明的目的是通過以下技術(shù)方案實(shí)現(xiàn)的:一種由音頻和圖片組成的視頻文件的生成方法,包括以下步驟:
s1、采集音頻,同時(shí)采集與音頻時(shí)間同步的圖片,圖片的采集方式為自動(dòng)、手動(dòng)或其他系統(tǒng)觸發(fā);
s2、將采集的圖片編碼為視頻流,將音頻編碼為音頻流;
s3、將視頻流與音頻流封裝生成視頻文件,所述視頻文件用于對(duì)嵌入了圖片后的音頻進(jìn)行索引和連續(xù)播放。
進(jìn)一步地,所述步驟s2中,將要嵌入的圖片編碼為視頻流對(duì)應(yīng)時(shí)間點(diǎn)的i幀,視頻流中的其他幀不編碼為i幀(可編碼為p幀)。
進(jìn)一步地,i幀編碼圖片在視頻中保持靜止直到下一張圖片出現(xiàn)。
進(jìn)一步地,所述步驟s1中,自動(dòng)觸發(fā)方式為用戶定時(shí)拍照:當(dāng)計(jì)時(shí)器計(jì)時(shí)到用戶設(shè)定的定時(shí)拍照時(shí)間時(shí),自動(dòng)獲取一幀圖像,將該圖像編碼為視頻流;或者,自動(dòng)觸發(fā)方式為自動(dòng)檢測(cè)到場(chǎng)景轉(zhuǎn)換時(shí)拍照:用戶設(shè)置感興趣的區(qū)域和觸發(fā)拍照的閾值th,按用戶設(shè)定的視頻幀率獲取圖像,從獲取的圖像中提取用戶設(shè)置的感興趣區(qū)域的圖像g,對(duì)g進(jìn)行運(yùn)動(dòng)估計(jì)得到運(yùn)動(dòng)矢量,對(duì)運(yùn)動(dòng)矢量的長(zhǎng)度進(jìn)行加和,除以感興趣區(qū)域的圖像大小,得到運(yùn)動(dòng)速度的指標(biāo)e;當(dāng)e大于th時(shí),將當(dāng)前圖像編碼為視頻流,否則,將載有上一幀信息的視頻幀拷貝并寫入到視頻流中進(jìn)行編碼。
進(jìn)一步地,所述步驟s1中,手動(dòng)觸發(fā)為用戶點(diǎn)擊按鈕觸發(fā):當(dāng)用戶點(diǎn)擊拍照按鈕時(shí),記錄當(dāng)前時(shí)間,獲取一幀圖像,將該圖像編碼為視頻流;其他系統(tǒng)觸發(fā)為:通過遙控器紅外信號(hào)觸發(fā),當(dāng)接收到其他系統(tǒng)拍照請(qǐng)求時(shí),獲取當(dāng)前圖像,將該圖像編碼為視頻流。
進(jìn)一步地,所述步驟s1中,采集音頻之前,還包括參數(shù)設(shè)置的步驟,設(shè)置的參數(shù)包括音頻錄制參數(shù)、圖片拍攝參數(shù)和視頻生成參數(shù);所述音頻錄制參數(shù)包括音頻碼率;所述圖片拍攝參數(shù)包括圖片大小和分辨率,所述視頻生成參數(shù)包括視頻幀率。
一種由音頻和圖片組成的視頻文件的檢索播放方法,該方法包括:
用戶選取待播放的視頻文件;
從視頻文件中獲取視頻流并逐幀解碼;
讀取幀的類型,如果是關(guān)鍵幀,則將該幀圖像展示給用戶;關(guān)鍵幀出現(xiàn)的時(shí)間與圖片嵌入的時(shí)間點(diǎn)對(duì)應(yīng);
當(dāng)用戶選中某個(gè)要播放的幀后,直接跳到選中幀對(duì)應(yīng)的時(shí)間進(jìn)行音頻播放。
進(jìn)一步地,所述關(guān)鍵幀為i幀。
一種由音頻和圖片組成的視頻文件的生成裝置,該裝置包括:
音頻采集單元:采集音頻,將采集的音頻編碼為音頻流;
圖片采集單元:采集與音頻時(shí)間同步的圖片,將采集的圖片編碼為視頻流,圖片的采集方式為自動(dòng)、手動(dòng)觸發(fā)或其他系統(tǒng)觸發(fā);
視頻文件生成單元:將視頻流與音頻流封裝生成視頻文件,所述視頻文件用于對(duì)嵌入了圖片后的音頻進(jìn)行索引和連續(xù)播放。
一種由音頻和圖片組成的視頻文件的檢索播放裝置,該裝置包括:
顯示單元,具有錄音檢索界面,該界面顯示視頻中所有關(guān)鍵幀圖像,當(dāng)用戶點(diǎn)擊某個(gè)關(guān)鍵幀圖像時(shí),自動(dòng)定位到該幀所在的錄音時(shí)間點(diǎn),即用戶拍攝該照片的錄音時(shí)間點(diǎn)播放音頻;
播放控制單元,對(duì)播放的音頻進(jìn)行控制,包括開始播放按鈕、暫停播放按鈕以及播放進(jìn)度條。
本發(fā)明的有益效果是:本發(fā)明可以在錄制音頻的同時(shí),以定時(shí)拍照、用戶點(diǎn)擊按鈕觸發(fā)拍照或者自動(dòng)檢測(cè)到場(chǎng)景轉(zhuǎn)換時(shí)拍照等方式觸發(fā)拍照,并在對(duì)應(yīng)時(shí)間點(diǎn)將圖片嵌入音頻中,最終生成一個(gè)方便檢索,尺寸合適的視頻文件(如mp4格式)。該視頻文件可以用普通視頻播放器播放,也可以用使用了本發(fā)明所公開的方法的播放器播放。使用后一種方式時(shí),用戶可以通過關(guān)鍵幀索引的方式,用圖片作為輔助信息快速定位并播放。采用本發(fā)明所述方法,可以在會(huì)議、講座、課堂等場(chǎng)景中,在采集的音頻中按時(shí)間軸不同位置補(bǔ)充附加圖片或照片,以便在播放時(shí)更好理解音頻內(nèi)容、更快速檢索和定位播放音頻。同時(shí),生成的視頻文件,其尺寸由音頻質(zhì)量和圖片尺寸決定。相較直接錄像得到的視頻文件,文件尺寸大大減小(在相同音頻質(zhì)量和圖片分辨率情況下)。
附圖說明
圖1為本發(fā)明實(shí)施過程的流程示意圖;
圖2為本發(fā)明實(shí)施中手機(jī)端錄制界面布局示意圖;
圖3為本發(fā)明實(shí)施中手機(jī)端播放界面布局示意圖。
具體實(shí)施方式
為了便于本領(lǐng)域技術(shù)人員的理解,下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步的描述。
本發(fā)明由音頻和圖片組成的視頻文件的生成方法,包括如下步驟:
1.用戶設(shè)置音頻錄制參數(shù)(音頻錄制格式為aac之后再編碼成mp3,默認(rèn)設(shè)置為固定碼率128kbps,也可以是192kbps等,默認(rèn)采樣頻率為44.1khz,單聲道或立體聲),設(shè)置圖片拍攝參數(shù)(即設(shè)置圖片大小、分辨率,例如常用值可以是4160x3120,4160x2336,3104x3104,3264x2448,3264x1840等),視頻生成參數(shù)(即設(shè)置幀率,默認(rèn)設(shè)置為25fps),并設(shè)置觸發(fā)拍照的條件,拍照的條件可以是定時(shí)拍照、用戶點(diǎn)擊按鈕觸發(fā)拍照或者自動(dòng)檢測(cè)到場(chǎng)景轉(zhuǎn)換時(shí)拍照。
當(dāng)用戶發(fā)出“開始錄音”命令時(shí)開始向文件中寫入音頻流,與此同時(shí),當(dāng)觸發(fā)拍照條件時(shí),攝像頭獲取一張照片并將其寫入視頻流。當(dāng)用戶發(fā)出“結(jié)束錄音”命令時(shí),將音頻流和視頻流壓縮、封裝并保存成視頻文件(如mp4格式)。
例如,當(dāng)該功能在手機(jī)app中實(shí)現(xiàn)時(shí),用戶進(jìn)入錄制主界面。主界面利用手機(jī)端多媒體框架采集視頻和音頻信息,并將信息顯示在界面上。除此之外,主界面還包括若干控制按鈕,分別觸發(fā)開始錄音、結(jié)束錄音、暫停錄音和拍照。當(dāng)用戶點(diǎn)擊“開始錄音”按鈕組件時(shí),app開始向文件中寫入音頻流,與此同時(shí),當(dāng)用戶點(diǎn)擊“拍照”按鈕組件時(shí),app將拍攝圖像并記錄此時(shí)的錄音時(shí)間點(diǎn)。當(dāng)用戶點(diǎn)擊“結(jié)束錄音”按鈕組件時(shí),app暫停向文件中寫入音頻、視頻流;同時(shí),app將壓縮好的音頻流和視頻流按照記錄的錄音時(shí)間點(diǎn)按時(shí)間順序進(jìn)行封裝,例如封裝成mp4文件。為便于說明,以下步驟以生成mp4格式的“音頻+圖片”文件為例,其他格式視頻文件的生成步驟與之類似。
當(dāng)該功能在手機(jī)app中實(shí)現(xiàn)時(shí),整個(gè)錄音框架可以采用mediarecorder,基本步驟為:
①首先調(diào)用mediarecorder.java中的方法比如start方法,會(huì)調(diào)用jni;
②mediarecoder.cpp和mediaplayerservice是通過binder機(jī)制來進(jìn)行進(jìn)程間的通信的,這時(shí)client端就是通過操作服務(wù)端返回的imediarecorder來對(duì)服務(wù)端進(jìn)行控制的;
③在java層調(diào)用start就是調(diào)用了stagefrightrecorder中的strat方法,在這里可以看到根據(jù)傳進(jìn)來的moutputformat值(輸出格式)會(huì)選擇不同的編碼類型的方法。
視頻流采用h264編碼格式,在主界面中,用戶拍攝的圖片作為視頻流中的一個(gè)i幀編碼,該圖片的圖像在視頻中保持靜止直到下一張照片出現(xiàn)。編碼時(shí)將畫面組(gop)的幀數(shù)上限提高,保證視頻中播放每張圖片時(shí)只有一個(gè)i幀。
2.用戶選擇定時(shí)拍照模式,并點(diǎn)擊開始錄制按鈕后,執(zhí)行以下過程。
①用戶設(shè)置定時(shí)時(shí)間t;
②按照用戶的設(shè)置為音視頻編碼器設(shè)置音頻碼率、視頻大小、視頻分辨率、視頻幀率,并初始化之后要用到的結(jié)構(gòu)。例如用ffmpeg編碼時(shí),應(yīng)執(zhí)行av_register_all()、av_frame_alloc()等并對(duì)avformatcontext結(jié)構(gòu)相關(guān)參數(shù)進(jìn)行設(shè)置;
③設(shè)置此次視頻壓縮的圖像組大小和b幀數(shù)量,這是為了防止生成過多無用的i幀。例如在ffmpeg中,可以設(shè)置avformatcontext結(jié)構(gòu)中g(shù)op_size、max_b_frames參數(shù)的值均為1500;
④用戶點(diǎn)擊“開始錄音”按鈕后,啟動(dòng)錄音和計(jì)時(shí)器,程序不斷從多媒體框架中獲取音頻流并寫入到aac音頻文件,壓縮過程中的音頻碼率與用戶的設(shè)定值相同;
⑤當(dāng)計(jì)時(shí)器計(jì)時(shí)到用戶定義的定時(shí)拍照時(shí)間時(shí)執(zhí)行下一步,同時(shí)將計(jì)時(shí)器清零;
⑥用多媒體框架從攝像頭獲取一幀圖像信息,其大小與分辨率與用戶之前使之的圖片拍攝參數(shù)相同,取得的圖像格式為yuv像素圖像;
⑦將yuv像素信息寫入一個(gè)視頻幀中,例如在ffmpeg中將yuv像素信息寫入一個(gè)avframe的data中。然后將這個(gè)視頻幀寫入到視頻流中進(jìn)行編碼,例如在ffmpeg中對(duì)應(yīng)執(zhí)行avcodec_encode_video2等函數(shù);
⑧計(jì)算出每個(gè)視頻幀重復(fù)的次數(shù),計(jì)算公式為:次數(shù)n=定時(shí)時(shí)間/幀率-1。將載有上一幀信息的視頻幀拷貝n次,并寫入到視頻流中進(jìn)行編碼。例如在ffmpeg中可以通過av_frame_copy(pframe2,pframe1)實(shí)現(xiàn)拷貝,然后執(zhí)行avcodec_encode_video2進(jìn)行視頻壓縮,將壓縮好的內(nèi)容用fwrite函數(shù)寫入h264視頻文件;
⑨如果用戶點(diǎn)擊“結(jié)束錄音”按鈕,則停止從多媒體框架獲取圖像和聲音,并將已經(jīng)編碼好的h264視頻文件和aac音頻文件封裝并保存成mp4格式的視頻文件。如果用戶沒有點(diǎn)擊“結(jié)束錄音”按鈕,則返回④。
3.用戶選擇點(diǎn)擊按鈕觸發(fā)拍照模式,并點(diǎn)擊開始錄制按鈕后,執(zhí)行以下過程。
①按照用戶的設(shè)置為音視頻編碼器設(shè)置音頻碼率、視頻大小、視頻分辨率、視頻幀率,并初始化之后要用到的結(jié)構(gòu)。例如用ffmpeg編碼時(shí),應(yīng)執(zhí)行av_register_all()、av_frame_alloc()等并對(duì)avformatcontext結(jié)構(gòu)相關(guān)參數(shù)進(jìn)行設(shè)置;
②設(shè)置此次視頻壓縮的圖像組大小和b幀數(shù)量,這是為了防止生成過多無用的i幀。例如在ffmpeg中,可以設(shè)置avformatcontext結(jié)構(gòu)中g(shù)op_size、max_b_frames參數(shù)的值均為1500;
③用戶點(diǎn)擊“開始錄音”按鈕后,啟動(dòng)錄音,程序不斷從多媒體框架中獲取音頻流并寫入到aac音頻文件,壓縮過程中的音頻碼率與用戶的設(shè)定值相同;
④當(dāng)用戶點(diǎn)擊“拍照”按鈕時(shí),記錄當(dāng)前時(shí)間,并用多媒體框架從攝像頭獲取一幀圖像信息,其大小與分辨率與用戶之前使之的圖片拍攝參數(shù)相同,取得的圖像格式為yuv像素圖像;
⑤將yuv像素信息寫入一個(gè)視頻幀中,例如在ffmpeg中將yuv像素信息寫入一個(gè)avframe的data中。然后將這個(gè)視頻幀寫入到視頻流中進(jìn)行編碼,例如在ffmpeg中對(duì)應(yīng)執(zhí)行avcodec_encode_video2等函數(shù);
⑥讀取上一次拍攝照片時(shí)的時(shí)間,計(jì)算與當(dāng)前照片拍攝時(shí)間的時(shí)間差,然后計(jì)算出每個(gè)視頻幀重復(fù)的次數(shù),計(jì)算公式為:次數(shù)n=時(shí)間差/幀率-1。將載有上一幀信息的視頻幀拷貝n次,并寫入到視頻流中進(jìn)行編碼。例如在ffmpeg中可以通過av_frame_copy(pframe2,pframe1)實(shí)現(xiàn)拷貝,然后執(zhí)行avcodec_encode_video2進(jìn)行視頻壓縮,將壓縮好的內(nèi)容用fwrite函數(shù)寫入h264視頻文件;
⑦如果用戶點(diǎn)擊“結(jié)束錄音”按鈕,則停止從多媒體框架獲取圖像和聲音,并將已經(jīng)編碼好的h264視頻文件和aac音頻文件封裝并保存成mp4格式的視頻文件。如果用戶沒有點(diǎn)擊“結(jié)束錄音”按鈕,則返回③。
4.用戶選擇自動(dòng)檢測(cè)場(chǎng)景轉(zhuǎn)換模式,并點(diǎn)擊開始錄制按鈕后,執(zhí)行以下過程。
①用戶設(shè)置感興趣的區(qū)域和觸發(fā)拍照的閾值th;
②按照用戶的設(shè)置為音視頻編碼器設(shè)置音頻碼率、視頻大小、視頻分辨率、視頻幀率,并初始化之后要用到的結(jié)構(gòu)。例如用ffmpeg編碼時(shí),應(yīng)執(zhí)行av_register_all()、av_frame_alloc()等并對(duì)avformatcontext結(jié)構(gòu)相關(guān)參數(shù)進(jìn)行設(shè)置;
③設(shè)置此次視頻壓縮的圖像組大小和b幀數(shù)量,這是為了防止壓縮過程生成過多無用的i幀。例如在ffmpeg中,可以設(shè)置avformatcontext結(jié)構(gòu)中g(shù)op_size、max_b_frames參數(shù)的值均為1500;
④當(dāng)用戶設(shè)置的幀率為xfps時(shí),每秒x次用多媒體框架從攝像頭獲取一幀圖像信息,其大小與分辨率與用戶之前使之的圖片拍攝參數(shù)相同,取得的圖像格式為yuv像素圖像;
⑤從上述圖像中提取出用戶設(shè)置的感興趣區(qū)域的圖像g;
⑥對(duì)當(dāng)前g進(jìn)行運(yùn)動(dòng)估計(jì),這個(gè)估計(jì)是相對(duì)于前一次獲取的g而言的,運(yùn)動(dòng)估計(jì)采用三步搜索法等快速算法以節(jié)省時(shí)間,如果不能匹配到對(duì)應(yīng)的宏塊,則運(yùn)動(dòng)矢量的長(zhǎng)度認(rèn)為是整個(gè)圖像的長(zhǎng);
⑦求得運(yùn)動(dòng)矢量后,對(duì)運(yùn)動(dòng)矢量的長(zhǎng)度進(jìn)行加和,然后除以感興趣區(qū)域的圖像大小,得到運(yùn)動(dòng)速度的一個(gè)指標(biāo)e;
⑧當(dāng)e大于用戶設(shè)定的閾值th時(shí),將當(dāng)前yuv像素信息寫入一個(gè)視頻幀中,例如在ffmpeg中將yuv像素信息寫入一個(gè)avframe的data中。然后將這個(gè)視頻幀寫入到視頻流中進(jìn)行編碼,例如在ffmpeg中對(duì)應(yīng)執(zhí)行avcodec_encode_video2等函數(shù)。否則,將載有上一幀信息的視頻幀拷貝并寫入到視頻流中進(jìn)行編碼。例如在ffmpeg中可以通過av_frame_copy(pframe2,pframe1)實(shí)現(xiàn)拷貝,然后執(zhí)行avcodec_encode_video2進(jìn)行視頻壓縮,將壓縮好的內(nèi)容用fwrite函數(shù)寫入h264視頻文件。
⑨如果用戶點(diǎn)擊“結(jié)束錄音”按鈕,則停止從多媒體框架獲取圖像和聲音,并將已經(jīng)編碼好的h264視頻文件和aac音頻文件封裝并保存成mp4格式的視頻文件。如果用戶沒有點(diǎn)擊“結(jié)束錄音”按鈕,則返回④。
5.在上述過程中如果用戶按下“暫停錄音”按鈕,則停止獲取錄音,并向音頻流中寫入靜音音頻,直至用戶按下“恢復(fù)錄音”按鈕,之后繼續(xù)利用多媒體框架獲取錄音并寫入音頻流。
6.用本發(fā)明的檢索播放裝置播放錄制好的視頻文件(如mp4格式)時(shí),用戶可以選擇進(jìn)入一個(gè)錄音檢索界面,這個(gè)界面顯示了視頻中所有i幀的圖像,當(dāng)用戶點(diǎn)擊某個(gè)i幀圖像時(shí),自動(dòng)定位到那個(gè)幀所在的錄音時(shí)間點(diǎn),即用戶拍攝該照片的錄音時(shí)間點(diǎn)播放音頻。
獲取所有i幀圖像的方法具體步驟如下:
①用戶從文件中選取待播放的視頻文件(如mp4格式);
②從視頻文件中獲取視頻流并逐幀解碼,在ffmpeg中,即解碼獲得一系列avframe;
③讀取幀的類型,如果是i幀,就把這一幀圖像的縮略圖及其是第幾幀、拍攝時(shí)間顯示給用戶看,在ffmpeg中,可以通過pict_type屬性查看該幀是否是i幀;
④當(dāng)用戶選中某個(gè)要播放的幀后,就直接跳到那一幀對(duì)應(yīng)的時(shí)間進(jìn)行播放。
通過該方法,用戶可以得到一個(gè)尺寸比純錄音文件和圖片文件尺寸總和略大的視頻,并可以很方便地根據(jù)圖像來檢索錄音的內(nèi)容。
7.錄制視頻文件的頁面布局方面存在三大部分:對(duì)于用戶拍照條件的選擇、對(duì)于用戶拍照的操作(包括但不限于開始拍照、停止拍照等操作)、對(duì)于用戶錄音的操作(包括但不限于開始錄音、停止錄音等操作),附圖2為安卓手機(jī)為例的界面布局;
其中,拍攝畫面為攝像頭捕捉的畫面,錄制操作包括:拍照,開始錄音,暫停錄音,結(jié)束,結(jié)束后將所有文件保存待后續(xù)操作;
播放畫面包括兩部分:幀捕捉畫面及播放操作,附圖3以安卓手機(jī)為例介紹播放界面布局。
其中,幀捕捉畫面為采集的圖片(i幀對(duì)應(yīng)照片),點(diǎn)擊將以畫面對(duì)應(yīng)的時(shí)間點(diǎn)播放音頻;播放操作包括:開始播放、暫停播放以及播放進(jìn)度條。
本發(fā)明不僅局限于上述具體實(shí)施方式,本領(lǐng)域一般技術(shù)人員根據(jù)本發(fā)明公開的內(nèi)容,可以采用其它多種具體實(shí)施方案實(shí)施本發(fā)明。因此,凡是采用本發(fā)明的設(shè)計(jì)結(jié)構(gòu)和思路,做一些簡(jiǎn)單的變化或更改的設(shè)計(jì),都落入本發(fā)明保護(hù)范圍。