KOSEN{BLOG}について

AVAudioPlayerNodeを使って音楽を再生

実装コード

AVAudioEngineを使う上で必要なモジュールをインポート

import AVFoundation

AVAudioEngineを使用するためにインポート

プロパティーを定義

let audioEngine = AVAudioEngine()
//今回の主役音楽再生するためのクラス
let player = AVAudioPlayerNode()
    
var audioFile: AVAudioFile?

今回の主役はAVAudioPlayerNode

音楽ファイルやバッファーの音を再生することができる。

AVAudioFileに音楽再生用のURLをセットする

private func setURL() {
      if let url = Bundle.main.url(forResource: "sword-slash2", withExtension: "mp3") {
          do {
              audioFile = try AVAudioFile(forReading: url)
          } catch {
             fatalError("can't exchange audioFile")
          }
      }else {
          fatalError("not exist URL")
      }   
  }


再生したい音源をプロジェクトに追加。
Bundle.main.urlでプロジェクト内のファイルにアクセス。
オプショナルバインディングで、音源が必ず存在していることを確認して、audioFileに代入

エンジンとプレイヤーノードをつなげる

private func connectEngine() {
      
      do {
          // エンジンにノードをアタッチ
          audioEngine.attach(player)

          // Playerノードとメインミキサーを接続
          audioEngine.connect(player,
                              to: audioEngine.mainMixerNode,
                              format: audioFile!.processingFormat)
          try audioEngine.start()
          audioEngine.prepare()
      } catch {
          print(error)
      }
      
  }

ノードをアタッチしてEngineをスタート

ノードをつなげる先はto: audioEngine.outputNodeでも再生は可能であるが、Mixerでエフェクトをかけたりする可能性があるため普通はMixerに繋ぐ。

複数の音声を一度に再生したい場合は、mainMixerNode(もしくはoutputNode)に新しくつなぐ。

audioEngine.connect(player2, to: audioEngine.mainMixerNode, format: audioFile2!.processingFormat)

音楽再生

StoryBoardにボタンを追加して@IBActionをつなげる。

@IBAction func didButtonTapped(_ sender: Any) {
        if player.isPlaying {
            player.pause()
            
            button.setTitle("PLAY", for: .normal)
            
        }else {
            
            player.stop()
            // プレイヤのスケジュール
            player.scheduleFile(audioFile!, at: nil, completionCallbackType: .dataPlayedBack) { (callback) in
                print(self.player.isPlaying)
            }
            
            player.play()
            
            button.setTitle("PAUSE", for: .normal)
        }
        
    }

playerに再生するファイルをセットする。

セットする方法はいくつか存在,

  • scheduleFile(_:at:completionHandler:)
  • scheduleBuffer(_ :atTime:options:completionHandler:)
  • scheduleSegment(_ :startingFrame:frameCount:atTime:completionHandler:)

今回はscheduleFileメソッドを使用

コードの全体像

最後に

AVAudioEngineのAVAudioPlayerNodeを使って音楽再生を行うことができました。

AVAudioEngineを用いれば音声の扱いの幅を広げることができるので今後もAVAudioEngineを使って開発を行いたいと思います。

コメントを残す

メールアドレスが公開されることはありません。