Loading
BLOG 開発者ブログ

2024年12月6日

【Apple Vision Pro】簡単なオーディオ再生UIの構築

はじめに

こんにちは。
モバイルソリューショングループのyoshino.kです。

この記事は アイソルート Advent Calendar 2024 6日目の記事です。

この記事では、visionOSで簡単なオーディオ再生機能を実現する方法を解説します。
2つのボタンを備えたシンプルなUIを構築し、オーディオファイルの再生・停止ができるコードを実装します。

目次

  1. 必要な準備
  2. オーディオ再生・停止の設定
  3. オーディオ操作用のUI構築
  4. さいごに

必要な準備

プロジェクトの作成

Xcodeで新しいvisionOSプロジェクトを作成します。テンプレートとして visionOS App を選択してください。

オーディオファイルの準備

使用するオーディオファイル(ここでは audio_sample.mp3 )を用意しプロジェクトに追加してください。
プロジェクトの配下に、Resourcesディレクトリを作成しオーディオファイルを配置します。
配置した後、ResourcesディレクトリをXcodeへドラッグ&ドロップします。
「Copy items if needed」にチェックを入れ、ターゲットに正しく追加されていることを確認してください。

オーディオ再生・停止の設定

オーディオの読み込みおよび再生・停止機能を実装します。
オーディオファイル名は “audio_sample” として実装していますので、ファイル名に合わせて変更してください。
setupAudioメソッドに引数を追加して、オーディオを指定可能にすることもできます。


import AVFoundation
import SwiftUI

class AudioManager: ObservableObject {
    private var audioEngine = AVAudioEngine()
    private var playerNode = AVAudioPlayerNode()

    private var audioFile: AVAudioFile?

    func setupAudio() {
        guard let audioFileURL = Bundle.main.url(forResource: "audio_sample", withExtension: "mp3") else {
            print("Audio file not found!")
            return
        }

        do {
            audioFile = try AVAudioFile(forReading: audioFileURL)

            audioEngine.attach(playerNode)
            audioEngine.connect(playerNode, to: audioEngine.outputNode, format: audioFile?.processingFormat)

            try audioEngine.start()
        } catch {
            print("Error during audio setup: \(error.localizedDescription)")
        }
    }

    func playAudio() {
        guard let audioFile = audioFile else { return }

        if !playerNode.isPlaying {
            playerNode.scheduleFile(audioFile, at: nil, completionHandler: nil)
            playerNode.play()
            print("Audio is playing.")
        }
    }

    func stopAudio() {
        if playerNode.isPlaying {
            playerNode.stop()
            print("Audio stopped.")
        }
    }
}

オーディオ操作用のUI構築

ここではオーディオ操作用のUIを作成します。
UIは、ビューの上に2つのボタンを配置した簡単なものになります。
・再生ボタン:タップ時に指定されたオーディオファイルを再生する
・停止ボタン:タップ時に再生中のオーディオファイルを停止する


import SwiftUI
import RealityKit
import RealityKitContent

struct ContentView: View {
    @StateObject private var audioManager = AudioManager()

    var body: some View {
        VStack {
            Button("再生") {
                audioManager.playAudio()
            }
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)

            Button("停止") {
                audioManager.stopAudio()
            }
            .padding()
            .background(Color.red)
            .foregroundColor(.white)
            .cornerRadius(10)
        }
        .onAppear {
            audioManager.setupAudio()
        }
    }
}

メインクラスでContentViewを呼び出し、作成したUIを表示します。


import SwiftUI

@main
struct AudioApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

これでオーディオの再生・停止が可能なアプリを実現できます。
visionOSでも特に難しい点はなく実装できました!

さいごに

今回は、visionOSでのオーディオ再生機能のチュートリアルとして記事を作成しました。
基礎的な機能ですが仕組みを拡張することで、さらに魅力的なオーディオ体験を提供できると考えています。
オーディオの発信源を3Dオブジェクトに設定することで、よりリアルな3Dライブやリモート飲み会を表現することもできそうです!

今後も面白い活用法を模索して、Apple Vision Proの可能性を引き出していきたいと思います!

明日は shimizu.sho さんの 【生成AI】Claude.aiのArtifactsを触ってみました です。お楽しみに!

yoshinokのブログ