1、系統(tǒng)聲音服務(wù)介紹:
系統(tǒng)聲音服務(wù)提供了一個(gè) Api察藐,用于播放不超過 30 秒的聲音皮璧。它支持的文件格式有限,具體的說(shuō)只 CAF分飞、AIF 和使用 PCM 或 IMA/ADPCM 數(shù)據(jù)的 WAV 文件悴务。
但此函數(shù)沒有提供操作聲音和控制音量的功能,因此如果是要為多媒體或游戲創(chuàng)建專門聲音譬猫,就不要使用系統(tǒng)聲音服務(wù)讯檐。
2、系統(tǒng)聲音服務(wù)支持如下三種類型:
(1)聲音:立刻播放一個(gè)簡(jiǎn)單的聲音文件删窒。如果手機(jī)靜音裂垦,則用戶什么也聽不見。
(2)提醒:播放一個(gè)聲音文件肌索,如果手機(jī)設(shè)為靜音或震動(dòng)蕉拢,則通過震動(dòng)提醒用戶。
(3)震動(dòng):震動(dòng)手機(jī)诚亚,而不考慮其他設(shè)置晕换。
3、使用樣例(首先類中要引入AudioToolbox)
import AudioToolbox
(1)聲音播放
func systemSound(_ sender: Any) {
//建立的SystemSoundID對(duì)象
var soundID:SystemSoundID = 0
//獲取聲音地址
let path = Bundle.main.path(forResource: "msg", ofType: "wav")
//地址轉(zhuǎn)換
let baseURL = NSURL(fileURLWithPath: path!)
//賦值
AudioServicesCreateSystemSoundID(baseURL, &soundID)
//播放聲音
AudioServicesPlaySystemSound(soundID)
}
(2)提醒
func systemAlert(_ sender: Any) {
//建立的SystemSoundID對(duì)象
var soundID:SystemSoundID = 0
//獲取聲音地址
let path = Bundle.main.path(forResource: "msg", ofType: "wav")
//地址轉(zhuǎn)換
let baseURL = NSURL(fileURLWithPath: path!)
//賦值
AudioServicesCreateSystemSoundID(baseURL, &soundID)
//提醒(同上面唯一的一個(gè)區(qū)別)
AudioServicesPlayAlertSound(soundID)
}
(3)振動(dòng)
func systemVibration(sender: AnyObject) {
//建立的SystemSoundID對(duì)象
let soundID = SystemSoundID(kSystemSoundID_Vibrate)
//振動(dòng)
AudioServicesPlaySystemSound(soundID)
}
4站宗、聲音或提醒播放完畢后的回調(diào)函數(shù)
默認(rèn)情況下每觸發(fā)一次聲音提醒闸准,系統(tǒng)就會(huì)執(zhí)行一次。不管當(dāng)前是否有其他的聲音提醒未播放完畢梢灭。這樣如果提醒聲音時(shí)間比較長(zhǎng)夷家,在短時(shí)間內(nèi)多次觸發(fā),那么就會(huì)造成重音(多個(gè)聲音疊加在一起)敏释。
我們可以設(shè)置個(gè)狀態(tài)變量库快,播放前先根據(jù)它來(lái)判斷是否要播放。同時(shí)使用 AudioServicesAddSystemSoundCompletion() 函數(shù)添加個(gè)聲音播放完畢的回調(diào)钥顽。在開始播放义屏、播放完畢中修改這個(gè)狀態(tài)變量即可。
import UIKit
import AudioToolbox
class ViewController: UIViewController {
//表示當(dāng)前是否在播放
var isPlaying = false
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btn(_ sender: Any) {
if !isPlaying {
//建立的SystemSoundID對(duì)象
var soundID:SystemSoundID = 0
//獲取聲音地址
let path = Bundle.main.path(forResource: "msg", ofType: "wav")
//地址轉(zhuǎn)換
let baseURL = NSURL(fileURLWithPath: path!)
//賦值
AudioServicesCreateSystemSoundID(baseURL, &soundID)
//添加音頻結(jié)束時(shí)的回調(diào)
let observer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
AudioServicesAddSystemSoundCompletion(soundID, nil, nil, {
(soundID, inClientData) -> Void in
let mySelf = Unmanaged<ViewController>.fromOpaque(inClientData!)
.takeUnretainedValue()
mySelf.audioServicesPlaySystemSoundCompleted(soundID: soundID)
}, observer)
//播放聲音
AudioServicesPlaySystemSound(soundID)
isPlaying = true
}
}
//音頻結(jié)束時(shí)的回調(diào)
func audioServicesPlaySystemSoundCompleted(soundID: SystemSoundID) {
print("Completion")
isPlaying = false
AudioServicesRemoveSystemSoundCompletion(soundID)
AudioServicesDisposeSystemSoundID(soundID)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
原文出自:www.hangge.com