r()方法模擬該Track對象的數(shù)據(jù)讀取過程,截取該Track對象的cblk緩沖中的音頻數(shù)據(jù),將截取的音頻數(shù)據(jù)寫入所述共享內(nèi)存SharedBuf fer I,并執(zhí)行步驟S204和步驟S205 ;
[0043]步驟S204,音頻數(shù)據(jù)接收:所述子線程ProcessThreadl從共享內(nèi)存SharedBuf fer I中讀取音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)寫入環(huán)形內(nèi)存Mas terBuf f er ;
[0044]步驟S205,音頻數(shù)據(jù)重放:所述子線程ProcessThread2從環(huán)形內(nèi)存MasterBuf fer中讀取音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)寫入共享內(nèi)存SharedBufferf;同時在所述子線程ProcessThread2中新建Native Aud1Track對象,并通過該所述Native Aud1Track對象將所述共享內(nèi)存SharedBuf f er2中的音頻數(shù)據(jù)寫回所述Andro i d音頻系統(tǒng),進行正常流程的混音及播放。
[0045]經(jīng)過上述兩種實施方式的初始化、數(shù)據(jù)截取、數(shù)據(jù)接收和數(shù)據(jù)重放過程,所述子線程ProcessThread1、子線程ProcessThread2和Android音頻系統(tǒng)線程共同讀寫共享內(nèi)存SharedBufferl、共享內(nèi)存SharedBuf fer2和環(huán)形內(nèi)存MasterBuffer中的音頻數(shù)據(jù),形成“截取-處理-輸出”閉環(huán),其交互示意圖如圖3所示。
[0046]圖4顯示了本發(fā)明提供的一種面向第三方音頻播放器的數(shù)據(jù)截取方法流程圖,該方法基于Andro id系統(tǒng),上層應(yīng)用通過JNI機制創(chuàng)建ProcessMas ter主控類對象,并通過該ProcessMaster主控類對象控制整個數(shù)據(jù)截取過程,具體的執(zhí)行步驟如下:
[0047]S401,用戶打開上層應(yīng)用程序,應(yīng)用程序通過JNI,創(chuàng)建主控類對象ProcessMaster,并調(diào)用初始化接口進行數(shù)據(jù)截取初始化;
[0048]S402,用戶在應(yīng)用程序中打開數(shù)據(jù)截取功能,應(yīng)用程序利用JNI機制將Android音頻系統(tǒng)中添加的標志位startf lag的值設(shè)置為true,此后Andro id音頻系統(tǒng)將音頻數(shù)據(jù)轉(zhuǎn)向?qū)懭牍蚕韮?nèi)存SharedBufferl ;
[0049]S403,子線程ProcessThreadl從共享內(nèi)存SharedBuff erl中獲取音頻數(shù)據(jù)并將音頻數(shù)據(jù)寫入環(huán)形內(nèi)存MasterBuf fer ;子線程ProcessThread2讀取環(huán)形內(nèi)存MasterBuf fer中的音頻數(shù)據(jù),將讀取的音頻數(shù)據(jù)寫入共享內(nèi)存SharedBuf fer 2,并將共享內(nèi)存SharedBuf fer2中的音頻數(shù)據(jù)寫回到Andro id放音流程進行放音;
[0050]本發(fā)明提供的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,還包括對第三方音頻播放器暫停或停止播放、音頻播放進入數(shù)據(jù)不繼、Android音頻系統(tǒng)播放線程意外退出以及自身軟件退出的處理方法,具體為:
[0051]所述對第三方音頻播放器暫?;蛲V共シ乓约皩σ纛l播放進入數(shù)據(jù)不繼的處理方法,當?shù)谌揭纛l播放器暫?;蛲V共シ艜r,Android音頻系統(tǒng)播放線程調(diào)用standby函數(shù),進入standby流程。本方案對Android音頻系統(tǒng)的standby函數(shù)進行修改,具體處理過程如下:
[°°52] 步驟al,在Android音頻系統(tǒng)中添加播放暫停標志位standbyf lag;
[0053]步驟a2,當Android音頻系統(tǒng)處理第三方音頻播放器暫?;蛲V挂约耙纛l播放進入數(shù)據(jù)不繼,調(diào)用standby函數(shù)時,若所述標志位startf lag的值為true,則將該所述標志位standbyf lag 的值設(shè)置為 true ;
[0054]步驟a3,在所述子線程ProcessThreadl與子線程ProcessThread2的線程循環(huán)中查詢所述標志位standbyf lag的值,若所述標志位standbyf lag的值為true,貝Ij立即停止數(shù)據(jù)截取過程并清空所述共享內(nèi)存SharedBuffer 1、共享內(nèi)存SharedBuf f er2和環(huán)形內(nèi)存MasterBuf f er中的音頻數(shù)據(jù),等待下次播放或數(shù)據(jù)恢復正常。
[0055]所述對Android音頻系統(tǒng)播放線程意外退出的處理方法,當Android音頻系統(tǒng)播放線程意外退出時,調(diào)用861:_。3瓜1116丨6^函數(shù),通過參量61;[1:;[呢=1指示411(11'01(1音頻系統(tǒng)播放線程意外退出。本方案對Android音頻系統(tǒng)的set_parameters函數(shù)進行修改,具體處理過程如下:
[0056]步驟b I,在Andrο id音頻系統(tǒng)中添加退出標志位exi tf Iag;
[0057]步驟h2,當Android音頻系統(tǒng)處理播放線程意外退出,調(diào)用set_parameters函數(shù)時,檢測出現(xiàn)意外退出時的參量,若檢測到參量為exiting= I,則將所述標志位exitf lag的值設(shè)置為true ;
[0058]步驟b3,在所述子線程ProcessThreadl和子線程ProcessThread2的線程循環(huán)中查詢所述標志位exitf lag的值,若所述標志位exitf lag的值為true,則立即停止數(shù)據(jù)截取過程并清空所述共享內(nèi)存SharedBuf fer 1、共享內(nèi)存SharedBuf fer2和環(huán)形內(nèi)存MasterBuf fer中的音頻數(shù)據(jù),并執(zhí)行軟件退出流程。
[0059]所述對自身軟件退出的處理方法,具體處理體過程如下:
[0060]步驟Cl,當上層應(yīng)用主動關(guān)閉數(shù)據(jù)截取功能時,由Java層利用JNI調(diào)用所述主控類對象ProcessMaster的退出接口 ;
[0061 ] 步驟c2,通過所述主控類對象ProcessMaster的退出接口,關(guān)閉所述子線程ProcessThread I和子線程ProcessThread2,重置所述標志位startflag、標志位standbyf lag和標志位exitf lag的值,釋放所述共享內(nèi)存SharedBuffer 1、共享內(nèi)存SharedBuf fer2和環(huán)形內(nèi)存Mas terBuf fer,此后,音頻數(shù)據(jù)截取過程關(guān)閉。
【主權(quán)項】
1.一種面向第三方音頻播放器的數(shù)據(jù)截取方法,所述方法基于Android音頻系統(tǒng),面向第三方音頻播放器,進行數(shù)據(jù)截取,其特征在于,具體過程如下: 步驟I,創(chuàng)建用于集中控制數(shù)據(jù)截取過程的主控類對象ProcessMaster; 步驟2,通過所述主控類對象ProcessMaster,執(zhí)行Nati ve層的數(shù)據(jù)截取初始化,具體包括如下步驟: 步驟2-1,通過所述主控類ProcessMaster對象,在Native層開辟兩塊跨進程共享內(nèi)存,分別為共享內(nèi)存SharedBuffer I和共享內(nèi)存SharedBuffer 2,其中SharedBuff erl為環(huán)形共享內(nèi)存,SharedBuf fer2為普通共享內(nèi)存; 步驟2-2,在所述主控類對象ProcessMaster中開辟一塊環(huán)形內(nèi)存MasterBuffer; 步驟2-3,通過所述主控類對象ProcessMas ter創(chuàng)建一對協(xié)同工作子線程,分別為子線程卩1'006 8 81'11代&(11和子線程?1'006 8 81'11作&(12,并啟動子線程ProcessThreadl和子線程ProcessThread2; 步驟3,在所述Android音頻系統(tǒng)中添加音頻截取標志位startf lag,根據(jù)所述標志位startf lag的值控制音頻數(shù)據(jù)的流向,當標志位startf lag的值為true時,將音頻數(shù)據(jù)寫入所述共享內(nèi)存SharedBufferl,進行音頻數(shù)據(jù)截取,并執(zhí)行步驟4 ; 步驟4,所述子線程ProcessThread I從所述共享內(nèi)存SharedBuff erl中讀取音頻數(shù)據(jù),將讀取的音頻數(shù)據(jù)寫入所述環(huán)形內(nèi)存MasterBuffer;所述子線程ProcessThread2從所述環(huán)形內(nèi)存MasterBuf f er中讀取音頻數(shù)據(jù),將所述音頻數(shù)據(jù)寫入所述共享內(nèi)存SharedBuf f er2,并將所述共享內(nèi)存SharedBuf f er 2中的音頻數(shù)據(jù)寫回到所述Andro id音頻系統(tǒng)。2.根據(jù)權(quán)利要求1所述的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,其特征在于,包括對第三方音頻播放器暫?;蛲V共シ拧⒁纛l播放進入數(shù)據(jù)不繼、Android音頻系統(tǒng)播放線程意外退出以及自身軟件退出的處理方法,具體為: 所述對第三方音頻播放器暫?;蛲V共シ乓约皩σ纛l播放進入數(shù)據(jù)不繼的處理方法,具體過程為: 步驟al,在所述Android音頻系統(tǒng)中添加播放暫停標志位standbyflag; 步驟a2,當所述Android音頻系統(tǒng)處理第三方音頻播放器暫?;蛲V共シ乓约皵?shù)據(jù)不繼,調(diào)用standby函數(shù)時,若所述標志位startflag的值為true,則將該所述標志位standbyf lag 的值設(shè)置為 true ; 步驟a3,在所述子線程ProcessThreadl和子線程ProcessThread2的線程循環(huán)中查詢所述標志位standbyf lag的值,若所述標志位standbyf lag的值為true,貝Ij立即停止數(shù)據(jù)截取過程,并清空所述共享內(nèi)存SharedBufferl、共享內(nèi)存SharedBuffer2和環(huán)形內(nèi)存MasterBuff er中的數(shù)據(jù),等待下次播放或數(shù)據(jù)恢復正常; 所述對Android音頻系統(tǒng)播放線程意外退出的處理方法,具體過程為: 步驟bl,在所述Android音頻系統(tǒng)中添加退出標志位exitf lag; 步驟b2,當Android音頻系統(tǒng)處理底層播放線程意外退出,調(diào)用set_parameters函數(shù)時,檢測出現(xiàn)意外退出時的參量,若檢測到參量為exiting= I,則將所述標志位exitf lag的值設(shè)置為true ; 步驟b3,在所述子線程ProcessThreadl和子線程ProcessThread2的線程循環(huán)中查詢所述標志位exitf lag的值,若所述標志位exitf lag的值為true,貝Ij立即停止數(shù)據(jù)截取過程并清空所述共享內(nèi)存SharedBuff erl、共享內(nèi)存SharedBuf fer2和環(huán)形內(nèi)存MasterBuffer中的數(shù)據(jù),并執(zhí)行軟件退出流程; 所述對自身軟件退出的處理方法,具體過程為: 步驟Cl,當用戶通過上層應(yīng)用主動關(guān)閉數(shù)據(jù)截取功能時,由所述上層應(yīng)用利用JNI,調(diào)用所述主控類對象ProcessMaster的退出接口 ; 步驟c2,通過所述主控類對象ProcessMaster的退出接口,關(guān)閉所述子線程ProcessThreadl和子線程ProcessThread2,重置所述標志位startflag、標志位standbyflag和標志位exitflag的值,釋放共享內(nèi)存SharedBufferl、共享內(nèi)存SharedBuffer2和環(huán)形內(nèi)存MasterBuffer,此后,數(shù)據(jù)截取過程關(guān)閉。
【專利摘要】本發(fā)明提出了一種面向第三方音頻播放器的數(shù)據(jù)截取方法,從Android系統(tǒng)Native層的音頻核心AudioFlinger入手,通過新創(chuàng)建的協(xié)同工作子線程與標準Android音頻系統(tǒng)線程交互合作形成完備的數(shù)據(jù)截取閉環(huán),在準確截取任意第三方音頻播放器音頻數(shù)據(jù)的同時又能保持對第三方音頻播放器透明。本發(fā)明提出的一種面向第三方音頻播放器的數(shù)據(jù)截取方法,通過軟件方法加以實現(xiàn),具有良好的可移植性與向后兼容性。
【IPC分類】G06F9/44
【公開號】CN105468360
【申請?zhí)枴緾N201510791453
【發(fā)明人】張暉, 劉寶
【申請人】南京郵電大學
【公開日】2016年4月6日
【申請日】2015年11月17日