国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種視頻的拍攝方法及裝置與流程

      文檔序號(hào):11157474閱讀:1105來(lái)源:國(guó)知局
      一種視頻的拍攝方法及裝置與制造工藝

      本發(fā)明涉及通信領(lǐng)域,尤其涉及一種視頻的拍攝方法及裝置。



      背景技術(shù):

      隨著監(jiān)控系統(tǒng)的不斷發(fā)展,出現(xiàn)了搭載智能操作系統(tǒng)的監(jiān)控終端設(shè)備,通過(guò)智能操作系統(tǒng)可以實(shí)現(xiàn)更多功能,使視頻監(jiān)控系統(tǒng)向智能化,數(shù)字化,網(wǎng)絡(luò)化,高清化時(shí)代邁進(jìn)。目前,在嵌入式行業(yè)的智能操作系統(tǒng)中,google的Android操作系統(tǒng)全球市場(chǎng)占有率高達(dá)75%,Android系統(tǒng)的優(yōu)勢(shì)在于其開(kāi)放性和免費(fèi)的服務(wù),是一個(gè)對(duì)第三方軟件完全開(kāi)放的平臺(tái),開(kāi)發(fā)者在為其開(kāi)發(fā)程序時(shí)擁有很大的自由度,Android獲得了大量生產(chǎn)廠商和開(kāi)發(fā)者的支持,正是這種特點(diǎn)讓Android系統(tǒng)應(yīng)用到了移動(dòng)終端外的越來(lái)也多的領(lǐng)域。如電視機(jī)頂盒,智能手表,車載系統(tǒng),汽車導(dǎo)航和行車記錄儀等。

      搭載Android系統(tǒng)的智能手機(jī)或平板電腦只需要通過(guò)安裝行車記錄軟件就可以實(shí)現(xiàn)錄像來(lái)當(dāng)作行車記錄儀使用,并且可以實(shí)現(xiàn)同時(shí)運(yùn)行導(dǎo)航軟件進(jìn)行導(dǎo)航,這些都是之前的行車記錄儀所不具備的。但目前的Android系統(tǒng)的智能手機(jī)或平板電腦只能單次循環(huán)文件存儲(chǔ),不能自動(dòng)連續(xù)循環(huán)存儲(chǔ),所以當(dāng)運(yùn)行Android的行車記錄設(shè)備要作為行車記錄儀使用時(shí)就要保證滿足實(shí)時(shí)視頻不丟幀連續(xù)分段錄像的要求。



      技術(shù)實(shí)現(xiàn)要素:

      本發(fā)明的目的之一是提供一種視頻的拍攝方法,其主要解決現(xiàn)有的實(shí)時(shí)視頻丟幀的缺點(diǎn)。

      第一方面,提供一種視頻的拍攝的方法,所述方法包括如下步驟:

      智能終端配置Media Recorder添加兩個(gè)API接口,所述兩個(gè)API接口包括:Media Recorder.save和Media Recorder.restart接口;

      智能終端調(diào)用所述Media Recorder.save和所述Media Recorder.restart接口控制MPEG4Writer對(duì)視頻文件進(jìn)行分段存儲(chǔ)。

      可選的,所述智能終端調(diào)用所述Media Recorder.save和所述Media Recorder.restart接口控制MPEG4Writer對(duì)視頻文件進(jìn)行分段存儲(chǔ)具體為:

      當(dāng)智能終端調(diào)用所述Media Recorder.save和所述Media Recorder.restart后,完成音視頻流的分段并寫(xiě)入第一封裝文件,然后將分段前的索引信息及參數(shù)更新,再完成對(duì)第一封裝文件的頭部寫(xiě)入并將音視頻流指向新的分段第二封裝文件。

      可選的,所述方法還包括:

      所述第二封裝文件與第一封裝文件在I幀與之前P幀處切開(kāi)。

      可選的,所述方法還包括:

      將分段的視頻文件和音頻文件同步。

      可選的,所述方法還包括:

      智能終端對(duì)記錄的視頻文件軌跡的數(shù)據(jù)信息進(jìn)行參數(shù)的重新設(shè)置。

      第二方面,提供一種智能終端,其特征在于,所述智能終端包括:

      配置單元,用于配置Media Recorder添加兩個(gè)API接口,所述兩個(gè)API接口包括:Media Recorder.save和Media Recorder.restart接口;

      調(diào)用單元,用于調(diào)用所述Media Recorder.save和所述Media Recorder.restart接口控制MPEG4Writer對(duì)視頻文件進(jìn)行分段存儲(chǔ)。

      可選的,所述調(diào)度單元,具體用于當(dāng)調(diào)用所述Media Recorder.save和所述Media Recorder.restart后,完成音視頻流的分段并寫(xiě)入第一封裝文件,然后將分段前的索引信息及參數(shù)更新,再完成對(duì)第一封裝文件的頭部寫(xiě)入并將音視頻流指向新的分段第二封裝文件。

      可選的,所述第二封裝文件與第一封裝文件在I幀與之前P幀處切開(kāi)。

      可選的,所述智能終端還包括:

      同步單元,用于將分段的視頻文件和音頻文件同步。

      可選的,所述配置單元,還用于對(duì)記錄的視頻文件軌跡的數(shù)據(jù)信息進(jìn)行參數(shù)的重新設(shè)置。

      本領(lǐng)域普通技術(shù)人員將了解,雖然下面的詳細(xì)說(shuō)明將參考圖示實(shí)施例、附圖進(jìn)行,但本發(fā)明并不僅限于這些實(shí)施例。而是,本發(fā)明的范圍是廣泛的,且意在僅通過(guò)后附的權(quán)利要求限定本發(fā)明的范圍。

      附圖說(shuō)明

      通過(guò)閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:

      圖1為根據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例提供的視頻的拍攝方法的流程圖。

      圖2為本發(fā)明更換后的視頻處理流程圖。

      圖3為根據(jù)本發(fā)明另一個(gè)優(yōu)選實(shí)施例提供的智能終端的結(jié)構(gòu)圖。

      圖4為本發(fā)明提供的一種智能終端的結(jié)構(gòu)圖。

      具體實(shí)施方式

      在更加詳細(xì)地討論示例性實(shí)施例之前應(yīng)當(dāng)提到的是,一些示例性實(shí)施例被描述成作為流程圖描繪的處理或方法。雖然流程圖將各項(xiàng)操作描述成順序的處理,但是其中的許多操作可以被并行地、并發(fā)地或者同時(shí)實(shí)施。此外,各項(xiàng)操作的順序可以被重新安排。當(dāng)其操作完成時(shí)所述處理可以被終止,但是還可以具有未包括在附圖中的附加步驟。所述處理可以對(duì)應(yīng)于方法、函數(shù)、規(guī)程、子例程、子程序等等。

      在上下文中所稱“計(jì)算機(jī)設(shè)備”,也稱為“電腦”,是指可以通過(guò)運(yùn)行預(yù)定程序或指令來(lái)執(zhí)行數(shù)值計(jì)算和/或邏輯計(jì)算等預(yù)定處理過(guò)程的智能電子設(shè)備,其可以包括處理器與存儲(chǔ)器,由處理器執(zhí)行在存儲(chǔ)器中預(yù)存的存續(xù)指令來(lái)執(zhí)行預(yù)定處理過(guò)程,或是由ASIC、FPGA、DSP等硬件執(zhí)行預(yù)定處理過(guò)程,或是由上述二者組合來(lái)實(shí)現(xiàn)。計(jì)算機(jī)設(shè)備包括但不限于服務(wù)器、個(gè)人電腦、筆記本電腦、平板電腦、智能手機(jī)等。

      后面所討論的方法(其中一些通過(guò)流程圖示出)可以通過(guò)硬件、軟件、固件、中間件、微代碼、硬件描述語(yǔ)言或者其任意組合來(lái)實(shí)施。當(dāng)用軟件、固件、中間件或微代碼來(lái)實(shí)施時(shí),用以實(shí)施必要任務(wù)的程序代碼或代碼段可以被存儲(chǔ)在機(jī)器或計(jì)算機(jī)可讀介質(zhì)(比如存儲(chǔ)介質(zhì))中。(一個(gè)或多個(gè))處理器可以實(shí)施必要的任務(wù)。

      這里所公開(kāi)的具體結(jié)構(gòu)和功能細(xì)節(jié)僅僅是代表性的,并且是用于描述本發(fā)明的示例性實(shí)施例的目的。但是本發(fā)明可以通過(guò)許多替換形式來(lái)具體實(shí)現(xiàn),并且不應(yīng)當(dāng)被解釋成僅僅受限于這里所闡述的實(shí)施例。

      應(yīng)當(dāng)理解的是,雖然在這里可能使用了術(shù)語(yǔ)“第一”、“第二”等等來(lái)描述各個(gè)單元,但是這些單元不應(yīng)當(dāng)受這些術(shù)語(yǔ)限制。使用這些術(shù)語(yǔ)僅僅是為了將一個(gè)單元與另一個(gè)單元進(jìn)行區(qū)分。舉例來(lái)說(shuō),在不背離示例性實(shí)施例的范圍的情況下,第一單元可以被稱為第二單元,并且類似地第二單元可以被稱為第一單元。這里所使用的術(shù)語(yǔ)“和/或”包括其中一個(gè)或更多所列出的相關(guān)聯(lián)項(xiàng)目的任意和所有組合。

      這里所使用的術(shù)語(yǔ)僅僅是為了描述具體實(shí)施例而不意圖限制示例性實(shí)施例。除非上下文明確地另有所指,否則這里所使用的單數(shù)形式“一個(gè)”、“一項(xiàng)”還意圖包括復(fù)數(shù)。還應(yīng)當(dāng)理解的是,這里所使用的術(shù)語(yǔ)“包括”和/或“包含”規(guī)定所陳述的特征、整數(shù)、步驟、操作、單元和/或組件的存在,而不排除存在或添加一個(gè)或更多其他特征、整數(shù)、步驟、操作、單元、組件和/或其組合。

      還應(yīng)當(dāng)提到的是,在一些替換實(shí)現(xiàn)方式中,所提到的功能/動(dòng)作可以按照不同于附圖中標(biāo)示的順序發(fā)生。舉例來(lái)說(shuō),取決于所涉及的功能/動(dòng)作,相繼示出的兩幅圖實(shí)際上可以基本上同時(shí)執(zhí)行或者有時(shí)可以按照相反的順序來(lái)執(zhí)行。

      下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述。

      根據(jù)本發(fā)明的一個(gè)方面,提供了一種視頻的拍攝方法。其中,上述方法應(yīng)用在智能終端上,該智能終端包括但不限于:智能手機(jī)、平板電腦、PDA等智能設(shè)備。

      在一個(gè)實(shí)施例中,上述視頻的拍攝方法可以用于智能終端中,需要說(shuō)明的是,上述智能終端僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的智能終端如果適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并以引用方式包含于此。

      移動(dòng)設(shè)備的存儲(chǔ)空間有限,為了在有限存儲(chǔ)空間內(nèi)實(shí)現(xiàn)長(zhǎng)時(shí)間不間斷的錄像就要實(shí)行循環(huán)錄制方式。目前視頻信息的循環(huán)錄制應(yīng)用比較廣泛,一種方式是單個(gè)文件進(jìn)行循環(huán)錄制的方法,單一文件中的視頻數(shù)據(jù)達(dá)到設(shè)定幀數(shù)容量上限后通過(guò)移動(dòng)位置指針到最前面覆蓋最早的視頻幀實(shí)現(xiàn)循環(huán)錄制。

      使用這種方式時(shí)單個(gè)文件最大只有2G,保存的視頻數(shù)據(jù)有限,并且音視頻幀不是順序排列的造成索引部分創(chuàng)建很復(fù)雜。如果遇到死機(jī)等特殊情況時(shí)造成整個(gè)視頻文件索引部分缺失.對(duì)這樣的文件修復(fù)會(huì)變得非常困難,以至于造成整個(gè)文件報(bào)廢,并且對(duì)于行車記錄儀來(lái)說(shuō)只有單一文件也不方便自動(dòng)保存事故發(fā)生時(shí)錄制段。而且目前Android平臺(tái)也沒(méi)有提供這種單個(gè)文件循環(huán)封裝的方式。

      另一種普遍使用的是采用日志處理的方法,即通過(guò)多個(gè)文件實(shí)現(xiàn)循環(huán)錄制。比如設(shè)定3分鐘產(chǎn)生一個(gè)視頻文件,通過(guò)刪除最早產(chǎn)生的文件便可達(dá)到循環(huán)錄制的目的。這種方式實(shí)現(xiàn)簡(jiǎn)單,Andnoid系統(tǒng)可以實(shí)現(xiàn)(即將時(shí)間最早的錄像視頻文件刪掉再存儲(chǔ)新的錄像視頻文件,可實(shí)現(xiàn)循環(huán)存儲(chǔ)),但在Android平臺(tái)上會(huì)存在前后兩個(gè)文件中間視頻幀數(shù)據(jù)丟失現(xiàn)象。

      基于上述原因主流的錄像監(jiān)控設(shè)備都采用了分段存儲(chǔ)的方式,市面上的行車記錄儀都使用這種存儲(chǔ)方式實(shí)現(xiàn)的,并且大多數(shù)記錄儀不存在錄像不連續(xù)的問(wèn)題,但在Android平臺(tái)上采用分段錄像卻會(huì)有產(chǎn)生丟幀現(xiàn)象。

      Android平臺(tái)分段錄像不連續(xù)原因分析

      Android平臺(tái)的錄像功能是通過(guò)應(yīng)用層的MediaRecorder類接口實(shí)現(xiàn)。通過(guò)其可以在上層應(yīng)用中輕松實(shí)現(xiàn)錄像的配置及控制。但是通過(guò)MediaRecorder實(shí)現(xiàn)分段錄像,需要通過(guò)先調(diào)用其stop方法,然后對(duì)MediaRecorder進(jìn)行重新配置,設(shè)置新的封裝文件名,最后再調(diào)用start方法完成,stop和start這兩個(gè)方法調(diào)用到底層最終會(huì)調(diào)用XXXWriterr組合器的stop和Start方法。

      XXXWriter運(yùn)行stop方法時(shí)會(huì)調(diào)用編碼器的stop方法,此時(shí)編碼器就會(huì)停止工作。而編碼器執(zhí)行stop方法是也會(huì)調(diào)用Camera服務(wù)或MIC服務(wù)的stopRecordering方法,暫停Camera和MIC的錄制服務(wù),此時(shí)Camera和MIC設(shè)備就會(huì)停止錄制工作,錄像任務(wù)就會(huì)停止。并且執(zhí)行stop方法時(shí)需要將還保存在緩存中的音視頻數(shù)據(jù)和索引數(shù)據(jù)寫(xiě)入封裝文件中,這部分時(shí)間也會(huì)隨著分辨率等參數(shù)提高(碼率增加)和錄像時(shí)間(索引數(shù)據(jù)會(huì)增加)而增加,而XXXWriter中運(yùn)行引start方法時(shí)調(diào)用關(guān)系與stop相同,最終使Camera服務(wù)或MIC服務(wù)以及編碼器重新配置開(kāi)始工作。

      根據(jù)程序調(diào)用流程進(jìn)行分析,丟禎時(shí)間有兩個(gè)來(lái)源,一部分為硬件設(shè)備停止再重新啟動(dòng)過(guò)程耗時(shí)和軟件的釋放和重新初始化過(guò)程的時(shí)間消耗,另一部分來(lái)源于調(diào)用stop方法引發(fā)的音視頻緩存數(shù)據(jù)集索引緩存數(shù)據(jù)的保存操作,并且部分時(shí)間會(huì)隨著錄像配置參數(shù)以及錄像時(shí)間的提高而增加。

      請(qǐng)參考圖1,圖1為根據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例的提供的視頻的拍攝方法,該方法由智能終端來(lái)完成,該方法如圖1所示,包括如下步驟:

      步驟S101、智能終端配置Media Recorder添加兩個(gè)API接口,所述兩個(gè)API接口包括:Media Recorder.save和Media Recorder.restart接口;

      現(xiàn)有的錄像功能在應(yīng)用層使用的是MediaRecorder的API類,要實(shí)現(xiàn)長(zhǎng)時(shí)間的分段錄像,就會(huì)需要先停止當(dāng)前錄像再開(kāi)啟的方式實(shí)現(xiàn),通過(guò)調(diào)用其stop和start方法實(shí)現(xiàn),而這兩個(gè)方法追蹤到底層就是進(jìn)行視頻封裝結(jié)束時(shí)候關(guān)閉了當(dāng)前的視頻和聲音流,然后開(kāi)啟新封裝時(shí)再開(kāi)啟,這一關(guān)一開(kāi)的過(guò)程必然造成丟幀。若能在不關(guān)閉當(dāng)前視頻流的情況下,直接開(kāi)啟新的封裝文件將視頻流切斷并指向新的封裝文件,并且同時(shí)對(duì)原封裝文件進(jìn)行封裝工作,便可以解決丟頓問(wèn)題,實(shí)現(xiàn)無(wú)丟幀分段的優(yōu)化,音頻方面也是一樣。所以考慮不使用stop和start方法來(lái)進(jìn)行分段,而是通過(guò)一種方法,可以使上層應(yīng)用通過(guò)設(shè)置或直接控制的方法來(lái)控制組合器完成分段工作。

      完成上述操作還需要考慮何時(shí)進(jìn)行分段操作和新建封裝文件名稱的問(wèn)題,由于通過(guò)在調(diào)用Media Recorder.start方法前通過(guò)設(shè)置參數(shù)組合器計(jì)時(shí)來(lái)實(shí)現(xiàn)分段通知,調(diào)用start方法錄像開(kāi)始后組合器計(jì)時(shí)就不能再更改。為了安全起見(jiàn)需要迅速進(jìn)行分段并保存,所以直接添加save和restart兩個(gè)調(diào)用方法,接口參數(shù)為新封裝容器文件名,這個(gè)方法只能在start和stop方法之間調(diào)用,可以由錄像應(yīng)用控制調(diào)用的時(shí)機(jī),符合靈活控制時(shí)間和文件名的要求。

      對(duì)Media Recorder添加兩個(gè)API接口,即添加Media Recorder.save和Media Recorder.restart接口,以文件名為參數(shù),可以使上層應(yīng)用控制視頻分段時(shí)間和名稱,同時(shí)添加對(duì)應(yīng)接口的底層實(shí)現(xiàn),即完成對(duì)MPEG4Writer的分段實(shí)現(xiàn)。

      步驟S102、智能終端調(diào)用Media Recorder.save和Media Recorder.restart接口控制MPEG4Writer對(duì)視頻文件進(jìn)行分段存儲(chǔ)。

      本發(fā)明提供的技術(shù)方案通過(guò)增加2個(gè)接口,save和restart方法負(fù)責(zé)通知組合器進(jìn)行分段,具體實(shí)現(xiàn)在MPEG4Writer中完成,這兩個(gè)方法不會(huì)去調(diào)用Media Source.stop方法去停止音視頻流。

      當(dāng)使其能在save和restart方法被調(diào)用后,完成音視頻流的分段并寫(xiě)入“封裝文件1”,然后將分段前的索引信息及參數(shù)更新,再完成對(duì)“封裝文件1”的頭部寫(xiě)入并將音視頻流指向新的分段“封裝文件2"。因?yàn)橐粢曨l流都是以幀為單位存儲(chǔ)的,所以只要在正確的時(shí)間點(diǎn)將音視頻流中的幀數(shù)據(jù)存入“封裝文件2",并保證參數(shù)和索引的正確寫(xiě)入,就能保證能正常分段。

      調(diào)整后的流程如圖2所示。

      可選的,上述步驟S102實(shí)現(xiàn)方法具體可以為:

      當(dāng)使其能在Media Recorder.save和Media Recorder.restart方法被調(diào)用后,完成音視頻流的分段并寫(xiě)入“封裝文件1”,然后將分段前的索引信息及參數(shù)更新,再完成對(duì)“封裝文件1”的頭部寫(xiě)入并將音視頻流指向新的分段“封裝文件2"。因?yàn)橐粢曨l流都是以幀為單位存儲(chǔ)的,所以只要在正確的時(shí)間點(diǎn)將音視頻流中的幀數(shù)據(jù)存入“封裝文件2",并保證參數(shù)和索引的正確寫(xiě)入,就能保證能正常分段。

      可選的,上述正常分段的方法具體可以為:

      將視頻文件在I幀與之前P幀處切開(kāi)分成多個(gè)視頻分段。具體實(shí)現(xiàn)方法可以為:

      視頻編碼流的切分:視頻流經(jīng)過(guò)常見(jiàn)的編碼器編碼后存在I幀,B幀和P幀,I幀為關(guān)鍵幀,屬于幀內(nèi)壓縮;P幀是向前搜索,B幀是雙向搜索。P幀和B幀都是基于I幀來(lái)壓縮數(shù)據(jù)。因?yàn)殇浵袷菍?shí)時(shí)壓縮的,對(duì)時(shí)間要求較高,不會(huì)產(chǎn)生B幀。如果只存在I幀和P幀的情況下,何時(shí)將視頻流切開(kāi)并引向新封裝是關(guān)健點(diǎn)。如果正好在I幀與之前P幀處切開(kāi),則分段的兩個(gè)視頻都不會(huì)存在P幀無(wú)法播放清況。但是如果切開(kāi)發(fā)生在P幀之前就會(huì)造成這個(gè)P幀之后到下個(gè)I幀為止的所有P幀都無(wú)法播放。因?yàn)榉侄吻虚_(kāi)后下一段的P幀缺少了I幀(被切分到了上一分段),這個(gè)I幀之后的P幀是無(wú)法播放的,所以需要選擇正好在I幀到達(dá)的時(shí)候進(jìn)行分段。同時(shí)因?yàn)殇浵駮r(shí)編碼的音頻軌跡都是幀內(nèi)壓縮,音頻軌跡隨時(shí)都可以分段。

      可選的,上述方法在正常分段以后還可以包括,將分段的視頻文件和音頻文件同步。

      音視頻的同步:進(jìn)行分段時(shí),需要考慮對(duì)音視頻的同步,保證音頻和視頻應(yīng)該大體都是在同一個(gè)時(shí)間點(diǎn)上進(jìn)行分段的,如果出現(xiàn)音視頻中某一方落后太多就會(huì)影響到當(dāng)前分段文件和下一個(gè)分段封裝文件,造成錄像的部分時(shí)間出現(xiàn)有圖像沒(méi)有聲音或有聲音沒(méi)圖像現(xiàn)象,這就需要視頻軌跡線程及時(shí)的通知音頻軌跡線程進(jìn)行分段操作。

      緩沖區(qū)的處理:進(jìn)行分段時(shí),如果存在音視頻兩個(gè)軌跡,就會(huì)存在有兩個(gè)Chunk鏈表。需要實(shí)現(xiàn)find ChunkToWrite函數(shù)可以按照分段節(jié)點(diǎn),盡早找出分段時(shí)間節(jié)點(diǎn)前的Chunk,而時(shí)間節(jié)點(diǎn)后的Chunk即使能找到也要暫時(shí)忽略,等待下一個(gè)分段寫(xiě)入。

      參數(shù)的重新設(shè)置:軌跡線程因?yàn)樾枰涗洰?dāng)前軌跡的數(shù)據(jù)信息,所以維護(hù)了大量的參數(shù),進(jìn)行分段時(shí),需要根據(jù)需要將一些參數(shù)恢復(fù)到如同當(dāng)前軌跡線程剛剛啟動(dòng)時(shí)的狀態(tài),使上次分段參數(shù)不影響新的分段。

      MPEG4組合器連續(xù)分段實(shí)現(xiàn)

      1)接口添加:

      MPEG4組合器正常使用需要首先添加從應(yīng)用層到組合器的調(diào)用接日,再完成組合器的分段實(shí)現(xiàn).Restart接口的添加,需要跨越Java層、JNJ層、Binder通信機(jī)制,才能最終到達(dá)stagefrightRecorder,再啟動(dòng)組合器,完成從Java層到底層的完整的接口調(diào)用。

      具體的添加方法如下:

      (1)Java層:添加MediaRecorder類的save和restart函數(shù),最終會(huì)調(diào)用JNI的_save和_restart方法。Java層函數(shù)接受文件名參數(shù),就會(huì)創(chuàng)建對(duì)應(yīng)路徑文件,生成一個(gè)文件描述符,并將這個(gè)文件描述符通過(guò)_restart方法傳遞到JNI層。所以新分段文件在Java層就己經(jīng)創(chuàng)建,Java層以下只需要傳遞文件描述符即可。

      (2)JNI層:Java層調(diào)用到的_save和_restart函數(shù)的具體實(shí)現(xiàn),首先需要建立save和restart函數(shù)與具體實(shí)現(xiàn)的聯(lián)系,添加方法聲明,在這里會(huì)創(chuàng)建一個(gè)Media Recorder是C++對(duì)象,該對(duì)象是由Media player Service創(chuàng)建的,它和Medie player Service是通過(guò)Binder機(jī)制來(lái)進(jìn)行進(jìn)程間的通信的,這時(shí)客戶端就是通過(guò)操作服務(wù)端返回的IMediaRe

      corder來(lái)對(duì)服務(wù)端進(jìn)行控制的。

      (3)Binder通信:IMediaRecorder是Binder的客戶端與服務(wù)端通信的協(xié)議實(shí)現(xiàn),繼承了分別用于客戶端和服務(wù)端的接口,即BpInterface和BnInterface。通過(guò)這兩個(gè)接口,客戶端和服務(wù)端分別實(shí)現(xiàn)成兩個(gè)類BpMediaRecorder和BnMediaRecorder。IMedia

      Recorder繼承了BpMediaRecorder類,并且在MediaRecorder.cpp中實(shí)例化了一個(gè)IMedia

      Recorder的對(duì)象,而MediaRecorderClient則繼承并實(shí)現(xiàn)了BnMediaRecorder的接口。在BnMediaRecorder中有一個(gè)onTransact方法,它與BpMediaRecorder中調(diào)用IBinder.

      transact方法是對(duì)應(yīng)的。這樣,在BnMediaRecorder的onTransact方法中。根據(jù)不同的code調(diào)用不同的IMediaRecorder中的方法,而這些方法都是在MediaRecorderClient中實(shí)現(xiàn)的。以此就完成了MediaRecorder與MediaRecorderChient之間的Binder通訊。

      當(dāng)調(diào)用到IMediaRecorder的save和restart方法時(shí),就會(huì)通過(guò)Binder機(jī)制,發(fā)送code:SAVE和code:RESTART到繼承了BnMediaRecorder的MediaRecorderClient類中,MediaRecoarderClient會(huì)根據(jù)code執(zhí)行本地實(shí)現(xiàn)的save()和restart(fd)程序,完成Binder通訊。程序最終就會(huì)調(diào)用到StagefrightRecorder中,此時(shí)就會(huì)直接調(diào)用之前實(shí)例化的組合器的save和restart函數(shù),至此整個(gè)API的添加完成,整個(gè)流程可以完成Java層到底層MPEG4組合器的接口調(diào)用。

      MPEG4組合器接收到StagefrightRecorder傳來(lái)的save調(diào)用后,就通知正在工作的寫(xiě)線程寫(xiě)入索引信息和頭部信息,完成分段文件結(jié)束操作,收到StagefrightRecorder傳來(lái)的restart調(diào)用后將restart的參數(shù),即新封裝文件的文件描述符保存,并更新為MPEG4組合器的當(dāng)前操作文件及初始化封裝文件參數(shù),完成封裝文件的切換。

      2)分段流程的控制

      當(dāng)MPEG4組合器中的軌跡線程的durationUs大于或等于mMaxFileDurationLimit

      Us(如3分鐘)時(shí),通知軌跡線程需要進(jìn)入分段流程,具體處理都是在軌跡線程中和寫(xiě)線程完成的。進(jìn)入分段期間就需要考慮視頻編碼流的切分和音視頻軌跡的同步問(wèn)題,為了解決這種時(shí)間同步問(wèn)題,使用變量形式進(jìn)行線程的同步,具體控制方式如下:

      首先介紹以下幾個(gè)重要的狀態(tài)控制參數(shù):

      mIsRestartState:這個(gè)變量貫穿整個(gè)分段過(guò)程。如果為true表明組合器處于可以分段狀態(tài),如果為false表明組合器沒(méi)有處于不可以分段狀態(tài)。

      mIsRestarting:如果為true表明組合器處于正在分段進(jìn)行中,軌跡線程同步打包幀數(shù)據(jù)成chunk鏈表.如果為false且mIsRestarState為true表示當(dāng)前所處的音頻或視頻軌跡線程處于等待分段狀態(tài),此時(shí)軌跡線程一直查找合適的時(shí)間點(diǎn)(視頻為等待關(guān)鍵幀,音頻則等待視頻軌跡線程的通知)進(jìn)行分段操作。

      mIsRestartSaving:如果為true表明組合器處于保存封裝文件狀態(tài),寫(xiě)線程保存分段封裝文件。

      mRestartTrackTimestampUs和mRestartChunkTimestampUs:用于記錄軌跡進(jìn)程的幀分段時(shí)間戳和打包成chunk的分段時(shí)間戳,用于寫(xiě)線程進(jìn)行分段保存封裝文件。

      mIFrameCount,mPFrameCount,mBFrameCount:用于記錄視頻軌跡進(jìn)程的I幀,P幀和B幀,用于視頻幀與音頻幀的同步,解決丟幀問(wèn)題;

      mIsRestartCal:如果為true表示對(duì)應(yīng)的軌跡線程分段己經(jīng)完成,軌跡線程進(jìn)行參數(shù)重置;

      mRestartTrackHasCompleteWrit和mNotRestartTrackHasCompleteWrite:當(dāng)兩者為true時(shí)表示寫(xiě)線程分段前的Chunk已經(jīng)寫(xiě)入了封裝文件,是作為判斷是否可以進(jìn)行寫(xiě)入封裝索引等結(jié)束封裝操作的判斷標(biāo)志,若音視頻的軌跡線程己完成分段,并將分段時(shí)間節(jié)點(diǎn)前Chunk包寫(xiě)入封裝文件,通知上層調(diào)用save接口,就會(huì)開(kāi)始索引數(shù)據(jù)寫(xiě)入和更新頭部參數(shù)信息。上層調(diào)用restart接口,重置MPEG4Writer組合器初始化新分段封裝文件信息。

      音視頻幀同步參數(shù)必須選用全局變量,因?yàn)榧词乖诜侄螘r(shí)軌跡線程也需要不間斷的讀取音視頻的幀數(shù)據(jù)進(jìn)行處理并加入到緩沖區(qū)中,所以任何阻塞函數(shù)都不允許出現(xiàn)在軌跡線程中。

      軌跡線程實(shí)現(xiàn)

      當(dāng)通知軌跡線程需要進(jìn)入分段流程時(shí),視頻軌跡線程根據(jù)mIFrameCount,mPFrame

      Count,mBFrameCount三個(gè)參數(shù)進(jìn)行統(tǒng)計(jì),在下一個(gè)I幀到來(lái)前,通過(guò)bufferChunk對(duì)幀進(jìn)行打包,確保視頻不丟幀,并記錄幀的分段時(shí)間戳mRestartTrackTimestampUs和chunk的分段時(shí)間戳mRestartChunkTimestampUs;然后視頻軌跡重置視頻軌跡進(jìn)程相關(guān)參數(shù)。當(dāng)視頻軌跡的分段chunk打包后,通知音頻軌跡進(jìn)行bufferchunk打包,并記錄幀的分段時(shí)間戳mRestartTrackTimestampUs和chunk的分段時(shí)間戳mRestartChunkTime

      stampUs,音頻軌跡重置音頻軌跡進(jìn)程相關(guān)參數(shù)。

      mRestartTrackTimestampUs和mRestartChunkTimestampUs是作為findChunkToWrite函數(shù)快速搜索分段節(jié)點(diǎn)前Chunk的依據(jù)。

      4)軌跡線程參數(shù)的重置

      這些參數(shù)那是作為軌跡線程運(yùn)行的重要參數(shù),是作為計(jì)算封裝文件頭部參數(shù)的主要參考值。

      表1:

      參閱圖3,圖3為本發(fā)明提供的一種智能終端30,所述智能終端包括:

      配置單元301,用于配置Media Recorder添加兩個(gè)API接口,所述兩個(gè)API接口包括:Media Recorder.save和Media Recorder.restart接口;

      調(diào)用單元302,用于調(diào)用所述Media Recorder.save和所述Media Recorder.restart接口控制MPEG3Writer對(duì)視頻文件進(jìn)行分段存儲(chǔ)。

      可選的,調(diào)度單元302,具體用于當(dāng)調(diào)用所述Media Recorder.save和所述Media Recorder.restart后,完成音視頻流的分段并寫(xiě)入第一封裝文件,然后將分段前的索引信息及參數(shù)更新,再完成對(duì)第一封裝文件的頭部寫(xiě)入并將音視頻流指向新的分段第二封裝文件。

      可選的,所述第二封裝文件與第一封裝文件在I幀與之前P幀處切開(kāi)。

      可選的,所述智能終端還包括:

      同步單元303,用于將分段的視頻文件和音頻文件同步。

      可選的,配置單元301,還用于對(duì)記錄的視頻文件軌跡的數(shù)據(jù)信息進(jìn)行參數(shù)的重新設(shè)置。

      對(duì)于本領(lǐng)域技術(shù)人員而言,顯然本發(fā)明不限于上述示范性實(shí)施例的細(xì)節(jié),而且在不背離本發(fā)明的精神或基本特征的情況下,能夠以其他的具體形式實(shí)現(xiàn)本發(fā)明。因此,無(wú)論從哪一點(diǎn)來(lái)看,均應(yīng)將實(shí)施例看作是示范性的,而且是非限制性的,本發(fā)明的范圍由所附權(quán)利要求而不是上述說(shuō)明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本發(fā)明內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標(biāo)記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。系統(tǒng)權(quán)利要求中陳述的多個(gè)單元或裝置也可以由一個(gè)單元或裝置通過(guò)軟件或者硬件來(lái)實(shí)現(xiàn)。第一,第二等詞語(yǔ)用來(lái)表示名稱,而并不表示任何特定的順序。

      附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個(gè)實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程序產(chǎn)品的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段或代碼的一部分,所述模塊、程序段或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個(gè)連續(xù)的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或動(dòng)作的專用的基于硬件的系統(tǒng)來(lái)實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來(lái)實(shí)現(xiàn)。

      參見(jiàn)圖4,本發(fā)明實(shí)施例還提供一種智能終端400,該智能終端400包括但不限于:個(gè)人計(jì)算機(jī)、筆記本電腦或計(jì)算機(jī)群組,如圖4所示,該服務(wù)器包括:智能終端400包括處理器401、存儲(chǔ)器402、收發(fā)器403、和總線404。收發(fā)器403用于與外部設(shè)備之間收發(fā)數(shù)據(jù)。智能終端4000中的處理器401的數(shù)量可以是一個(gè)或多個(gè)。本申請(qǐng)的一些實(shí)施例中,處理器401、存儲(chǔ)器402和收發(fā)器403可通過(guò)總線系統(tǒng)或其他方式連接。智能終端400可以用于執(zhí)行圖1所示的方法。關(guān)于本實(shí)施例涉及的術(shù)語(yǔ)的含義以及舉例,可以參考圖1對(duì)應(yīng)的說(shuō)明。此處不再贅述。

      其中,存儲(chǔ)器402中存儲(chǔ)程序代碼。處理器401用于調(diào)用存儲(chǔ)器402中存儲(chǔ)的程序代碼,用于執(zhí)行如圖1所示的步驟。

      需要說(shuō)明的是,這里的處理器401可以是一個(gè)處理元件,也可以是多個(gè)處理元件的統(tǒng)稱。例如,該處理元件可以是中央處理器(Central Processing Unit,CPU),也可以是特定集成電路(Application Specific Integrated Circuit,ASIC),或者是被配置成實(shí)施本申請(qǐng)實(shí)施例的一個(gè)或多個(gè)集成電路,例如:一個(gè)或多個(gè)微處理器(digital signal processor,DSP),或,一個(gè)或者多個(gè)現(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)。

      存儲(chǔ)器403可以是一個(gè)存儲(chǔ)裝置,也可以是多個(gè)存儲(chǔ)元件的統(tǒng)稱,且用于存儲(chǔ)可執(zhí)行程序代碼或應(yīng)用程序運(yùn)行裝置運(yùn)行所需要參數(shù)、數(shù)據(jù)等。且存儲(chǔ)器403可以包括隨機(jī)存儲(chǔ)器(RAM),也可以包括非易失性存儲(chǔ)器(non-volatile memory),例如磁盤存儲(chǔ)器,閃存(Flash)等。

      總線404可以是工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(Industry Standard Architecture,ISA)總線、外部設(shè)備互連(Peripheral Component,PCI)總線或擴(kuò)展工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(Extended Industry Standard Architecture,EISA)總線等。該總線可以分為地址總線、數(shù)據(jù)總線、控制總線等。為便于表示,圖4中僅用一條粗線表示,但并不表示僅有一根總線或一種類型的總線。

      該用戶設(shè)備還可以包括輸入輸出裝置,連接于總線404,以通過(guò)總線與處理器401等其它部分連接。該輸入輸出裝置可以為操作人員提供一輸入界面,以便操作人員通過(guò)該輸入界面選擇布控項(xiàng),還可以是其它接口,可通過(guò)該接口外接其它設(shè)備。

      所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng)、裝置和單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。

      在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng)、裝置和方法,可以通過(guò)其它的方式實(shí)現(xiàn)。以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,又例如,多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些通信接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。

      所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。

      另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。

      所述功能如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。

      最后應(yīng)說(shuō)明的是:以上各實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述各實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求和說(shuō)明書(shū)的范圍當(dāng)中。

      當(dāng)前第1頁(yè)1 2 3 
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1