(2019/02/16 更新 Xcode 10.1 + Swift 4.2)
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog
では、ミュージックライブラリから取り出したアイテムを使ってAVAudioPlayerをinitializeする方法を紹介しました。
MPMediaItemからアイテムのassetURLを取得して、そのNSURLからAVAudioPlayerを作りました。
今回は、リソースファイルからAVAudioPlayerを作成する方法を紹介します。
サンプルの概要
今回使用するサンプルプログラムでは
* プロジェクトに加えておいた2種類のオーディオファイルから選択
* 選んだファイル名を表示
* 選んだファイルの再生、停止、一時停止
を行います。
ViewController.swift全文は記事の末尾にあります。
iOSシミュレータでは動作しないので、実機を用いてください。
AVAudioPlayerを使って、リソースファイルを再生する
Single View Applicationでプロジェクトを作成。
リソースファイルをプロジェクトに加える
File > Add Files To “<プロジェクト名>” から、オーディオファイルをプロジェクトに加えます。
今回は2種類使いますので、二つのオーディオファイルを加えてください。
名前は、”sound01.mp3″、”sound02.mp3″としてください。
UI部品レイアウト
ボタンとラベルを配置。
ラベルとViewController.swiftをOutletを作成して接続。
ボタンとViewController.swiftをActionを作成して接続。
必要なフレームワークをimport
ViewController.SwiftにAVFoundationフレームワークをimportします。
import UIKit import AVFoundation class ViewController: UIViewController {
プレイヤーをpropertyとして加える
プレイヤーを表すpropertyをViewController.swiftに加えます。
class ViewController: UIViewController { var audioPlayer:AVAudioPlayer? override func viewDidLoad() {
AVAuioPlayerは、play()やpause()などメソッドを実行する際に、urlを指定してinitializeしていないとエラーになります。
そこで、今回はAVAudioPlayer?型として宣言して初期値をnilとしています。
そしてaudioPlayerがnilの場合は、play()やpause()などを実行しないようにしています。
リソースファイルがしめすNSURLからプレイヤーを作成
「Sound01」「Sound02」ボタンを押した時の処理
「Sound01」を押したときは”sound01.mp3″で、「Sound02」ボタンを押したときは”sound02.mp3″をセットしてプレイヤーをinitializeします。
// 「Sound01」ボタンが押されたら、プレイヤーに"sound01.mp3"をセットしてinitializeする @IBAction func btn01Tapped(sender: AnyObject) { // リソースファイル("sound01.mp3")をオーディオプレイヤーにセットしてinitializeする let fileName: String? = "sound01" let fileType:String? = "mp3" if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) { do { audioPlayer = try AVAudioPlayer(contentsOf: url) // ラベル表示 messageLabel.text = fileName } catch { // プレイヤー作成失敗 // その場合は、プレイヤーをnilとする audioPlayer = nil } } else { // urlがnilなので再生できない fatalError("Url is nil.") } } // 「Sound02」ボタンが押されたら、プレイヤーに"sound02.mp3"をセットしてinitializeする @IBAction func btn02Tapped(sender: AnyObject) { // リソースファイル("sound02.mp3")をオーディオプレイヤーにセットしてinitializeする let fileName: String? = "sound02" let fileType:String? = "mp3" if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) { do { audioPlayer = try AVAudioPlayer(contentsOf: url) // ラベル表示 messageLabel.text = fileName } catch { // プレイヤー作成失敗 // その場合は、プレイヤーをnilとする audioPlayer = nil } } else { // urlがnilなので再生できない fatalError("Url is nil.") } }
このサンプルコードでは、プレイヤーの作成が失敗した場合は、プレイヤーをnilとしています。
与えられたリソースファイルが、オーディオファイルじゃなくて画像ファイルだった、なんて場合にはプレイヤー作成が失敗します。
また、ファイル名が間違っていた場合は、URLが取得できないということで、エラーになります。
「再生」「一時停止」「停止」ボタンを押した時の処理
@IBAction func pushPlay(sender: AnyObject) { // 再生 if let player = audioPlayer { player.play() } } @IBAction func pushPause(sender: AnyObject) { // 一時停止 if let player = audioPlayer { player.pause() } } @IBAction func pushStop(sender: AnyObject) { // 停止 if let player = audioPlayer { player.stop() } }
「再生」「一時停止」「停止」ボタンで再生をコントロールできます。
ViewController.swift全文
import UIKit import AVFoundation class ViewController: UIViewController { var audioPlayer:AVAudioPlayer? @IBOutlet weak var messageLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // 「Sound01」ボタンが押されたら、プレイヤーに"sound01.mp3"をセットしてinitializeする @IBAction func btn01Tapped(sender: AnyObject) { // リソースファイル("sound01.mp3")をオーディオプレイヤーにセットしてinitializeする let fileName: String? = "sound01" let fileType:String? = "mp3" if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) { do { audioPlayer = try AVAudioPlayer(contentsOf: url) // ラベル表示 messageLabel.text = fileName } catch { // プレイヤー作成失敗 // その場合は、プレイヤーをnilとする audioPlayer = nil } } else { // urlがnilなので再生できない fatalError("Url is nil.") } } // 「Sound02」ボタンが押されたら、プレイヤーに"sound02.mp3"をセットしてinitializeする @IBAction func btn02Tapped(sender: AnyObject) { // リソースファイル("sound02.mp3")をオーディオプレイヤーにセットしてinitializeする let fileName: String? = "sound02" let fileType:String? = "mp3" if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) { do { audioPlayer = try AVAudioPlayer(contentsOf: url) // ラベル表示 messageLabel.text = fileName } catch { // プレイヤー作成失敗 // その場合は、プレイヤーをnilとする audioPlayer = nil } } else { // urlがnilなので再生できない fatalError("Url is nil.") } } @IBAction func pushPlay(sender: AnyObject) { // 再生 if let player = audioPlayer { player.play() } } @IBAction func pushPause(sender: AnyObject) { // 一時停止 if let player = audioPlayer { player.pause() } } @IBAction func pushStop(sender: AnyObject) { // 停止 if let player = audioPlayer { player.stop() } } }
関連
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
[iOS][Swift]MPMediaQueryを使って曲を絞り込む | nackpan Blog
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(再生速度の変更、複数のプレイヤー) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(複数の曲をあつかう) | nackpan Blog