AVAudioSession(4):響應音頻中斷事件

来源:http://www.cnblogs.com/samirchen/archive/2017/06/24/7072734.html
-Advertisement-
Play Games

本文轉自:[AVAudioSession(4):響應音頻中斷事件 | www.samirchen.com][2] 本文內容主要來源於 [Responding to Interruptions][3]。 當一個音頻中斷到來時,會關閉你的 Audio Session,這通常就意味著停止或暫停你的音頻播放 ...


本文轉自:AVAudioSession(4):響應音頻中斷事件 | www.samirchen.com

本文內容主要來源於 Responding to Interruptions

當一個音頻中斷到來時,會關閉你的 Audio Session,這通常就意味著停止或暫停你的音頻播放。產生中斷通常是因為另一個和你的應用存在競爭性音頻行為的應用此時被激活,而這個應用設置的 Category 不支持 mix 你的音頻。正確的處理音頻中斷事件能夠讓你的應用提供給用戶更好的體驗。

當用戶電話響起的時候,你的應用還會因中斷而被掛起。當電話結束,你的應用才會被繼續運行。這時你的 Audio Session 需要被重新激活。

音頻中斷處理技術

你可以通過監聽音頻中斷相關的通知 AVAudioSessionInterruptionNotification 來處理中斷事件。

當音頻中斷發生時,你應該做的事情大致如下:

  • 中斷開始後
    • 1)保持狀態和上下文;
    • 2)更新用戶界面。
  • 中斷結束後
    • 1)恢復狀態和上下文;
    • 2)在應用準備好時激活 Audio Session;
    • 3)更新用戶界面。

根據使用的音頻技術不同,相應的處理中斷的技術也會有所差別,大致如下:

  • AV Foundation framework:AVAudioPlayer 類和 AVAudioRecorder 類提供了中斷開始和結束的 Delegate 回調方法來供你處理中斷。你可以實現這些回調方法來在對應的時候更新你的用戶界面,以及在中斷結束後恢復播放。使用這兩個類播放或錄製音頻,當發生中斷時,系統會自動暫停播放或錄製,在中斷結束時,當你恢復播放或錄製時,系統會自動激活你的 Audio Session。如果你想要在應用退出/啟動時,記錄/恢復播放位置,那麼在發生中斷時,你也要記得記錄一下播放位置。

  • Audio Queue Services, I/O audio unit:這些技術需要你的應用自己來處理中斷,你需要負責記錄播放或錄製的位置,以便在中斷結束恢復 Audio Session 時用到。

  • OpenAL:當使用 OpenAL 播放時,你需要註冊對應的通知事件來監聽中斷。並且你還需要自己管理 OpenAL 的上下文。

  • System Sound Services:使用 System Sound Services 播發音頻,當中斷發生時,音頻播放會靜音,當中斷結束後,音頻播放會恢復。你的應用則無法影響音頻中斷時的行為。

中斷的生命周期

音頻中斷發生的過程大致如下圖所示:

image

  • 1)你的應用正在運行,在播放音頻。
  • 2)來了一個電話。系統激活電話應用的 Audio Session。
  • 3)系統關閉你的 Audio Session。這時,你的應用里的音頻播放被停止了。
  • 4)系統調用你應用的中斷監聽回調方法,通知你:你的 Audio Session 已經被關閉了。
  • 5)你的回調方法做出合適的處理,比如:更新用戶界面,保持當前狀態信息和上下文以便於恢復播放時用。
  • 6)當用戶解除中斷,比如掛掉了電話,系統會調用你的回調方法,通知你:中斷結束了。
  • 7)你的回調方法做出合適的處理,比如:更新用戶界面,重新激活 Audio Session,恢復播放。
  • 8)如果在 6 中用戶沒有解除中斷,比如接聽了電話,系統會將你的應有掛起,當通話結束後,中斷結束的消息會通知給你。

需要註意的是,有一個中斷開始消息不一定會有一個中斷結束消息,這就意味著你在中斷結束的回調里的處理邏輯可能會沒有被執行到。所以你的應用需要關註當切到前臺運行狀態時或者用戶點擊了播放按鈕時,是不是需要重新激活你的 Audio Session,因為有可能這時候你的 Audio Session 還因為一次有開始通知沒結束通知的中斷給關閉著呢。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • var arr1 = [1,2,3,4,5,6]; arr1[0]; arr1[1]; console.log("長度:"+arr1.length); 一、遍曆數組 / * i=下標*/ for(var i=0;i<arr1.length;i++){ console.log(arr1[i]); } ...
  • Es6中如何使用splic,delete等數組刪除方法 1:js中的splice方法 splice(index,len,[item]) 註釋:該方法會改變原始數組。 splice有3個參數,它也可以用來替換/刪除/添加數組內某一個或者幾個值 index:數組開始下標 len: 替換/刪除的長度 it ...
  • 在《vue-cli搭建的項目中增加後臺mock介面》中實現了後臺mock,但是前端post的t數據都要在mock的後臺介面中使用req的接收數據事件獲取http協議body中的數據。 如果前端需要使用cookie,後端要讀取,那麼在後臺mock的介面中還要獲取req的headers,並從中取得coo ...
  • 為 device node 取 label name, 可以在其它位置使用 &label 存取 device node。 Ex ./arch/arm/boot/dts/stm32f429.dtsi ./arch/arm/boot/dts/stm32f429 disco.dts ...
  • 目錄 RunTime 概述 RunTime消息機制 RunTime交換方法 RunTime消息轉發 RunTime關聯對象 RunTime實現字典與模型互轉 1.RunTime 概述 我們在面試的時候,經常都會被問到這麼個問題:為什麼說OC是一門動態的語言???其實也就是想知道你對runtime的了 ...
  • 問題:E/NotificationService: Not posting notification with icon==0: Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x0 co ...
  • Android提供NDK開發包來提供Android平臺的C++開發,用來擴展Android SDK的功能。主要包括Android NDK構建系統和JNI實現與原生代碼通信兩部分。 一、Android NDK構建系統 1.1 構建庫 Android NDK的構建系統是基於GNU Make的。Andro ...
  • 本文轉自:[FFmpeg 入門(1):截取視頻幀 | www.samirchen.com][2] 背景 在 Mac OS 上如果要運行教程中的相關代碼需要先安裝 FFmpeg,建議使用 brew 來安裝: 或者你可以參考[在 Mac OS 上編譯 FFmpeg][5]使用源碼編譯和安裝 FFmpeg ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...