🎥

visionOSアプリで動画を再生する

2024/02/10に公開

概要

visionOSアプリで、ウインドウ内での標準動画再生と360度動画再生を試してみました。

プロジェクトの作成

visionOS向けにXcodeを利用して新規プロジェクトを作成します。
xcode01.png

https://developer.apple.com/documentation/swiftui/immersive-spaces

ウインドウ内で動画を再生する

1. プロジェクトに動画ファイルを追加する

プロジェクトにドラック&ドロップで動画ファイルを追加します。
xcode04.png

2. ContentView.swiftを編集する

import SwiftUI
import RealityKit
import RealityKitContent
import AVKit

struct ContentView: View {
    var body: some View {
        VStack {
            RealityView { content in
                // Add the initial RealityKit content
                
                // 動画リソースを指定
                let movieUrl = Bundle.main.url(forResource:"MESON XR Creative Studio Showreel 2018-2023", withExtension: "mp4")!
                
                // VideoPlayerComponentを作成
                let player = AVPlayer(url: movieUrl)
                let videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                
                // Entityを作成して、VideoPlayerComponentをアタッチする
                let entity = Entity()
                entity.components.set(videoPlayerComponent)
                            
                // 動画サイズの調整
                entity.scale *= 0.5
                            
                content.add(entity)
                            
                // 動画を再生
                player.play()
            }
        }
    }
}

#Preview(windowStyle: .volumetric) {
    ContentView()
}

https://developer.apple.com/videos/play/wwdc2023/10081/?time=371

3. ビルドして、シュミレーターで再生を確認する

2dmovie.gif

360度動画を再生する

1. プロジェクトに360度動画ファイルを追加する

お好きな360度動画ファイルをプロジェクトにドラック&ドロップで追加します。
ここでは、「360degree.mp4」というファイルを追加する想定で進めます。

2. ContentView.swiftを編集する

import SwiftUI
import RealityKit
import RealityKitContent

struct ContentView: View {
    @State private var isLoadingImmersiveSpace = true
    @Environment(\.openImmersiveSpace) var openImmersiveSpace

    var body: some View {
        VStack {
            if isLoadingImmersiveSpace {
                Text("Loading immersive space...")
                    .padding()
                    .glassBackgroundEffect()
            }
        }
        .onAppear {
            Task {
                await openImmersiveSpace(id: "ImmersiveSpace")
                isLoadingImmersiveSpace = false
            }
        }
    }
}

#Preview {
    ContentView()
}

3. ImmerssiveView.swiftを編集する

import SwiftUI
import RealityKit
import RealityKitContent
import AVKit

struct ImmersiveView: View {
    private let avPlayer = AVPlayer()
    
    var body: some View {
        RealityView { content in
            // Add the initial RealityKit content
            
            // 動画の設定
            let asset = AVURLAsset(url:Bundle.main.url(forResource:"360degree", withExtension: "mp4")!)
            let playerItem = AVPlayerItem(asset: asset)
            avPlayer.replaceCurrentItem(with: playerItem)
            
            // VideoMaterialの作成
            let material = VideoMaterial(avPlayer: avPlayer)
            
            // 動画表示用Sphereオブジェクトの作成(半径は適当)して、VideoMaterialを設定
            let sphere = ModelEntity(mesh: .generateSphere(radius: 100))
            sphere.model?.materials = [material]
            
            // Sphereオブジェクトを反転
            sphere.scale *= SIMD3(-1, 1, 1)
            
            content.add(sphere)
        }
        .onAppear()
        {
            avPlayer.play()
        }
    }
}

#Preview {
    ImmersiveView()
        .previewLayout(.sizeThatFits)
}

4. ビルドして、シュミレーターで再生を確認してみてください

360度動画が空間全体に表示されていると思います。

書いた人

ボブ

高野 剛

Unixシステムのインフラ構築・運用を経験後、ECサイトを中心としたWebアプリ開発、プロジェクトマネージメントに従事する。
ミニオン好きが高じて、USJに通い続ける中、XRアトラクションに魅了される。
自分が感動したことを他の人にも体験してもらいたいという思いから、転職を決意し、XRの学校での1年間の学びを経てMESONへ入社。

X

MESON Works

MESONの制作実績一覧もあります。ご興味ある方はぜひ見てみてください。

MESON Works

脚注
  1. DisplayMovie は、プロジェクト名となります ↩︎

Discussion