日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【实战分享】使用Core Audio实现VoIP通用音频模块

發布時間:2025/3/8 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【实战分享】使用Core Audio实现VoIP通用音频模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一直在做iOS音頻技術相關的項目,由于單項直播SDK,互動直播SDK(iOS/Mac),短視頻SDK,都會用到音頻技術,因此在這里收集三個SDK的音頻技術需求,開發一個通用的音頻模塊用于三個SDK,同時支持iOS和Mac。

需求實現

主要包括音頻采集,音頻格式轉換,音頻多路混音(本地文件和網絡文件),寫WAV/AAC音頻文件,通話錄制,音頻文件播放,耳返,自定義音頻輸入,音視頻設備管理等功能。

本文大部分圖片和技術概念闡述均來自Apple官網。

概念介紹

Core Audio 是iOS和 Mac 的關于數字音頻處理的基礎,它提供應用程序用來處理音頻的一組軟件框架,所有關于iOS音頻開發的接口都是由Core Audio來提供或者經過它提供的接口來進行封裝的,按照官方的說法是集播放、音頻處理、錄制為一體的專業技術,通過它我們的程序可以同時錄制,播放一個或者多個音頻流,自動適應耳機,藍牙耳機等硬件,響應各種電話中斷,靜音,震動等。

Low-Level

  • I/O Kit:與硬件驅動交互

  • Audio HAL:音頻硬件抽象層,使API調用與實際硬件相分離,保持獨立

  • Core MIDI:為MIDI流和設備提供軟件抽象工作層

  • Host Time Services:訪問電腦硬件時鐘

Mid-Level

  • Audio Convert Services?負責音頻數據格式的轉換

  • Audio File Services?負責音頻數據的讀寫

  • Audio Unit Services?和?Audio Processing Graph

  • Services?支持均衡器和混音器等數字信號處理的插件

  • Audio File Scream Services?負責流解析

  • Core Audio Clock Services?負責音頻時鐘同步

High-Level

  • Audio Queue Services?提供錄制、播放、暫停、循環、和同步音頻,它自動采用必要的編解碼器處理壓縮的音頻格式

  • AVAudioPlayer?是專為iOS平臺提供的基于Objective-C接口的音頻播放類,可以支持iOS所支持的所有音頻的播放

  • Extended Audio File Services?由Audio File與Audio Converter組合而成,提供壓縮及無壓縮音頻文件的讀寫能力

  • OpenAL?是CoreAudio對OpenAL標準的實現,可以播放3D混音效果

OS X 和 iOS 的核心音頻架構

Audio Unit

iOS提供了混音、均衡、格式轉換、實時IO錄制、回放、離線渲染、語音對講(VoIP)等音頻處理插件,它們都屬于不同AudioUnit,支持動態載入和使用。AudioUnit可以單獨創建使用,但更多的是被組合使用在Audio Processing Graph容器中以達到多樣的處理需要。

一個I/O Unit包含兩個實體對象,兩個實體對象(Element 0、Element 1)相互獨立,根據需求可通過kAudioOutputUnitProperty_EnableIO屬性去開關它們。Element 1與硬件輸入連接,并且Element 1的輸入域(input scope)對你不可見,你只能讀取它的輸出域的數據及設置其輸出域的音頻格式;Element 0與硬件輸出連接,并且Element 0的輸出域(ouput scope)對你不可見,你只能寫入它的輸入域的數據及設置其輸入域的音頻格式。

Audio Session

AVAudioSession構建了一個音頻使用生命周期的上下文。當前狀態是否可以錄音、對其他App有怎樣的影響、是否響應系統的靜音鍵、如何感知來電話了等都可以通過它來實現。

Audio Processing Graphs

AUGraph可以用來構建和管理一個音頻單元處理鏈。能夠利用多個音頻單元的功能和多個渲染回調函數,允許您創建幾乎任何你可以想象的音頻處理的解決方案。同時它也是線程安全的。

Audio Flows Through a Graph Using “Pull”

在一個音頻處理圖,當需要更多的音頻數據時,使用者調用提供者。有源源不斷的音頻數據流的請求,這個控制流的方向和音頻流方向相反。

具體實現

一. 音頻采集

iOS采集:

kAudioUnitSubType_RemoteIO

kAudioUnitSubType_VoiceProcessingIO

Mac采集:

kAudioUnitSubType_VoiceProcessingIO

