Swift - 系統(tǒng)聲音服務(wù)的使用(播放聲音,提醒,震動(dòng))

1、系統(tǒng)聲音服務(wù)介紹:
系統(tǒng)聲音服務(wù)提供了一個(gè) Api,用于播放不超過(guò) 30 秒的聲音。它支持的文件格式有限,具體的說(shuō)只 CAF、AIF 和使用 PCM 或 IMA/ADPCM 數(shù)據(jù)的 WAV 文件。
但此函數(shù)沒(méi)有提供操作聲音和控制音量的功能,因此如果是要為多媒體或游戲創(chuàng)建專(zhuān)門(mén)聲音,就不要使用系統(tǒng)聲音服務(wù)。
2、系統(tǒng)聲音服務(wù)支持如下三種類(lèi)型:
(1)聲音:立刻播放一個(gè)簡(jiǎn)單的聲音文件。如果手機(jī)靜音,則用戶什么也聽(tīng)不見(jiàn)。
(2)提醒:播放一個(gè)聲音文件,如果手機(jī)設(shè)為靜音或震動(dòng),則通過(guò)震動(dòng)提醒用戶。
(3)震動(dòng):震動(dòng)手機(jī),而不考慮其他設(shè)置。
3、使用樣例(首先類(lèi)中要引入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)。在開(kāi)始播放、播放完畢中修改這個(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容