有时候我们需要在Swift中,播放声音,有可能是系统的声音,有可能是自定义的声音。这里需要借助AVFoundation的AVAudioPlayer。
- 下面是Sample的代码。
import Foundation import MapKit import MediaPlayer import AVFoundation import UIKit import AudioToolbox class AudioPlayer: NSObject, AVAudioPlayerDelegate { // 单例模式 static let instance = AudioPlayer() var isSoundPlaying = false static var audioPlayer: AVAudioPlayer = { return AVAudioPlayer() }() // ※播放自定义的声音,需要把声音文件拷贝到工程目录中,并且指定这个目录和声音文件的名字。 func play(songTitle: String) { let songTitle = songTitle let path = Bundle.main.path(forResource: songTitle, ofType: nil, inDirectory: "Music")! let url = URL(fileURLWithPath: path) do { try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback) AudioPlayer.audioPlayer = try AVAudioPlayer(contentsOf: url) // ※AVAudioPlayerDelegate代理 AudioPlayer.audioPlayer.delegate = self AudioPlayer.audioPlayer.play() } catch { } } // ※播放系统的声音 需要知道系统声音的ID 可以去网站查询。 // ※https://iphonedev.wiki/index.php/AudioServices func play(id: UInt32) { AudioServicesPlaySystemSound(id) } func stop() { AudioPlayer.audioPlayer.stop() } func pause() { AudioPlayer.audioPlayer.pause() } func resume() { AudioPlayer.audioPlayer.play() } func currentTime() -> Int { return Int(AudioPlayer.audioPlayer.currentTime) } // ※当音频文件播放完成时,会触发这个方法。 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { AudioPlayer.audioPlayer.stop() NotificationCenter.default.post(name: .needToStop, object: nil, userInfo: nil) } }
- 自定义的声音文件需要拷贝到工程里面
- 播放系统声音需要用id,可以从网站(https://iphonedev.wiki/index.php/AudioServices)查询声音文件的id。
- 可以从网站(https://www.zedge.net/find/synth )下载各种声音文件。