【SwiftUI】AVAudioPlayerで音(サウンド)を鳴らす方法!
この記事からわかること
- SwiftUIでアプリから音?サウンド)を鳴らす方法とは?
- AVAudioPlayerクラスの使い方
- NSDataAssetクラスとは?
- 「The data set "サウンドファイル名.mp3" has an unassigned child.」の解決法
- 「The file "サウンドファイル名.mp3" for the image set "サウンドファイル名" does not exist.」エラーの解決法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
SwiftUIでアプリから音を出す方法
流れ
- オーディオファイル(音)の用意
- XcodeのAssetに追加
- NSDataAssetクラスでデータを指定
- AVAudioPlayerクラスで再生
流れとしては上記の通りです。まずは実装してみます。また今回はAVFoundation
フレームワークのAVAudioPlayer
クラスを使用しますが、Audio Toolbox
フレームワークを使用しても音を鳴らすことが可能です。
おすすめ記事:【Swift】システムサウンドの再生方法!AudioServicesPlaySystemSoundの使い方
オーディオファイル(音)の用意
まずは鳴らしたい音データを用意します。今回は「無料効果音」(無料で効果音を提供しているサイト)の「ゲーム・ボタン音」>「button05.mp3」を使用します。
XcodeのAssetに追加
ダウンロードしたオーディオファイル(mp3)をXcodeのAssetにドラッグ&ドロップで追加します。これで前準備が完了しました。
NSDataAssetクラスでデータを指定
続いてXcode内でコードを記述し再生させていきます。まずはAVFoundation
フレームワークを読み込み、NSDataAsset
クラスで再生したいデータインスタンスを作っておきます。またAVAudioPlayer
インスタンス格納用のプロパティも準備しておきます。
import SwiftUI
import AVFoundation // 追加
let musicData = NSDataAsset(name: "button05")!.data
var musicPlayer:AVAudioPlayer!
struct AudioPlayerView: View {
var body: some View {
}
}
AVAudioPlayerクラスで再生
AVAudioPlayer
クラスに先ほどの音データインスタンスを渡し、play
メソッドを呼び出すことで再生できます。
Button {
do{
musicPlayer = try AVAudioPlayer(data: musicData)
musicPlayer.play()
}catch{
print("音の再生に失敗しました。")
}
} label: {
Text("Play")
}
実際にボタンをクリックして再生されているか確認してみてください。
NSDataAssetクラスとは?
参考文献: 公式リファレンス-NSDataAssetクラス
NSDataAsset
はAssetに保存されているデータを参照するためのクラスです。引数には任意のAsset名を指定することで対象のデータをNSDataAsset
型で取得し、そのdata
プロパティからAVAudioPlayerクラスで必要となるData型
に参照できます。
let musicData = NSDataAsset(name: "button05")!.data
AVAudioPlayerクラス
参考文献: 公式リファレンス-AVAudioPlayerクラス
AVAudioPlayer
はオーディオデータを再生するクラスです。オーディオの再生だけでなく、音量調節やループ制御など様々な機能を提供しています。
イニシャライザにはthrows
が付与されているのでtry
文の記述が必要になります。またdo-catch
文を使用して適切にエラーハンドリングを行っておきます。
init(data: Data) throws
おすすめ記事:【Swift】do-catchとthrows文の使い方!エラーハンドリングのやり方
引数に対象のデータを渡しAVAudioPlayerインスタンスを生成して操作していきます。エラーが発生した場合はnil
が返ります。
do{
musicPlayer = try AVAudioPlayer(data: musicData)
}catch{
print("音の再生に失敗しました。")
}
AVAudioPlayerの操作方法
オーディオの再生や一時停止などと言った操作はメソッドとして用意されています。
// 再生
musicPlayer.play()
// 一時停止
musicPlayer.pause()
// 停止
musicPlayer.stop()
Assetにサウンドファイル追加時に発生したエラー
最初「効果音ラボ」(無料で効果音を提供しているサイト)の音源「決定ボタンを押す2.mp3」をダウンロードしてそのままAssetに追加した際に以下のような2つのエラーが発生してしまいました。
The data set "サウンドファイル名.mp3" has an unassigned child.
翻訳:データセット「サウンドファイル名.mp3」には、割り当てられていない子があります。
The file "サウンドファイル名.mp3" for the image set "サウンドファイル名" does not exist.
翻訳:画像セット「サウンドファイル名」のファイル「サウンドファイル名.mp3」が存在しません。
翻訳してみると追加したファイルが正しく認識されていないようです。
解決法
ファイル名を以下のように変更したところ正しく認識されるようになりました。全角数字も別に使用できるはずなのに原因はよくわかりませんでしたが、ダウンロードしたサウンドファイルは自分の識別しやすい任意の名前に変更しておくと良いのかもしれません。
「決定ボタンを押す2.mp3」
↓
「決定ボタンを押す.mp3」
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。