一個I/O Unit包含兩個實體對象,兩個實體對象(Element 0、Element 1)相互獨立。Element 1與硬件輸入(麥克風或者聽筒)連接,并且Element 1的輸入域(input scope)對你不可見,你只能讀取它的輸出域的數據及設置其輸出域的音頻格式;Element 0與硬件輸出(揚聲器或者聽筒)連接,并且Element 0的輸出域(ouput scope)對你不可見,你只能寫入它的輸入域的數據及設置其輸入域的音頻格式。

操作步驟:

  • 創建AudioUnit。

  • 開啟麥克風或者聽筒的輸入開關;開啟揚聲器或者聽筒的輸出開關。

  • 設置輸入和輸出的采集回調和播放回調。

  • 設置輸入和輸出的音頻格式。

  • 初始化AudioUnit。

  • 開啟AudioUnit。

  • Mac采集:

    kAudioUnitSubType_HALOutput

    Mac的音頻采集使用的是kAudioUnitSubType_HALOutput,音頻硬件抽象層HAL。因此它使用的是2個I/O Uint串聯,前一個I/O Uint的輸出作為后一個I/O Uint的輸入。

    操作步驟:

  • 創建2個AudioUnit。

  • 開啟第一個I/O Uint的麥克風或者聽筒的輸入開關,關閉第一個I/O Uint的揚聲器或者聽筒的輸出開關;開啟第二個I/O Uint的揚聲器或者聽筒的輸出開關,關閉第二個I/O Uint的麥克風或者聽筒的輸入開關。

  • 將第一個I/O Unit設為Mac的kAudioHardwarePropertyDefaultInputDevice,第二個I/O Unit設為Mac的kAudioHardwarePropertyDefaultOutputDevice,

  • 設置第二個I/O Uint的輸入和第一個I/O Uint的輸出的采集回調和播放回調。

  • 設置第二個I/O Uint的輸入和第一個I/O Uint的輸出的音頻格式。

  • 初始化2個AudioUnit。

  • 開啟2個AudioUnit。

  • 二.?音頻架構

    從圖中可以看出,我們使用了一個I/O Unit作為最核心的部件,用于驅動整個流程,同時使用三個Audio Processing Graphs作為混音器。三個Audio Processing Graphs分別代表播放混音器,發送混音器,錄制混音器。每個混音器有三個Unit最為其部件,音頻混音Mixing(kAudioUnitSubType_MultiChannelMixer),音頻格式轉換(kAudioUnitSubType_AUConverter),音頻通用輸出(kAudioUnitSubType_GenericOutput)。同時支持多路輸入,一路輸出。

    1. 播放混音器支持來自服務器的多路音頻流和一路本地伴音以及一路耳返音頻,每一路輸入都會接一個音頻格式轉換,同時設置一個輸入回調,用于音頻數據的主動拉取。并將混音器的輸出作為Audio Unit的輸入。

    2. 發送混音器支持一路Audio Unit的采集和本地多路音頻伴音的輸入,每一路輸入都會接一個音頻格式轉換,同時設置一個輸入回調,用于音頻數據的主動拉取。并將混音器的輸出作為音頻編碼和發送的輸入。

    3. 錄制混音器支持Audio Unit的一路采集和Audio Unit的一路播放,將整個通話過程涉及到的音頻數據都合成一路。每一路輸入都會接一個音頻格式轉換,同時設置一個輸入回調,用于音頻數據的主動拉取。并將混音器的輸出作為通話錄制的輸入,并寫WAV/AAC文件。

    4. Audio Unit的采集回調驅動音頻編碼,從而驅動整個發送混音器;Audio Unit的采集回調驅動通話錄制,從而驅動整個錄制混音器;Audio Unit的播放回調驅動播放,從而驅動整個播放混音器。

    5. 目前最新的音頻架構,我們使用了兩個I/O Unit作為最核心的部件,用于驅動整個流程。同時統一了iOS和Mac 2個版本,也解決了采集和播放同一個線程的問題,為我們的音頻前處理提供了安全的線程保障。

    三. AVAudioSeeion管理

    AVAudioSession 的主要功能包括以下幾點功能:

    • 向系統說明你的app使用音頻的模式(比如是播放還是錄音,是否支持藍牙播放,是否支持后臺播放)

    • 為你的app選擇音頻的輸入輸出設備(比如輸入用的麥克風,輸出是耳機、手機功放或者airplay)

    • 協助管理多個音源需要播放時的行為(例如同時使用多個音樂播放app,或者突然有電話接入)

    如果需要音頻支持后臺運行,需要按下圖配置:

    在需要完成上述功能點的前提下,我們需要監聽中斷響應,外設改變,媒體服務器終止,媒體服務器重新啟動,前后臺切換的通知。在不同的通知下,做出相應的調整。

    系統中斷響應:

    AVAudioSession提供了多種Notifications來進行此類狀況的通知。其中將來電話、鬧鈴響等都歸結為一般性的中斷,用AVAudioSessionInterruptionNotification來通知。其回調回來的userInfo主要包含兩個鍵:AVAudioSessionInterruptionTypeKey: 取值為AVAudioSessionInterruptionTypeBegan表示中斷開始,我們應該暫停播放和采集,取值為AVAudioSessionInterruptionTypeEnded表示中斷結束,我們可以繼續播放和采集。

    AVAudioSessionInterruptionOptionKey: 當前只有一種值AVAudioSessionInterruptionOptionShouldResume表示此時也應該恢復繼續播放和采集。

    外設改變:

    在NSNotificationCenter中對AVAudioSessionRouteChangeNotification進行注冊。在其userInfo中有鍵:AVAudioSessionRouteChangeReasonKey : 表示改變的原因

    參考文檔

    • https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/AudioUnitHostingGuide_iOS/AudioUnitHostingFundamentals/AudioUnitHostingFundamentals.html#//apple_ref/doc/uid/TP40009492-CH3-SW11

    • https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/CoreAudioOverview/Introduction/Introduction.html#//apple_ref/doc/uid/TP40003577-CH1-SW1

    點擊“閱讀原文”,技術干貨

    總結

    以上是生活随笔為你收集整理的【实战分享】使用Core Audio实现VoIP通用音频模块的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产精品九九九 | 国产又粗又猛又爽又黄av | 亚洲中文字幕一区二区在线观看 | 欧美黄色小说 | 日韩精品在线免费 | 99热在线观看免费 | 日欧美女人 | 国产区精品 | 国产欧美精品久久久 | 国产精品乱码久久久久 | 四虎三级 | 91免费黄 | 中文免费在线观看 | 国产无玛| 精品人妻无码一区二区三区蜜桃一 | 国产污污视频 | 久久性感美女视频 | 免费特级毛片 | 中文字幕av高清 | 精品国产一区二区三区四 | 欧美性猛交xxxx乱大交hd | 亚洲狼人av| 高清欧美性猛交 | 美女张开腿让人桶 | 国产精品九 | 秋霞无码一区二区 | 成人区一区二区 | 日日爱网站| 国产一区在线不卡 | 91国自啪 | 中文字幕永久 | 亚洲一区二区三区四区在线观看 | 激情综合网五月天 | 欧美丰满熟妇bbbbbb | 日韩色图一区 | 久久精品免费网站 | 中文字幕一区二区三区免费 | 男人的天堂av网 | 久久国产日韩欧美 | 秋霞无码一区二区 | 亚洲精品日韩综合观看成人91 | 亚洲天堂avav| 国产99久久久久久免费看 | 大胸美女被爆操 | 卡通动漫亚洲综合 | 国产91小视频 | 嫩草影院在线观看视频 | 亚洲人成电影在线播放 | 五月综合激情 | 懂色中文一区二区在线播放 | 欧美人体一区二区 | 国产又粗又猛又黄又爽视频 | 日韩少妇毛片 | 亚洲一卡二卡 | 国产99久久久欧美黑人 | 青青草一区二区三区 | 欧美黑人一级爽快片淫片高清 | 亚洲少妇一区二区三区 | 欧洲亚洲自拍 | 亚洲六月丁香色婷婷综合久久 | 国产一区二区免费视频 | 亚洲欧美韩日 | 99re6在线精品视频免费播放 | 黄色网一级片 | 极品销魂美女少妇尤物 | 国产视频一区二区三区在线观看 | 九草网 | 日本在线一 | 国产亚洲欧美一区二区三区 | 欧美日韩电影一区二区 | 国产aaaaaaa | 天天干天天操天天爱 | 国产aⅴ爽av久久久久成人 | 成人性生交大片免费看r链接 | 国产老头和老头xxxx× | 欧美激情精品久久久久久免费 | 亚洲人成人一区二区在线观看 | 极品色av影院 | 日韩视频在线免费观看 | www.五月天婷婷 | 丁香花高清在线 | 色亭亭| 色av一区二区 | 国产ts人妖调教重口男 | 中文字幕欧美人妻精品一区蜜臀 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 日日操夜夜操天天操 | 日本黄色一区二区 | 久久免费视频精品 | 青青草原国产在线 | 丝袜一区二区三区四区 | 人妻偷人精品一区二区三区 | av中文字幕亚洲 | 午夜福利电影 | 国产精品久久久无码一区 | 国产原创在线视频 | 星铁乱淫h侵犯h文 | 久草高清 | 夜夜爽夜夜操 |