亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種面向第三方音頻播放器的數(shù)據(jù)截取方法

文檔序號:9708065閱讀:998來源:國知局
一種面向第三方音頻播放器的數(shù)據(jù)截取方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)字音頻處理技術(shù)領(lǐng)域,尤其涉及一種面向第三方音頻播放器的數(shù)據(jù)截取方法。
【背景技術(shù)】
[0002]在未來泛在通信環(huán)境下,協(xié)同思想已成為網(wǎng)絡(luò)融合的主流。通過終端之間的智能協(xié)作,實現(xiàn)1+1>2的效果,為用戶提供各類新型智慧服務(wù),從而極大地提升用戶的業(yè)務(wù)體驗。在音頻播放場景中,已有相關(guān)通過多個終端協(xié)同播放同一首音樂的多個聲道實現(xiàn)立體聲效果的應(yīng)用程序,但此類應(yīng)用只能通過特定軟件才能實現(xiàn)協(xié)同播放的效果,無法做到對任意第三方音頻播放軟件透明,從而影響用戶的實際體驗。為了達(dá)到對第三方音頻播放器透明的效果,需要應(yīng)用程序能夠?qū)崟r截取任意第三方音頻播放器播放的音頻數(shù)據(jù)。
[0003]由于Android系統(tǒng)上層應(yīng)用在封閉環(huán)境中運行,無法直接在應(yīng)用層截取第三方音頻播放器正在播放的音頻數(shù)據(jù)。而根據(jù)Android系統(tǒng)的音頻架構(gòu),所有上層音樂播放軟件都要建立一個在Native層的Aud1Track對象,且播放的音頻數(shù)據(jù)都要通過該Aud1Track對象傳遞至Andro id系統(tǒng)Native層的音頻核心Aud1Flinger進行混音,并寫入到硬件抽象層(Hardware Abstract1n Layer,HAL),進而通過驅(qū)動程序驅(qū)動硬件進行播放。

【發(fā)明內(nèi)容】

