iOS 的音頻播放

来源:https://www.cnblogs.com/v2m_/archive/2018/03/15/8575622.html
-Advertisement-
Play Games

一、Audio Toolbox 1.使用代碼 import AudioServicesPlaySystemSound(1106); 2.如果想用自己的音頻文件創建系統聲音來播放的同學可以參考如下代碼。 //Get the filename of the sound file: NSString pa ...


一、Audio Toolbox

1.使用代碼

#import <AudioToolbox/AudioToolbox.h>
AudioServicesPlaySystemSound(1106); 

2.如果想用自己的音頻文件創建系統聲音來播放的同學可以參考如下代碼。

//Get the filename of the sound file:
NSString *path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], @"/jad0007a.wav"];
// declare a system sound
id SystemSoundID soundID;
//Get a URL for the sound file
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
//Use audio sevices to create the sound
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
//Use audio services to play the sound
AudioServicesPlaySystemSound(soundID);

3.系統提示音對應的列表

AudioServices - iPhone Development Wiki(http://iphonedevwiki.net/index.php/AudioServices)

二、AVAudioPlayer

1.聲音播放

#import <AVFoundation/AVFoundation.h>


NSURL* url = [[NSBundlemainBundle] URLForResource:@"five"withExtension:@"mp3"];
AVAudioPlayer* audioPlay = [[AVAudioPlayeralloc] initWithContentsOfURL:url error:nil]; 
[audioPlay play];

三、AVAudiosession

AVAudiosession是AVFoundation框架提供的一個單例類,可以用來為我們的APP設置一個合適的音頻環境。通過對他進行配置,我們可以為自己的音樂播放APP設置合適的特征。

1.category屬性,預設值是AVAudioSessionCategorySoloAmbient

Category 說明 場景 輸入 輸出 混合 遵從靜音
AVAudioSessionCategoryAmbient 背景音效 NO YES YES YES
AVAudioSessionCategoryPlayback 音樂播放器 NO YES NO NO
AVAudioSessionCategoryOptionMixWithOthers
AVAudioSessionCategorySoloAmbient NO YES NO YES
AVAudioSessionCategoryRecord YES NO NO NO
AVAudioSessionCategoryPlayAndRecord YES YES NO NO
AVAudioSessionCategoryAudioProcessing 使用硬體解碼器處理音頻,該音頻會話使用期間,不能播放或錄音
AVAudioSessionCategoryMultiRoute YES YES NO NO

2.靜音狀態下播放

 [[AVAudioSession sharedInstance] setActive:YES

                                       error:nil];

四、音頻中斷

手機上不止我們一款APP,在聽歌的時候,如果有人給我們打電話;或者之前定的一個鬧鐘到時間了;或者使用了siri功能。這些會使用手機音頻的應用,就會跟我們的APP音頻起衝突。稱作音頻中斷。

iOS系統的音頻服務優先順序高於第三方APP。當有電話進入、系統鬧鐘響起,都會導致第三方APP的audiosession中斷。

有兩種方式來處理這種中斷

1.通過註冊觀察者來獲取AVAudioSessionInterruptionNotification事件的通知來響應中斷的開始和結束。

2.設置AVAudioSession代理

  //設置代理 可以處理電話打進時中斷音樂播放

  [[AVAudioSession sharedInstance] setDelegate:self];

五、遠程式控制制

1.iOS7.1之後

Media Player framework 加入了MPRemoteCommandCenter這個類。使用block類實現遠程式控制制回調。

要讓APP支持RemoteControl,我們需要用到MPRemoteCommandCenter單例類。它提供了處理 remote control events所需要的對象。它的屬性中包括了眾多MPRemoteCommand類對象,代表著iOS所支持的不同類型的remote control evnt。為MPRemoteCommand對象添加target和action來響應其控制事件。

2.iOS7.1之前

需要在UIApplication中實現remoteControlReceivedWithEvent來處理。

六、鎖屏界面顯示歌曲信息

為了在鎖屏界面和控制中心顯示當前歌曲的信息,需要用到Media Player FrameworkMPNowPlayingInfoCenter類。把需要顯示的信息組織成Dictionary並賦值給nowPlayingInfo屬性就完成了。

一些常見的屬性值如下:

 // MPMediaItemPropertyAlbumTitle           專輯標題 
 // MPMediaItemPropertyAlbumTrackCount      聲道個數 
 // MPMediaItemPropertyAlbumTrackNumber     左右聲道 
 // MPMediaItemPropertyArtist               藝術家(歌曲作者) 
 // MPMediaItemPropertyArtwork              鎖屏界面的封面 
 // MPMediaItemPropertyComposer 
 // MPMediaItemPropertyDiscCount 
 // MPMediaItemPropertyDiscNumber 
 // MPMediaItemPropertyGenre 
 // MPMediaItemPropertyPersistentID 
 // MPMediaItemPropertyPlaybackDuration     播放時長 
 // MPMediaItemPropertyTitle 

除了上面的Item Property,還有一些播放信息的屬性值,Playing Info Property,其中需要特別註意的是MPNowPlayingInfoPropertyPlaybackRateMPNowPlayingInfoPropertyElapsedPlaybackTime。前者表示播放速率,後者表示已播放時間,即上圖中進度條左邊的時間。當設置了這兩個值,並且當前正在播放,就會自動地根據前一個時間和播放速率來計算。

在iOS11之前,當歌曲暫停時,其實該值還是在增加。為了保證該值的精確,需要在暫停和重新開始播放時,重新設置MPNowPlayingInfoPropertyPlaybackRate的值。

特別在iOS 11時,我們需要指定playbackState的值,當不是MPNowPlayingPlaybackStatePlaying時,並不會在鎖屏界面顯示當前播放信息。

參考1:http://www.samirchen.com/ios-avaudiosession-3/

參考2:http://msching.github.io/blog/2014/11/06/audio-in-ios-8/


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

-Advertisement-
Play Games
更多相關文章
  • 查詢語句類型: 簡單查詢 多表查詢 子查詢(嵌套查詢) 查詢語法: SELECT field_name :field_name為欄位名,選擇要查詢的列 FROM table_name :database_name為資料庫名,選擇要查詢的數據表 [ WHERE condition ] : condit ...
  • assign:簡單的賦值。 retain:賦值之後,會調用新的retain方法和舊值的release方法。 copy:表示先將值拷貝一份,然後,將這個拷貝賦值給實例變數,這個修飾詞只適用於實現了NSCopying協議的類型。 weak:表示這個屬性的值將是一個弱引用,引用和被引用之間沒有所屬關係。如 ...
  • 簡要:本系列文章講會對expo進行全面的介紹,本人從2017年6月份接觸expo以來,對expo的研究斷斷續續,一路走來將近10個月,廢話不多說,接下來你看到內容,講全部來與官網 我猜去全部機翻+個人修改補充+demo測試的形式,對expo進行一次大補血!歡迎加入expo興趣學習交流群:597732 ...
  • 簡要:本系列文章講會對expo進行全面的介紹,本人從2017年6月份接觸expo以來,對expo的研究斷斷續續,一路走來將近10個月,廢話不多說,接下來你看到內容,講全部來與官網 我猜去全部機翻+個人修改補充+demo測試的形式,對expo進行一次大補血!歡迎加入expo興趣學習交流群:597732 ...
  • 簡要:本系列文章講會對expo進行全面的介紹,本人從2017年6月份接觸expo以來,對expo的研究斷斷續續,一路走來將近10個月,廢話不多說,接下來你看到內容,講全部來與官網 我猜去全部機翻+個人修改補充+demo測試的形式,對expo進行一次大補血!歡迎加入expo興趣學習交流群:597732 ...
  • 最近在做項目的時候遇到了一個需求,那就是要對一張圖片做處理,實現邊緣模糊過渡。 苦思良久,最終用了以下的方法。 1、構成一張圖片的是ARGB,我們可以直接把這整張圖片的ARGB取出來,然後改變圖片的A,也就是透明度。 以上我們便獲得了圖片的ARGB值,而我們只需要改變透明度A。 2、我們可以用 最後 ...
  • 普通廣播: 1.在AndroidManifest.xml中配置廣播接收器: <receiver android:name="com.example.toast.MyBroadReceiver" > <intent-filter> <action android:name="MyBroad" /> < ...
  • 對於這個問題,今天折騰了一下午,不是說我不懂得怎麼調用,而是我用了看似正確的調用方式,而其實這是一個坑。 我用了下麵這種方式: 用這種方式是正確的,必須要將context轉換為Activity。 但是由於我是在一個特殊的場景裡面使用的,導致activity的onActivityResult沒有被回調 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...