本申請涉及安卓音頻系統(tǒng)
技術(shù)領(lǐng)域:
,特別涉及安卓系統(tǒng)中對互斥的音頻實現(xiàn)同時播放的方法。
背景技術(shù):
:安卓(Android)系統(tǒng)設(shè)計了基于類型的音頻系統(tǒng),其基本策略是:高優(yōu)先級類型打斷低優(yōu)先級類型,同優(yōu)先級交互時新來的打斷當(dāng)前正在播放的。Android的開放性使得第三方APP對音頻系統(tǒng)的調(diào)用沒有統(tǒng)一的規(guī)范,流程也各不相同。甚至存在繞過、不申請音頻策略,強(qiáng)制與其他音頻播放器以同一音量混音的情況;有些則不響應(yīng)音頻系統(tǒng)的通知、請求,例如“DUCK”。在Android車載領(lǐng)域,大多是通過增加硬件(例如:單片機(jī)MCU、混音芯片、多揚(yáng)聲器等)的方式實現(xiàn)多路媒體音同時播放。一些應(yīng)用如高德導(dǎo)航,是通過申請音頻策略“AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK”,請求其他應(yīng)用“降低音量”來實現(xiàn)與之混音共存。通過分析發(fā)現(xiàn),現(xiàn)有混音技術(shù)存在以下缺陷:1、相互打斷無法共存。有些場景需要同時輸出兩種(或以上)的音頻,例如一邊聽歌一邊使用百度導(dǎo)航,結(jié)果是導(dǎo)航語音頻繁打斷音樂,旅行時幾乎無法欣賞完整的音樂,用戶體驗差。2、無法突出重點聲音,導(dǎo)致容易忽略重要語音信息。有些APP不申請音頻策略,或者不響應(yīng)音頻系統(tǒng)請求,強(qiáng)制以同等音量與其他播放器混音。例如:高德導(dǎo)航試圖解決導(dǎo)航音與音樂混音,播放導(dǎo)航時,請求音樂降低音量,但是有些音樂播放器是不響應(yīng)“降音”請求的,無法達(dá)到突出導(dǎo)航音的目的。3、同時播放依賴于APP實現(xiàn),互斥的播放器無法實現(xiàn)同時播放。4、成本高。車載平臺通過增加硬件以實現(xiàn)導(dǎo)航音和多媒體音共存的方式增加了成本。技術(shù)實現(xiàn)要素:本申請?zhí)峁┝艘环N對互斥的音頻實現(xiàn)同時播放的方法,以解決安卓終端互斥的音頻無法播放的問題,改善用戶多音頻交互時的體驗。本申請公開了一種對互斥的音頻實現(xiàn)同時播放的方法,應(yīng)用于安卓終端,包括:A、增加音頻類型STREAM_FORCE_MIX,在音頻優(yōu)先級策略中增加STREAM_FORCE_MIX類型的音頻策略;B、根據(jù)用戶的選擇確定混音增強(qiáng)應(yīng)用程序,保存混音增強(qiáng)應(yīng)用程序的名單;其中,混音增強(qiáng)應(yīng)用程序為需要與媒體音混音的應(yīng)用程序;根據(jù)用戶的設(shè)置確定音量管理策略;C、在應(yīng)用程序播放音頻數(shù)據(jù)時,獲取所述應(yīng)用程序的調(diào)用進(jìn)程名稱,如果所述應(yīng)用程序在所保存混音增強(qiáng)應(yīng)用程序的名單中,則將所述音頻數(shù)據(jù)的類型修改為STREAM_FORCE_MIX;D、應(yīng)用程序請求音頻策略時,判斷包名是否為空,在包名不為空時,獲取調(diào)用進(jìn)程號,進(jìn)而獲取包名,并判斷數(shù)據(jù)庫混音增強(qiáng)應(yīng)用程序表中是否存在所述包名的記錄,如果存在,則將音頻類型修改為STREAM_FORCE_MIX,申請音頻策略;E、根據(jù)設(shè)置的混音增強(qiáng)優(yōu)先級策略對所述應(yīng)用程序的音頻數(shù)據(jù)和媒體播放器的音頻數(shù)據(jù)進(jìn)行同時播放,其中,根據(jù)所設(shè)置的音量管理策略對媒體音量進(jìn)行逐步衰減與恢復(fù)。較佳的,所述D中,當(dāng)應(yīng)用程序請求音頻策略時,進(jìn)一步包括:判斷請求類型是否為STREAM_MUSIC,如果是STREAM_MUSIC,則繼續(xù)執(zhí)行判斷包名是否為空的操作。較佳的,所述B包括:遍歷安卓系統(tǒng)中的所有安裝包,檢索其PackageInfo中的packageInfo.requestedPermissions信息;遍歷requestedPermissions信息是否包含SD卡寫權(quán)限;保存申請SD卡寫權(quán)限的PackageInfo,包括:包名、名稱和ICON;在界面顯示遍歷得到的結(jié)果,供用戶瀏覽、設(shè)置,并根據(jù)用戶的選擇確定其中的混音增強(qiáng)應(yīng)用程序。較佳的,所述音量管理策略為:其中:0級,表示混音增強(qiáng)應(yīng)用程序與媒體音以相同音量混音;1級,表示混音時媒體音降低20%;2級,表示混音時媒體音降低40%;3級,表示混音時媒體音降低60%;4級,表示混音時媒體音降低80%;5級,表示混音時媒體音音量為0。較佳的,所述混音增強(qiáng)優(yōu)先級策略為:較佳的,根據(jù)所設(shè)置的音量管理策略對媒體音量進(jìn)行逐步衰減與恢復(fù)包括:當(dāng)混音增強(qiáng)應(yīng)用程序申請策略成功,并開始播放時,保存當(dāng)前媒體音量,作為媒體音量初始值;查詢設(shè)置的音量管理策略中的衰減指數(shù),并根據(jù)“衰減指數(shù)×媒體音量”計算出衰減后的媒體音量;逐步將媒體音量調(diào)整到所計算出的衰減后的媒體音量;當(dāng)混音增強(qiáng)應(yīng)用程序播放結(jié)束,釋放音頻策略時,逐步將媒體音量調(diào)整至媒體音量初始值。由上述技術(shù)方案可見,本申請公開了一種對互斥的音頻實現(xiàn)同時播放的方法,滿足了一些場景下需要同時聽到兩種或者兩種以上聲音的需求。例如較常見的使用導(dǎo)航(如百度導(dǎo)航、凱立德導(dǎo)航)時,聽音樂的問題,在復(fù)雜路況中,音樂頻繁被導(dǎo)航語音播報打斷,無法連續(xù)欣賞音樂。通過本發(fā)明,用戶可以設(shè)置導(dǎo)航應(yīng)用為混音增強(qiáng)應(yīng)用程序,還可以設(shè)置媒體音衰減值來保證更重要的導(dǎo)航音清晰、明亮,不至于錯過重要的路況信息。本發(fā)明不依賴于第三方app的實現(xiàn),不需要增加硬件成本,只需要更新音頻系統(tǒng)就可以實現(xiàn)將原本互斥不能共存播放的應(yīng)用程序同時播放,能夠帶來更豐富、更友好的用戶體驗,提升終端差異化競爭優(yōu)勢。附圖說明圖1為本發(fā)明安卓終端音頻系統(tǒng)改進(jìn)方案的框架圖;圖2為一較佳安裝有本發(fā)明混音助手APP的終端界面示意圖;圖3為本發(fā)明一較佳混音增強(qiáng)應(yīng)用程序設(shè)置界面示意圖;圖4為本發(fā)明一較佳媒體音衰減設(shè)置界面示意圖;圖5為本發(fā)明一較佳音頻流中的類型映射示意圖;圖6為本發(fā)明一較佳音頻策略中的類型映射示意圖;圖7為本發(fā)明一較佳媒體音衰減與恢復(fù)處理流程示意圖。具體實施方式為使本申請的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下參照附圖并舉實施例,對本申請作進(jìn)一步詳細(xì)說明。本發(fā)明公開了一種安卓終端音頻系統(tǒng)改進(jìn)方法,該方法在現(xiàn)有技術(shù)的基礎(chǔ)上進(jìn)行了如下改進(jìn):1、增加新的音頻類型“STREAM_FORCE_MIX”,以獨(dú)立于“STREAM_MUSIC”等拼音類型進(jìn)行音量及音頻策略管理。2、重新設(shè)計音頻優(yōu)先級策略,增加“STREAM_FORCE_MIX”類型的音頻策略,使得其與“STREAM_MUSIC”等音頻類型共存,不相互打斷。3、設(shè)計音量管理策略,當(dāng)“STREAM_FORCE_MIX”類型播放器申請音頻策略時,逐漸降低“STREAM_MUSIC”等相關(guān)音頻類型播放器的音量至設(shè)定值;當(dāng)“STREAM_FORCE_MIX”類型播放器釋放音頻策略時,逐漸恢復(fù)“STREAM_MUSIC”等相關(guān)音頻類型播放器的音量。使得能突出強(qiáng)調(diào)更重要的“STREAM_FORCE_MIX”類型播放器播出的聲音。4、設(shè)計混音助手APP,提出并實現(xiàn)通過包名來識別和管理“混音增強(qiáng)”應(yīng)用程序。用戶通過選擇和設(shè)置需要支持與其他媒體播放器混音的應(yīng)用程序,由混音助手APP記錄該應(yīng)用程序的包名,以供音頻系統(tǒng)區(qū)分識別。5、類型映射,在音頻系統(tǒng)中,應(yīng)用程序請求音頻策略時,通過提取對比調(diào)用進(jìn)程包名與混音助手保存的包名列表,將匹配的音頻請求類型強(qiáng)制映射為“STREAM_FORCE_MIX”類型,以獨(dú)立進(jìn)行音量和策略管理,實現(xiàn)本申請將互斥播放同時播出的目的。根據(jù)對現(xiàn)有混音場景的分析,大部分情況下是導(dǎo)航軟件與音樂播放器的音頻需要同時播放,這兩類應(yīng)用程序需要播放音頻的音頻類型通常為STREAM_MUSIC,因此,本申請主要涉及的是將STREAM_MUSIC類型修改為STREAM_FORCE_MIX類型。以下說明中,以STREAM_MUSIC類型為例進(jìn)行說明。基于上述改進(jìn),本發(fā)明提供的方法使得原本互斥的播放器能夠同時播放,并能夠根據(jù)用戶的設(shè)置,突出混音中重點播放器播出的聲音。以下將需要與媒體音混音的應(yīng)用程序稱為“混音增強(qiáng)”應(yīng)用程序。本發(fā)明方案的框架圖如圖1所示,該框架主要包含的模塊及其功能描述如下:1、混音助手APP模塊該模塊的主要功能如下:1)混音增強(qiáng)應(yīng)用設(shè)置子模塊,用于標(biāo)記混音增強(qiáng)應(yīng)用程序,用戶可以通過列表和/或開關(guān)按鈕,來選擇作為混音增強(qiáng)應(yīng)用程序的應(yīng)用程序。2)媒體音衰減設(shè)置子模塊,較佳的,本發(fā)明提供6級衰減參數(shù),提供給用戶可選的媒體音量降低值。3)數(shù)據(jù)庫,用于進(jìn)行數(shù)據(jù)保存,將混音增強(qiáng)應(yīng)用程序名單和衰減參數(shù)保存在數(shù)據(jù)庫中,并提供查詢和修改接口。2、音頻框架(AudioFramework)模塊1)混音增強(qiáng)應(yīng)用識別子模塊,通過對比調(diào)用進(jìn)程名和數(shù)據(jù)庫中的混音增強(qiáng)應(yīng)用程序名單,判斷該應(yīng)用程序是不是需要進(jìn)行混音增強(qiáng)。2)混音增強(qiáng)類型映射子模塊,其功能主要是將混音增強(qiáng)應(yīng)用程序的音頻類型從STEAM_MUSIC替換為STRREAM_MUSIC_MIX。這樣處理后,能夠區(qū)分出普通媒體音數(shù)據(jù)流和“混音增強(qiáng)”類型音頻數(shù)據(jù)流,從而獨(dú)立進(jìn)行音頻策略和音量管理。3)音頻播放權(quán)(AudioFocus)優(yōu)先級策略優(yōu)化子模塊,通過設(shè)計獨(dú)立的音頻類型和策略,實現(xiàn)與其他媒體音混音共存。4)混音音量分配與調(diào)節(jié)子模塊,用于進(jìn)行混音音量處理,主要實現(xiàn)一種策略,混音增強(qiáng)播放與媒體音播放混音交互時,將媒體音量逐漸降低到設(shè)置的值;混音增強(qiáng)應(yīng)用程序播放結(jié)束時,將媒體音量逐漸恢復(fù)到初始值。5)AudioFlinger混音處理子模塊,實現(xiàn)以streamType來區(qū)分混音增強(qiáng)音頻流和媒體音頻流,并根據(jù)媒體音量衰減設(shè)置,進(jìn)行疊加、平整處理。3、音頻硬件抽象層(AudioHal)模塊該模塊用于將經(jīng)過“混音增強(qiáng)”后最終得到的音頻數(shù)據(jù)流傳輸?shù)揭纛l驅(qū)動及設(shè)備。下面通過一個較佳實施例,對本申請技術(shù)方案的實施進(jìn)行進(jìn)一步詳細(xì)說明。首先,對混音助手APP進(jìn)行說明。圖2為安裝有本發(fā)明混音助手APP的終端界面示意圖。本發(fā)明提供的混音助手APP作為用戶管理混音增強(qiáng)應(yīng)用程序的入口,以包名為標(biāo)志進(jìn)行混音增強(qiáng)應(yīng)用程序的識別、保存和設(shè)置?;煲糁諥PP的主要功能包括:基于SD卡權(quán)限的音頻播放應(yīng)用程序的過濾;基于包名的混音增強(qiáng)應(yīng)用程序識別、設(shè)置;混音增強(qiáng)時媒體音量衰減設(shè)置;數(shù)據(jù)庫設(shè)計與參數(shù)保存。具體功能模塊分解描述如下:一、混音增強(qiáng)應(yīng)用程序篩選Android系統(tǒng)無法直接判斷一個應(yīng)用程序是否為多媒體應(yīng)用程序。本發(fā)明在分析常用音頻應(yīng)用程序的行為特征之后,提出以申請過“SD卡寫權(quán)限”為條件來篩選出可能的音頻應(yīng)用程序,從而縮小用戶選擇的范圍。首先,遍歷系統(tǒng)中所有安裝包,檢索其PackageInfo中的packageInfo.requestedPermissions信息;其次,遍歷requestedPermissions信息是否包含SD卡寫權(quán)限(android.permission.WRITE_EXTERNAL_STORAGE),保存申請SD卡寫權(quán)限的PackageInfo,包括包名、名稱和ICON;再次,對比該包名是否保存在數(shù)據(jù)庫混音增強(qiáng)應(yīng)用程序表中;最后,以列表的形式進(jìn)行界面顯示,供用戶瀏覽、設(shè)置。如圖3所示。二、基于包名的識別、設(shè)置與存儲本發(fā)明中,在Settings增加了數(shù)據(jù)庫表forcemix,包含_id(INTEGER)和mix_pkg(TEXT)兩個字段,mix_pkg用于記錄混音增強(qiáng)應(yīng)用程序的包名,例如百度導(dǎo)航(com.baidu.BaiduMap),當(dāng)用戶設(shè)置應(yīng)用程序為混音增強(qiáng)應(yīng)用程序時,將該應(yīng)用程序的包名作為mix_pkg字段值插入(insert)到forcemix表中,并刷新界面混音增強(qiáng)應(yīng)用描述、開關(guān)狀態(tài)。同樣將應(yīng)用程序設(shè)置為非混音增強(qiáng)應(yīng)用程序時,相應(yīng)的刪除(delete)混音增強(qiáng)應(yīng)用程序表forcemix中字段mix_pkg等于此包名的記錄,并刷新UI界面。三、媒體音衰減設(shè)置混音增強(qiáng)應(yīng)用程序與媒體應(yīng)用程序混音時,需要降低媒體音量以突出“混音增強(qiáng)”應(yīng)用程序的音量。本實施例的混音助手APP提供了5級可調(diào)的音量,如表1所示,用戶可從中自行選擇,如圖4所示。當(dāng)參與混音的應(yīng)用程序都屬于混音增強(qiáng)應(yīng)用程序時,以相同的音量進(jìn)行混音。衰減指數(shù)媒體音量混音增強(qiáng)音量0100%100%180%100%260%100%340%100%420%100%50%100%表1媒體音量衰減0級,表示混音增強(qiáng)應(yīng)用程序與媒體音以相同音量混音;1級,表示混音時媒體音降低20%;2級,表示混音時媒體音降低40%;3級,表示混音時媒體音降低60%;4級,表示混音時媒體音降低80%;5級,表示混音時媒體音音量為0,靜音。其次,對本發(fā)明提出的混音增強(qiáng)類型進(jìn)行說明。一、新增類型:STREAM_FORCE_MIX本發(fā)明提出在Android音頻系統(tǒng)中增加混音增強(qiáng)類型:STREAM_FORCE_MIX,以解決互斥的音頻播放無法同時播放的問題。如下所示在AudioSystem中增加:publicstaticfinalintSTREAM_FROCE_MIX=14;//forforcemixprivatestaticfinalintNUM_STREAM_TYPES=15;//changedfrom14并相應(yīng)的在AudioPlayer、AuidoFlinger中增加此類型。同時在AudioService中增加并設(shè)置默認(rèn)音量和最大音量為7和15。二、MediaPlayer/AudioTrack中AudioStreamType映射根據(jù)AudioFlinger軟件混音算法原理,音頻數(shù)據(jù)根據(jù)流(stream)類型來進(jìn)行音量疊加運(yùn)算,因此需要在創(chuàng)建音頻流時區(qū)分混音增強(qiáng)音頻數(shù)據(jù)和普通媒體音數(shù)據(jù)。Android系統(tǒng)中播放音頻流入口有兩個:一個是使用Android多媒體框架播放的MediaPlayer,另一個是自定義播放器使用的AudioTrack。本實施例通過獲取調(diào)用進(jìn)程名稱,并匹配數(shù)據(jù)庫中的混音增強(qiáng)應(yīng)用程序表,來判斷是否為混音增強(qiáng)音頻流,然后進(jìn)行混音增強(qiáng)類型映射。流程如圖5所示,包括:步驟501:挑選區(qū)分音頻流的類型的入口。其中,MediaPlayer辨別“混音增強(qiáng)”音頻數(shù)據(jù)的最優(yōu)入口是函數(shù)setAudioStreamType(intstreamType);而AudioTrack辨別“混音增強(qiáng)”音頻數(shù)據(jù)流的最優(yōu)入口則是構(gòu)造函數(shù)AudioTrack(intstreamType)。步驟502:調(diào)用getCallingPid,獲取調(diào)用進(jìn)程號。步驟503:獲取進(jìn)程名稱。步驟504:查詢數(shù)據(jù)庫混音增強(qiáng)應(yīng)用程序表。步驟505:判斷混音增強(qiáng)應(yīng)用程序表中是否包含對應(yīng)的記錄,如果沒有,則跳過,結(jié)束本流程,否則,繼續(xù)執(zhí)行步驟506。步驟506:將音頻類型從STREAM_MUSIC替換為STREAM_FORCE_MIX。三、AudioService中STREAM_MUSIC到STREAM_FORCE_MIX的映射為了區(qū)分混音增強(qiáng)應(yīng)用程序,本實施例通過如前所述的混音助手APP,由用戶設(shè)置應(yīng)用程序為混音增強(qiáng)應(yīng)用程序,并記錄包名,audioframework收到請求播放權(quán)(requestAudioFocus)調(diào)用時,通過包名對比識別,來映射混音增強(qiáng)應(yīng)用程序類型,流程如圖6所示,包括:步驟601:應(yīng)用程序調(diào)用requestAudioFocus(stream_type),請求播放權(quán)。步驟602:判斷請求類型是否為STREAM_MUSIC,即:判斷stream_type=STREAM_MUSIC?如果是,繼續(xù)執(zhí)行步驟603,否則,結(jié)束本流程。步驟603:判斷包名是否為空,即:判斷callingPackageName=null?,如果包名為空,則繼續(xù)執(zhí)行步驟606,如果包名不為空,則,繼續(xù)執(zhí)行步驟604。步驟604:用函數(shù)getCallingPid()獲取調(diào)用進(jìn)程號。步驟605:根據(jù)進(jìn)程號獲取包名。通過兩步調(diào)用來實現(xiàn):首先查詢當(dāng)前正在運(yùn)行的所有應(yīng)用程序信息(通過調(diào)用ActivityManager.getRunningAppProcesses進(jìn)行查詢),然后根據(jù)返回結(jié)果,查詢該正在運(yùn)行的應(yīng)用程序的標(biāo)簽信息(通過調(diào)用函數(shù)PackageManager.getApplicationLabel進(jìn)行查詢),最后從標(biāo)簽信息中找出其包名。步驟606:查詢數(shù)據(jù)庫混音增強(qiáng)應(yīng)用程序表中此包名的記錄:Cursorc=db.query("t_mixapp",newString[]{"name"},"name=?",newString[]{callingPackageName},null,null,null)。步驟607:根據(jù)查詢結(jié)果,判斷表中是否存在此包名的記錄,即:(c.moveToFirst())=null?,如果表中存在此包名的記錄,則執(zhí)行步驟608,否則,結(jié)束本流程。步驟608:將STREAM_MUSIC替換為STREAM_FORCE_MIX,申請音頻策略。四、STREAM_FORCE_MIX優(yōu)先級策略表2為本實施例的混音增強(qiáng)優(yōu)先級策略表。表2混音增強(qiáng)策略表最后,對本發(fā)明混音增強(qiáng)中媒體音量的衰減與恢復(fù)進(jìn)行說明。AudioFlinger軟件混音的原理是根據(jù)每個Track的類型音量和左右聲道的音量乘積來進(jìn)行疊加實現(xiàn)混音,其中音量的計算公式如下:floattypeVolume=mStreamTypes[track->streamType()].volume;//類型音量floatv=masterVolume*typeVolume;vlf*=v;//左聲道音量vrf*=v;//右聲道音量系統(tǒng)無法控制應(yīng)用程序播放器的左右聲道的音量,因此本發(fā)明通過控制typeVolume來實現(xiàn)混音時媒體音低于混音增強(qiáng)音量,以達(dá)到突出重點的目的。即:mStreamTypes[STREAM_FORCE_MIX].volume>mStreamTypes[STREAM_MUSIC].volume混音增強(qiáng)交互時音頻系統(tǒng)的處理流程如圖7所示,包括:步驟701:混音增強(qiáng)應(yīng)用程序申請策略成功,并開始播放。步驟702:保存當(dāng)前媒體音量。步驟703:查詢混音助手中設(shè)置的衰減指數(shù),并根據(jù)“衰減指數(shù)×媒體音量”計算出衰減后的媒體音量。步驟704:調(diào)用setStreamVolume(music_new),逐漸調(diào)整音樂音量到衰減值,其中,參數(shù)music_new為所述計算出的衰減后的媒體音量。步驟705:混音增強(qiáng)播放結(jié)束釋放音頻策略。步驟706:調(diào)用setStreamVolume(music_old),漸進(jìn)恢復(fù)媒體音量至初始值,其中,music_old為媒體音量初始值。以上所述僅為本申請的較佳實施例而已,并不用以限制本申請,凡在本申請的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請保護(hù)的范圍之內(nèi)。當(dāng)前第1頁1 2 3