[0004]為了克服現(xiàn)有技術(shù)的不足,本發(fā)明提出了一種面向第三方音頻播放器的數(shù)據(jù)截取方法O該方法基于Andro id系統(tǒng),在Andro id音頻系統(tǒng)框架下通過對標(biāo)準(zhǔn)Andro i d音頻系統(tǒng)的底層修改和Native動態(tài)鏈接庫開發(fā),實現(xiàn)對任意第三方音頻播放器音頻數(shù)據(jù)的實時截取。一方面,該方案能夠截取任意第三方音頻播放器的音頻數(shù)據(jù),即對第三方音頻播放器透明;另一方面,該方案采用軟件方法,簡單而易于實現(xiàn),且具有很好的可移植性和向后兼容性。
[0005 ]為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案是:
[0006]本發(fā)明提出的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,所述方法基于Android音頻系統(tǒng),面向第三方音頻播放器,進行數(shù)據(jù)截取,具體過程如下:
[0007]步驟I,創(chuàng)建用于集中控制數(shù)據(jù)截取過程的主控類對象ProcessMaster;
[0008]步驟2,通過所述主控類對象ProcessMaster,執(zhí)行Native層的數(shù)據(jù)截取初始化,具體包括如下步驟:
[0009]步驟2-1,通過所述主控類ProcessMaster對象,在Native層開辟兩塊跨進程共享內(nèi)存,分別為共享內(nèi)存SharedBuff erl和共享內(nèi)存SharedBuf fer2,其中SharedBuff erl為環(huán)形共享內(nèi)存,SharedBuf fer2為普通共享內(nèi)存;
[0010]步驟2-2,在所述主控類對象ProcessMaster中開辟一塊環(huán)形內(nèi)存MasterBuffer;[0011 ] 步驟2-3,通過所述主控類對象ProcessMas ter創(chuàng)建一對協(xié)同工作子線程,分別為子線程ProcessThread I和子線程ProcessThread2,并啟動子線程ProcessThread I和子線程ProcessThread2;
[0012]步驟3,在所述Android音頻系統(tǒng)中添加音頻截取標(biāo)志位startflag,根據(jù)所述標(biāo)志位startflag的值控制音頻數(shù)據(jù)的流向,具體描述如下:
[0013]當(dāng)所述標(biāo)志位startflag的值為true時,將音頻數(shù)據(jù)寫入所述共享內(nèi)存SharedBufferl,進行音頻數(shù)據(jù)截取,并執(zhí)行步驟4;
[0014]步驟4,所述子線程ProcessThreadl從所述共享內(nèi)存SharedBuf f erl中讀取音頻數(shù)據(jù),將讀取的音頻數(shù)據(jù)寫入所述環(huán)形內(nèi)SMasterBuffer ;所述子線程ProcessThread2從所述環(huán)形內(nèi)存Mas terBuf f er中讀取音頻數(shù)據(jù),將所述音頻數(shù)據(jù)寫入所述共享內(nèi)存SharedBuf f er2,并將所述共享內(nèi)存SharedBuf f er2中的音頻數(shù)據(jù)寫回到所述Andro i d音頻系統(tǒng)。
[0015]所述一種面向第三方音頻播放器的數(shù)據(jù)截取方法,還包括對第三方音頻播放器暫?;蛲V共シ拧⒁纛l播放進入數(shù)據(jù)不繼、Android音頻系統(tǒng)播放線程意外退出以及自身軟件退出的處理方法,具體為:
[0016]所述對第三方音頻播放器暫?;蛲V共シ乓约皩σ纛l播放進入數(shù)據(jù)不繼的處理方法,具體過程為:
[0017]步驟al,在所述Android音頻系統(tǒng)中添加播放暫停標(biāo)志位standbyf lag;
[0018]步驟a2,當(dāng)所述Android音頻系統(tǒng)處理第三方音頻播放器暫停或停止播放以及數(shù)據(jù)不繼,調(diào)用standby函數(shù)時,若所述標(biāo)志位startflag的值為true,則將該所述標(biāo)志位standbyf lag 的值設(shè)置為 true ;
[0019]步驟a3,在所述子線程ProcessThreadl和子線程ProcessThread2的線程循環(huán)中查詢所述標(biāo)志位standbyf lag的值,若所述標(biāo)志位standbyf lag的值為true,貝Ij立即停止數(shù)據(jù)截取過程并清空所述共享內(nèi)存SharedBuffer 1、共享內(nèi)存SharedBuf f er2和環(huán)形內(nèi)存MasterBuff er中的數(shù)據(jù),等待下次播放或數(shù)據(jù)恢復(fù)正常;
[0020]所述對Android音頻系統(tǒng)播放線程意外退出的處理方法,具體過程為:
[0021 ] 步驟bl,在所述Android音頻系統(tǒng)中添加退出標(biāo)志位exitf lag;
[0022]步驟b2,當(dāng)Android音頻系統(tǒng)處理底層播放線程意外退出,調(diào)用set_parameters函數(shù)時,檢測出現(xiàn)意外退出時的參量,若檢測到參量為exiting= I,則將所述標(biāo)志位exitf lag的值設(shè)置為true;
[0023]步驟b3,在所述子線程ProcessThreadl和子線程ProcessThread2的線程循環(huán)中查詢所述標(biāo)志位exitf lag的值,若所述標(biāo)志位exitf lag的值為true,則立即停止數(shù)據(jù)截取過程,并清空所述共享內(nèi)存SharedBufferl、共享內(nèi)存SharedBuffer2和環(huán)形內(nèi)存MasterBuf f er中的數(shù)據(jù),并執(zhí)行軟件退出流程;
[0024]所述對自身軟件退出的處理方法,具體過程為:
[0025]步驟Cl,當(dāng)用戶通過上層應(yīng)用主動關(guān)閉數(shù)據(jù)截取功能時,由所述上層應(yīng)用利用JNI,調(diào)用所述主控類對象ProcessMaster的退出接口 ;
[0026]步驟c2,通過所述主控類對象ProcessMaster的退出接口,關(guān)閉所述子線程ProcessThread I和子線程ProcessThread2,重置所述標(biāo)志位startflag、標(biāo)志位standbyflag和標(biāo)志位exitflag的值,釋放共享內(nèi)存SharedBufferl、共享內(nèi)存SharedBuffer2和環(huán)形內(nèi)存MasterBuffer,此后,數(shù)據(jù)截取過程關(guān)閉。
[0027]有益效果:本發(fā)明提出的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,從Android系統(tǒng)Native層的音頻核心Aud1Fl inger入手,通過新創(chuàng)建的協(xié)同工作子線程與標(biāo)準(zhǔn)Android音頻系統(tǒng)線程交互合作形成完備的數(shù)據(jù)截取閉環(huán),在準(zhǔn)確截取任意第三方音頻播放器音頻數(shù)據(jù)的同時又能保持對第三方音頻播放器透明。同時,本發(fā)明提出的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,通過軟件方法加以實現(xiàn),具有良好的可移植性與向后兼容性。
【附圖說明】
[0028]圖1為本發(fā)明實施例1提供的一種面向第三方音頻播放器的數(shù)據(jù)截取方法流程圖。
[0029]圖2為本發(fā)明實施例2提供的一種面向第三方音頻播放器的數(shù)據(jù)截取方法流程圖。
[0030]圖3為協(xié)同工作子線程與Android音頻系統(tǒng)線程交互示意圖。
[0031]圖4為本發(fā)明提供的一種面向第三方音頻播放器的數(shù)據(jù)截取方法線程交互流程圖。
【具體實施方式】
[0032]為了更加詳細(xì)的描述本發(fā)明提出的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,結(jié)合附圖,舉例說明如下:
[0033]圖1顯示了本發(fā)明實施例1提供的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,該方法基于Android音頻系統(tǒng),面向第三方音頻播放器,采用從HAL層進行數(shù)據(jù)截取,主要包括以下步驟:
[0034]步驟SlOl,創(chuàng)建主控類對象ProcessMaster;
[0035]步驟S102,音頻數(shù)據(jù)截取初始化:主控類對象ProcessMaster根據(jù)音頻播放配置參數(shù)獲得第三方音頻播放器在Native層的播放線程;開辟Native層的共享內(nèi)存SharedBufferl、共享內(nèi)存SharedBuf f er 2和主控類對象ProcessMas ter的環(huán)形內(nèi)存MasterBuffer,并將所述共享內(nèi)存SharedBuff erl、共享內(nèi)存SharedBuffer 2的控制結(jié)構(gòu)賦值給HAL層添加的變量,用于再次訪問;創(chuàng)建并運行子線程ProcessThreadl和子線程ProcessThread2;
[0036]步驟SI 03,音頻數(shù)據(jù)截取:在所述4]1(!!'0丨(1音頻系統(tǒng)]^1^層311(1;[0_1^.h的stream_out結(jié)構(gòu)體添加標(biāo)志位startf lag;當(dāng)所述Android音頻系統(tǒng)播放線程調(diào)用write函數(shù)向HAL層寫入音頻數(shù)據(jù)時,若所述標(biāo)志位startf lag的值為true,則將音頻數(shù)據(jù)寫入所述共享內(nèi)存SharedBufferl,并執(zhí)行步驟S104和步驟S105;
[0037]步驟S104,音頻數(shù)據(jù)接收:所述子線程ProcessThreadl從共享內(nèi)存SharedBuff erl中讀取音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)寫入環(huán)形內(nèi)存Mas terBuf f er ;
[0038]步驟S105,音頻數(shù)據(jù)重放:所述子線程ProcessThread2從環(huán)形內(nèi)存MasterBuffer中讀取音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)寫入共享內(nèi)存SharedBuf fer2;同時子線程ProcessThread2從共享內(nèi)存SharedBuf fer2讀取音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)寫回所述Andro id音頻系統(tǒng)。
[0039]圖2顯示了本發(fā)明實施例2提供的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,該方法基于Android音頻系統(tǒng),面向第三方音頻播放器,采用從Native層進行數(shù)據(jù)截取,主要包括以下步驟:
[0040] 步驟S201,創(chuàng)建主控類對象ProcessMaster;
[0041 ]步驟S202,音頻數(shù)據(jù)截取初始化:主控類對象ProcessMaster根據(jù)音頻播放配置參數(shù)獲得第三方音頻播放器在Native層的播放線程,進一步根據(jù)參數(shù)找到第三方音頻播放器對應(yīng)的Track對象;開辟Native層的共享內(nèi)存SharedBuff erl、共享內(nèi)存SharedBuf fer2和主控類對象ProcessMas ter的環(huán)形內(nèi)存Mas terBuf fer,并將所述共享內(nèi)存SharedBuff erl、共享內(nèi)存SharedBuffer2的控制結(jié)構(gòu)賦值給Track對象中添加的變量,用于再次訪問;創(chuàng)建并運行子線程 ProcessThreadl 和子線程 ProcessThread2 ;
[0042]步驟S203,音頻數(shù)據(jù)獲取:在所述Android音頻系統(tǒng)的Track類中添加標(biāo)志位startf lag,若標(biāo)志位startf lag的值為true則屏蔽所述Android音頻系統(tǒng)對該Track對象的混音處理及播放,并通過調(diào)用getnextbuffer()/releasebuffe
當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
  • <li id="oozhy"><center id="oozhy"><delect id="oozhy"></delect></center></li>
    <rp id="oozhy"><tbody id="oozhy"></tbody></rp>