播放系統音效

超簡單只需要兩行

1
2
import AudioToolbox
AudioServicesPlaySystemSound(1000)

播放自己放在app的音樂

先把自己的音效拖進Xcode,記得選擇”copy items if needed”,否則只會放入reference。
可以開一個新的Group(資料夾圖示)來專門放置音檔。

步驟

  1. 找到檔案在哪(用Bundle)
  2. 產生URL
  3. 產生AVAudioPlayer
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 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
  }
}
1
2
3
// 利用button播放 每次按下都將聲音時間歸零
let myPlayer = myPlayerInit()
myPlayer?.play()

其他好用的方法

1
2
3
4
5
6
7
8
myPlayer?.stop() // 停止
myPlayer?.currentTime = 0 // 把音檔時間歸零
myPlayer?.numberOfLoops = 2 // 重複播放次數,若為負數則為無限次播放
myPlayer?.volume = 0.5 // 調整音量

// 把播放速度調慢或調快
myPlayer?.enableRate = true
myPlayer?.rate = 0.5

播放手機內部的音樂

利用MPMediaPickerController,此一Controller會讓你選擇音樂。我們只需要指定選完音樂(或沒選到)要做什麼動作即可。

步驟

  1. 在Xcode調整權限
    • 在info.plist裡面新增 “Privacy - Media Library Ussage Description”
    • 在右方新增你的理由
  2. 新增MPMediaPickerController
  3. 實作MPMediaPickerController之delegate (MPMediaPickerControllerDelegate)
    • 取消不動作
    • 選取到音樂則播放
  4. 指定2實作的delegate給1

權限設定

存取影音檔案權限

MPMediaPickerControllerDelegate的實作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 取消不動作直接消除視窗
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函數

錄音

  1. 在info.plist增加麥克風權限
  2. 選好放置路徑並產生URL
  3. 設定錄音數據(dict)
  4. 產生AVAudioRecorder實體
  5. 指定AVAudioRecorder的delegate
    • 指定錄完音後執行的動作
  6. 開始錄音

權限設定

麥克風權限

步驟2 3 4 5

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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可以拿到錄製好的檔案路徑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
  if flag == true{
    do {
    	try audioPlayer = AVAudioPlayer(contentsOf: recorder.url)
  	}
    catch{
    	print("something is Wrong...")
    }
  }
}

開始錄音

將AVAudioSession調成AVAudioSessionCatetoryPlayAndRecord,可有效增大錄音音量。若不調整則會很小聲。

1
2
3
4
5
6
7
8
do {
	try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
}
catch{
	print("can't set audio session")
}
audioRecorder?.prepareToRecord()
audioRecorder?.record()

停止錄音

記得把剛剛的AVAudioSession.sharedInstance()調回原樣

1
2
3
4
5
6
7
8
self.audioRecorder?.stop()
do{
	try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
	try AVAudioSession.sharedInstance().setActive(false)
}
catch{
	print("can't set audio session")
}