Swift 聲音播放與錄製
Contents
播放系統音效
超簡單只需要兩行
import AudioToolbox
AudioServicesPlaySystemSound(1000)
播放自己放在app的音樂
先把自己的音效拖進Xcode,記得選擇”copy items if needed”,否則只會放入reference。
可以開一個新的Group(資料夾圖示)來專門放置音檔。
步驟
- 找到檔案在哪(用Bundle)
- 產生URL
- 產生AVAudioPlayer
// AVAudioPlayer初始化
func myPlayerInit()->AVAudioPlayer?{
guard let path = Bundle.main.path(forResource: "Right", ofType:"mp3") else{
return nil
}
let audioURL = URL(fileURLWithPath: path)
do{
return try AVAudioPlayer(contentsOf: audioURL)
}
catch{
print("AVAudio Player Init failed")
return nil
}
}
// 利用button播放 每次按下都將聲音時間歸零
let myPlayer = myPlayerInit()
myPlayer?.play()
其他好用的方法
myPlayer?.stop() // 停止
myPlayer?.currentTime = 0 // 把音檔時間歸零
myPlayer?.numberOfLoops = 2 // 重複播放次數,若為負數則為無限次播放
myPlayer?.volume = 0.5 // 調整音量
// 把播放速度調慢或調快
myPlayer?.enableRate = true
myPlayer?.rate = 0.5
播放手機內部的音樂
利用MPMediaPickerController,此一Controller會讓你選擇音樂。我們只需要指定選完音樂(或沒選到)要做什麼動作即可。
步驟
- 在Xcode調整權限
- 在info.plist裡面新增 “Privacy - Media Library Ussage Description”
- 在右方新增你的理由
- 新增MPMediaPickerController
- 實作MPMediaPickerController之delegate (MPMediaPickerControllerDelegate)
- 取消不動作
- 選取到音樂則播放
- 指定2實作的delegate給1
權限設定
MPMediaPickerControllerDelegate的實作
// 取消不動作直接消除視窗
func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
dismiss(animated: true, completion: nil)
}
// 選取到音樂則播放
func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
let musicPlayer = MPMusicPlayerController.applicationMusicPlayer()
musicPlayer.setQueue(with:mediaItemCollection)
musicPlayer.play()
dismiss(animated:true, completion: nil)
}
若要停止MPmusicPlayerController一樣可以使用.stop函數
錄音
- 在info.plist增加麥克風權限
- 選好放置路徑並產生URL
- 設定錄音數據(dict)
- 產生AVAudioRecorder實體
- 指定AVAudioRecorder的delegate
- 指定錄完音後執行的動作
- 開始錄音
權限設定
步驟2 3 4 5
func audioRecorderInit()->AVAudioRecorder?{
// 步驟2 設定路徑
let path = NSHomeDirectory() + "/Documents/user.wav"
let url = URL(fileURLWithPath: path)
// 步驟3 設定錄音數據(dict)
let recordSettings:[String:Any] = [
AVEncoderAudioQualityKey : AVAudioQuality.min.rawValue,
AVEncoderBitRateKey: 16,
AVNumberOfChannelsKey: 2,
AVSampleRateKey: 44100.0
]
do {
// 步驟4 5 產生實體並指定delegate
let audioRecorder = try AVAudioRecorder(url: url, settings:recordSettings)
audioRecorder.delegate = self
return audioRecorder
}
catch{
print("something is worng")
return nil
}
}
AVAudioRecorderDelegate的實作
參數recorder的屬性url可以拿到錄製好的檔案路徑
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
if flag == true{
do {
try audioPlayer = AVAudioPlayer(contentsOf: recorder.url)
}
catch{
print("something is Wrong...")
}
}
}
開始錄音
將AVAudioSession調成AVAudioSessionCatetoryPlayAndRecord,可有效增大錄音音量。若不調整則會很小聲。
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
}
catch{
print("can't set audio session")
}
audioRecorder?.prepareToRecord()
audioRecorder?.record()
停止錄音
記得把剛剛的AVAudioSession.sharedInstance()調回原樣
self.audioRecorder?.stop()
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(false)
}
catch{
print("can't set audio session")
}