一種音頻全局獨佔播放方法及終端設備與流程
2023-10-26 08:43:42 7
1.本發明涉及音頻播放領域,尤其涉及一種音頻全局獨佔播放方法及應用該方法播放音頻的終端設備。
背景技術:
2.安卓是個開放開源的系統,它設計之初用在機器人項目上,後來手機項目也加入了。不管是開始的機器人,還是後來的手機,對音頻的播放音質並沒有太多要求。但是因為安卓是開放開源的,除了手機之外,越來越多的媒體播放設備都開始使用安卓,其中不乏高音質音頻播放設備。同時也產生了很多高音質音頻播放應用。這些設備和應用對安卓高質量音頻播放提出了更高的要求。
3.了解安卓音頻系統的人都知道,src是安卓音頻播放繞不開的話題。src即sample rate converter,中文意思為採樣頻率轉換。src是安卓音頻播放系統為解決不同採樣率的音頻輸出數據在同一音頻回放硬體上播放音頻而設計。它將需要輸出的音頻數據統一轉換成採樣率48khz,16位深pcm數據格式,並加以混合,使得不同音頻播放應用能在同一時間輸出聲音。但是因為有了採樣率、數據格式,位深的轉換,音質就會有損失。如果一個音頻是以44.1khz的採樣率錄製,在安卓上回放就不能出來原始的效果。
4.而且不幸的是,安卓sdk並沒有給上層應用提供繞過src的接口,上層應用對自己的音頻輸出數據能否按照自己所希望的格式,採樣率,聲道數等到達音頻播放硬體,不能保證。
5.目前繞過安卓src的主要方法有以下這些:
6.1.音頻播放設備生產商,具有完全的android系統源碼。他們自己開發音頻播放應用,在音頻輸出部分直接調用安卓底層的audiotrack接口,傳入了直通標誌,讓audioflinger走直通播放通道。這樣可以讓設備開發商的音頻播放應用的輸出數據不經安卓src傳輸到音頻播放硬體。這種方法只適用於音頻播放設備生產商,對於沒有設備安卓源碼的第三方音頻播放應用開發商,這個方法行不通。
7.2.音頻播放設備生產商,具有完全的android系統源碼。他們自己開發音頻播放應用,與第一種方法不同的是他們的音頻應用直接操作音頻硬體,即直接使用tinyalsa接口輸出音頻,不經過安卓的音頻播放框架,也能達到音頻直通播放的目的。同樣的,第三方音頻播放應用開發商也不能通過這種方法來實現音頻直通播放。
8.3.第三方音頻播放應用開發商通過安卓的usb獨佔模式,使用libusb直接操作usb dac,可以讓自己的音頻輸出數據直接傳出到usb dac硬體,達到音頻直通播放的目的。該方法需要開發者對uac(usb audio class)有深入的理解,並且對1ibusb的接口使用非常熟悉,才能使用這種方法。所以該方法有較高的技術門檻,大部分第三方音頻應用開發者不會使用該方法。而且通過這種方法只能用於usb音頻播放設備,其他音頻播放設備則不適用。
9.除了通用性不足之外,上述三種方法都有一個共同的缺點,那就是使用了各自的方法後,使用了該方法的音頻播放應用就佔據了音頻播放硬體,其他音頻播放應用就不能
通過該音頻播放硬體輸出聲音了。使用者在使用設備生產商的音頻播放應用或使用了usb獨佔模式的音頻播放應用播放音頻之後,再去使用其他音頻播放應用播放音頻,則會出現播放不成功或者沒有聲音的情況,會引起使用者的困惑,影響使用體驗。
10.綜上所述,以上三種方法的缺點在於音頻播放應用佔據音頻播放硬體後則不再釋放該硬體,其他的音頻播放軟體不能使用該硬體,使聲音播放停止。
技術實現要素:
11.本發明主要解決的技術問題是提供一種音頻全局獨佔播放方法及設備,通過採用設置直通標識的技術方案,使當前應用在使用時佔用播放硬體,不使用時釋放硬體,且音頻播放直接走直通播放通道,提高音頻播放的音質達到無損播放的目的,也不會出現當同時使用多個音頻播放應用時出現聲音停止的情況。
12.第一方面,本技術實施例提供了一種音頻全局獨佔播放方法,包括:當終端設備正在通過當前應用播放音頻時,第一管理模塊接收第一應用發送的播放請求,第一管理模塊用於音頻通道管理,第一管理模塊對第一應用設置直通標識,第一管理模塊向第二管理模塊發送直通播放請求;第二管理模塊用於直通播放管理,第二管理模塊接收直通播放請求後發送停止通知給第三管理模塊;第三管理模塊用於應用管理,第三管理模塊接收停止通知關閉當前應用,第二管理模塊關閉當前應用的直通播放通道;第二管理模塊釋放音頻播放硬體,第二管理模塊獲取第一應用的直通標識,第一應用通過第二管理模塊使用音頻播放硬體播放聲音。
13.可選的,當前應用包括第三方音頻播放應用和自建音頻播放應用。第三方音頻應用是指使用安卓sdk開發,使用audiotrack或mediaplayer java接口的音頻播放應用。自建音頻播放應用是指使用安卓源碼audiotrack c++接口的自建音頻播放應用。
14.第一管理模塊、第二管理模塊、第三管理模塊均為應用框架層中的一個模塊,比如第一管理模塊可以是音頻混音管理模塊如audioflinger,第二管理模塊可以是音頻輸出策略管理模塊如audiopolicy,第三管理模塊可以是app管理模塊。
15.本方面提供的方法,實現多個音頻應用軟體同時使用時音頻輸出的有序管理,每一個音頻應用軟體在使用時都能正常的播放聲音,通過第三模塊對應用的停止管理避免音頻播放硬體被某一音頻應用軟體長時間佔用而不能使用導致的現播放不成功或者沒有聲音的情況出現,同時通過第一管理模塊第一應用設置直通標識,使第一應用能夠通過直通通道實現音頻的播放,從而使音頻播放實現真正的無損播放。
16.結合第一方面,在第一方面的一種可能的實現方式中,還包括第一管理模塊檢查第一應用的通道標識,當第一應用的通道標識設置為其他輸出標識,則刪除該輸出標識,同時對第一應用設置直通標識;當第一應用的通道標識設置為直通標識則不做刪除處理。
17.本實現方式中,在第二管理模塊收到新的播放請求時,第一管理模塊對發送該請求的第一應用設置直通標識,第一管理模塊向第二管理模塊發送直通播放請求,具體而言,第一管理模塊通過audiotrack接口建立播放通道的時,檢查傳入的請求參數並根據需要修改。如第三方音頻播放應用傳入的參數中設置了audio_output_flag_deep_buffer輸出標識,而這個輸出標識在安卓音頻系統中會強制使用混音通道,因此第一管理模塊需要把它清除,同時第一管理模塊對第一應用設置audio_output_flag_direct輸出標識即直通標
識,從而向安卓音頻系統表明要走直通播放通道。自建音頻播放應用如果已傳入直通標識,則不再需要設置。通過以上設置可以對發出播放請求的應用進行有效管理,避免應用播放的音頻走混音通道從而降低音質的問題產生。
18.結合第一方面,在第一方面的另一種可能的實現方式中,第二管理模塊接收直通播放請求時記錄每一個請求播放的應用的id信息,當第一應用請求通過直通播放時,第二管理模塊發送當前應用的id信息至第三管理模塊,第三管理模塊根據id信息停止當前應用。
19.本實現方式中,第三管理模塊根據第二管理模塊發送的停止通知,關閉當前應用,並第二管理模塊關閉當前應用的直通播放通道,具體而言第二管理模塊錄每一個請求播放的應用的pid,uid,包名等信息,當第一應用請求直通時,發送當前應用的信息給第三管理模塊請求停止該當前應用。第二管理模塊獲得第三管理模塊發出的前一個應用已停止的反饋信息後,第二管理模塊關閉當前應用使用的直通播放通道,從而釋放音頻播放硬體,為第一應用的直通播放請求建立直通播放通道。
20.結合第一方面,在第一方面的另一種可能的實現方式中,第三管理模塊接收第二管理模塊發送當前應用的id信息,通過安卓activitymanager的forcestoppackage接口停止當前應用。
21.本實現方式中,第三管理模塊根據請求關閉當前應用,具體而言根據播放請求,第二管理模塊記錄的當前應用的pid,uid,包名等信息,使用安卓activitymanager的forcestoppackage接口,傳入當前引用的包名參數,可以徹底停止當前應用。這樣可以避免當前應用的audiotrack嘗試重建播放通道,陷入應用之間搶奪直通播放通道的循環。
22.本實現方式中,第一應用獲得直通播放通道播放音頻,只有第一應用在播放音頻,直通播放通道和音頻播放硬體都在可用狀態,第一應用播放的音頻輸出數據得以原封不動地傳送到音頻播放硬體,實現無損播放。
23.結合第一方面,在第一方面的另一種可能的實現方式中,音頻播放硬體的抽象層增加audio_format_pcm_float的音頻輸出格式。音頻播放硬體不能直接支持浮點型數據格式,音頻播放硬體dac只支持整形pcm和dsd數據格式,所以大部分dac的驅動及其硬體抽象層不接收浮點數據格式,需要將浮點數據在到達驅動和硬體抽象層之前轉換為整形數據。在安卓系統中音頻數據需經過src進行轉換,因此在本實現方式中,將轉化放在硬體抽象層,避免了中間層轉換而導致音頻數據經過src(採樣頻率轉換器)轉換而造成的音質損失。
24.本實現方式中,音頻播放硬體的抽象層增加直接播放應用層支持的音頻格式實現完全直通播放通路。具體實施時,除了增加支持上層應用普遍支持的audio_format_pcm_16_bit,還實現了根據音頻播放硬體的支持,增加了多種使用廣泛的音頻輸出格式直接播放的支持:audio_format_pcm_32_bit,audio_format_pcm_8_24_bit,audio_format_pcm_24bit_packed,audio_format_dsd。自建音頻播放應用可以有更多的輸出格式選擇,增加對mqa音樂和dop(dsd over pcm)傳輸的支持。
25.結合第一方面,在第一方面的另一種可能的實現方式中,直通標識為audio_output_flag_direct輸出標識,這個標識為強制音頻通道為直通通道,保證了音頻能夠通過直通通道播出無損音質的聲音。
26.第二方面,本技術還提供一種終端設備,包括:至少一個處理器和存儲器,其中,所
述存儲器,用於存儲電腦程式指令和/或數據;所述至少一個處理器,用於執行所述指令,以實現前述第一方面各種實現方式中的方法。
27.可選的,所述終端設備還包括接口電路,所述接口電路用於獲取所述存儲器中的電腦程式指令和/或數據。
28.可選的,所述至少一個處理器、存儲器和所述接口電路可以集成在一個處理晶片或者晶片電路中。
29.可選的,所述終端設備包括但不限於手機、pc、平板電腦、電話手錶。
30.第三方面,本技術還提供了一種計算機可讀存儲介質,該存儲介質中存儲有指令,使得當指令在計算機或處理器上運行時,可以用於執行前述第一方面以及第一方面各種實現方式中的方法,和,前述第二方面各種實現方式中的方法。
31.另外,本技術還提供了一種電腦程式產品,該電腦程式產品包括計算機指令,當該指令被計算機或處理器執行時,可實現前述第一方面以及第一方面各種實現方式中的方法,和,前述第二方面以及第二方面各種實現方式中的方法,以及,前述第三方面以及第三方面各種實現方式中的方法。
32.需要說明的是,上述第二方面至第三方面的各種實現方式的技術方案所對應的有益效果與前述第一方面以及第一方面的各種實現方式的有益效果相同,具體參見上述第一方面以及第一方面的各種實現方式中的有益效果描述,不再贅述。
附圖說明
33.圖1是本發明實施例的整體結構示意圖;
34.圖2是本發明實施例的方法流程圖;
35.本發明目的的實現、功能特點及優點將結合實施例,參照附圖做進一步說明。
具體實施方式
36.為了更進一步說明本發明的技術方案內容,以下結合附圖進行說明。同時,需要說明的是本發明涉及的技術方案內容及技術特徵在不產生衝突的情況下,是可以相互結合使用的。
37.本發明涉及的技術術語解釋具體如下:
38.本發明中涉及到「第一」、「第二」並沒有先後順序之分,也沒有表示特定位置的用途,只是為了區別而已。
39.本技術所涉及的播放方法可應用手機設備的音頻播放,基於安卓的音頻應用的獨佔播放。主要包括第一管理模塊,即用於音頻通道管理的音頻通道管理模塊;第二管理模塊,即用於直通播放管理的直通播放管理模塊;以及第三管理模塊,即用於應用管理的應用管理模塊。
40.如圖1所示,本實施例提供的一種音頻播放方法,包括:
41.101:當終端設備正在通過當前應用播放音頻時,第一管理模塊接收第一應用發送的播放請求,所述第一管理模塊用於音頻通道管理,所述第一管理模塊對第一應用設置直通標識,第一管理模塊向第二管理模塊發送直通播放請求。
42.102:所述第二管理模塊用於直通播放管理,第二管理模塊接收直通播放請求後發
送停止通知給第三管理模塊。
43.103:所述第三管理模塊用於應用管理,第三管理模塊接收停止通知關閉當前應用,所述第二管理模塊關閉當前應用的直通播放通道。
44.104:所述第二管理模塊釋放音頻播放硬體,所述第二管理模塊獲取第一應用的直通標識,所述第一應用通過第二管理模塊使用音頻播放硬體播放聲音。
45.如圖1所示步驟101還包括以下步驟:
46.10101:第一管理模塊檢查第一應用的通道標識,通標識包括第一管理模塊檢查第一應用的通道標識,當第一應用的通道標識設置為其他輸出標識,則刪除該輸出標識,同時對第一應用設置直通標識;
47.10102:當第一應用的通道標識設置為直通標識則不做刪除處理。
48.進一步的,第一管理模塊記錄第一應用的通道標識,並判斷通道標識是否為直通標識,如是則建立第一應用與直通通道的之間的對應關係,如否則先刪除第一應用的非直通標識,在對第一應用建立直通標識後建立第一應用與直通通道的之間的對應關係,這樣第一應用即可被強制執行通過直通通道播放音頻。
49.其中,第一應用具有音樂播放功能,比音樂,音樂app,音樂app,音樂等音頻播放app。
50.具體的,第二管理模塊接收直通播放請求時記錄每一個請求播放的應用的id信息,當第一應用請求通過直通播放時,第二管理模塊發送當前應用的id信息至第三管理模塊,第三管理模塊根據id信息停止當前應用。
51.第三管理模塊接收第二管理模塊發送當前應用的id信息,通過安卓activitymanager的forcestoppackage接口停止當前應用。
52.在音頻播放硬體的抽象層增加直接播放應用層支持的音頻格式。具體的,音頻播放硬體的抽象層增加
53.audio_format_pcm_float的音頻輸出格式,同時增加了多種使用廣泛的音頻輸出格式,如audio_format_pcm_32_bit,audio_format_pcm_8_24_bit,
54.audio_format_pcm_24_bit_packed,audio_format_dsd,提高了方法的兼容性和適應性,起到了補充作用。
55.audiotrack native api輸出標識:audio_output_flag_direct表示音頻流直接輸出到音頻設備,不需要軟體混音,一般用於hdmi設備聲音輸出,直通標識設置為audio_output_flag_direct輸出標識從而可以提高音頻播放應用輸出的音質。
56.第二方面,一種終端設備,包括:至少一個處理器和存儲器,存儲器,用於存儲電腦程式指令;至少一個處理器,用於執行所述指令,以實現所述的方法。
57.第三方面,一種計算機可讀存儲介質,計算機可讀存儲介質中存儲有電腦程式指令;當所述電腦程式指令被運行時,實現所述的方法。
58.本實施例提供的方法,能夠保證終端設備在有多個音頻播放應用運行時,同一時間只有一個應用在播放音頻,第一管理模塊對等待打開的第一應用設置直通標識,通過第三管理模塊關閉正在運行的當前應用以及第二管理模塊關閉當前應用的直通播放通道,使得第一應用能夠經過直通通道播放音頻,並保證當前應用能夠被關閉並不佔用直通通道的以上作用,再加上對音頻播放硬體的抽象層進行優化,使其能夠實現上次應用支持的所有
格式的直接播放功能,進一步保證了直通播放通道的完全打通。因此,音頻全局獨佔播放的意義在於所用音頻播放應用都能以自己所輸出的音頻格式,直接傳輸到音頻播放硬體,實現音頻數據得以原汁原味地傳輸,達到真正的無損播放。
59.在一種實施例中,實現安卓所有音頻應用的獨佔播放管理,其中的當前應用和第一應用為舉例說明先後打開的音頻播放軟體,當前應用為正在使用的應用,第一應用為接下來打開使用的應用,並且應用的打開按照時間順序進行先後的排隊,並不特指此只有兩種,可以是多個應用。
60.具體的,播放方法包括:
61.參照圖2,在終端設備上,第二管理模塊發送當前應用的id信息至第三管理模塊請求停止當前應用,同時第二管理模塊關閉當前應用所佔直通播放通道,第三管理模塊根據請求關閉當前應用。第一管理模塊收到第一應用的播放請求後設置直通標識,向第二管理模塊請求直通播放通道。另外,音頻播放硬體的抽象層增加直接播放應用層支持的音頻格式,實現完全直通播放通路。
62.一、第一管理模塊(音頻播放通道管理),在接收到第一應用的播放請求後,設置直通標識,發送直通請求至第二管理模塊(直通播放管理)申請直通播放通道。第二管理模塊(直通播放管理)收到第一應用的直通播放請求後,通知第三管理模塊(app管理)停止當前應用,同時第二管理模塊(直通播放管理)關閉當前的直通播放通道,釋放音頻播放硬體,給第一應用使用。第三管理模塊(app管理)得到當前應用的id信息後,停止當前應用,從而保證同一時間只有一個應用在播放音頻。音頻播放硬體的抽象層實現了上層應用支持的所有格式的直接播放功能,使得直通播放通道完全打通,每個音頻應用都能實現真正的無損播放。
63.二、第一應用的音頻播放請求送到第一管理模塊(音頻播放通道管理)後,設置直通標識,設置直通標識,明確所需通道需要直通,希望通道內音頻數據在傳輸過程不被修改,如格式轉換,重採樣,downmix等。
64.三、第一應用能夠獨佔直通播放通道,當前應用要停止播放音頻,防止當前應用再次申請播放搶走第一應用的直通播放通道,同時要關閉當前應用佔據的直通播放通道,釋放音頻播放硬體給第一應用。
65.第四、第一管理模塊(音頻播放通道管理)收到新的直通播放請求後,通知第三管理模塊(app管理)停止當前應用,第一管理模塊(音頻播放通道管理)記錄每一個請求的應用的pid,uid,包名等信息,當有一個新的應用請求直通時,發送當前直通應用的信息給第三管理模塊(app管理),第三管理模塊(app管理)根據這些信息停止當前應用。
66.第三管理模塊(app管理)得到當前應用的信息後,執行停止當前應用的操作,保證同一時間只有一個應用在播放音頻。安卓的aduiotrack實現中,在當前應用失去音頻播放通道後,當前應用會嘗試重建播放通道。因此,第三管理模塊(app管理)如果不停止當前應用,則當前應用的audiotrack會嘗試重建播放通道,請求通過第一管理模塊(音頻播放通道管理)到達直通播放管理的目的,當前應用的直通播放通道被搶走,然後當前應用的audiotrack再去嘗試重建播放通道,這會造成兩個應用陷入不斷地去搶直通播放通道的循環中,所以第二管理模塊關閉當前應用的直通通道是必要的。
67.第五、第一管理模塊(音頻播放通道管理)收到新的直通播放請求後,關閉當前應
用佔據的直通播放通道。關閉當前應用佔據的直通播放通道,可以立即釋放音頻播放硬體,讓當前應用快速起播,提升用戶體驗。
68.第六、音頻播放硬體的抽象層直接支持上層應用解碼輸出的格式的播放。如果硬體抽象層不支持上層應用解碼輸出的格式,在安卓系統上就不能走直通通道,音頻數據可能會被重採樣或downmix,音質得不到保證。
69.音頻播放硬體抽象層,實現了上層應用支持的所有格式的直接播放功能,使得直通播放通道完全打通。安卓在audioformat.java聲明了安卓系統支持的音頻輸出格式,不需要額外codec或dsp支持的格式,這些格式有encoding_pcm_16bit,encoding_pcm_8bit,encoding_pcm_float,而其中encoding_pcm_8bit使用極少,可以不考慮,encoding_pcm_16bit和encoding_pcm_float是使用最廣泛的,大部分音頻播放應用都會以這兩個格式作為音頻輸出格式。
70.安卓的音頻硬體抽象層實現了encoding_pcm_16bit格式直接播放的支持,沒有實現encoding_pcm_float直接播放的支持。
71.如使用encoding_pcm_float作為音頻輸出格式的音頻播放應用,則不能走安卓的直通播放通道,而走安卓的混音通道,安卓的src將作用於音頻數據,導致音質損失。
72.本發明在音頻播放硬體抽象層增加了audio_format_pcm_float直接播放的支持,解決了上述問題。
73.除此之外,本發明在音頻播放硬體抽象層,根據音頻播放硬體的支持,增加了多種使用廣泛的音頻輸出格式直接播放的支持:
74.audio_format_pcm_32_bit,audio_format_pcm_8_24_bit,
75.audio_format_pcm_24_bit_packed,audio_format_dsd。本發明的第二方面所述設備中的自建音頻播放應用可以使用這些格式作為輸出格式,實現完全bit-perfect輸出。在獲得更好的音質同時,還支持傳輸mqa音樂和dop(dsd over pcm)。
76.當第一應用的通道標識的設置為audio_output_flag_deep_buffer輸出標識,則刪除該輸出標識,
77.並同時對第一應用設置audio_output_flag_direct輸出標識;
78.綜上,本發明通過第一管理模塊對每一個請求播放的音頻播放應用設置直通標誌,通過第二管理模塊發送當前應用的id信息給第三管理模塊,通過第三管理模塊停止當前應用,同時第二管理模塊關閉當前應用的直通播放通道,釋放音頻播放硬體,給第一應用使用。於此同時,在音頻播放硬體抽象層增加多種音頻格式的直接播放支持,形成完全直通通路。這樣所有的音頻播放應用都能以自己所輸出的音頻格式直接傳輸到音頻播放硬體,實現原汁原味地播放,達到真正的無損播放。
79.以上僅為本發明的實施方式,並非因此限制本發明的專利範圍,凡是利用本發明說明書及附圖內容所作的等效結構或等效流程變換,或直接或間接運用在其他相關的技術領域,均同理包括在本發明的專利保護範圍內。