2017年9月16日土曜日

SpriteKit で AVPlayer + SKVideoNode を使って動画を再生してみた

概要

SpriteKit で動画を再生した場合はあると思います
SKVideoNode という SpriteKit で動画を再生するためのノードがありこれと AVFoundation の AVPlayer というモジュールを使うと動画を再生することができます

環境

  • macOS X 10.12.6
  • Xcode 8.3.3 (8E3004b)

再生する動画のダウンロード

今回はこれを利用します
ダウンロードしたら Targets -> Build Phases -> Copy Bundle Resources にダウンロードしたファイルを追加します
spritekit_with_avplayer1.png

Swift ファイルの編集

.sks ファイルの編集は省略します
動画をスタートする用のボタンと停止する用のボタンを配置しているだけです

import SpriteKit
import AVFoundation

class VideoScene: SKScene {

    var play = SKSpriteNode()
    var pause = SKSpriteNode()
    var video = SKVideoNode()

    override func didMove(to view: SKView) {
        play = self.childNode(withName: "play") as! SKSpriteNode
        pause = self.childNode(withName: "pause") as! SKSpriteNode
        video = {
            let urlString = Bundle.main.path(forResource: "mp4_h264_aac", ofType: "mp4")
            let url = URL(fileURLWithPath: urlString!)
            let item = AVPlayerItem(url: url)
            let player = AVPlayer(playerItem: item)
            return SKVideoNode(avPlayer: player)
        }()
        self.addChild(video)
    }

    func touchDown(atPoint pos : CGPoint) {
        if let node = atPoint(pos) as? SKSpriteNode {
            if(node == play){
                if let _ = self.view {
                    print("play")
                    video.play()
                }
            } else if(node == pause){
                if let _ = self.view {
                    print("pause")
                    video.pause()
                }
            }

        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for t in touches { self.touchDown(atPoint: t.location(in: self)) }
    }
}

コード中で SKVideoNode を作成しています
あとはノードをタップしたときに playpause を実行しています

動作確認

必ず実機で行うようにしてください
シミューレータだとなぜか動画のノードが表示されませんでした (音はするんですが)
各種ボタンをタップして動画の再生と停止ができれば OK です

動かしてみるとわかりますがループ再生できません
一度最後まで行ったら再度アプリを起動しないと動画が始めに戻りません

これが SKVideoNode を使った場合の最大の弱点です
一応ループしたりシークバーを出したりする方法はあるみたいなので興味があれば調べてみてください

また今回は Web にある音源をダウンロードしてから再生しました
直接 URL を指定して再生できるかやってみたのですがうまくできませんでした
今回の組み合わせだとローカルにダウンロードしてからでないと再生できないのかもしれません

参考サイト

0 件のコメント:

コメントを投稿