SKVideoNode中的视频在Xcode模拟器中工作正常,不能在大多数设备上播放

时间:2015-10-09 17:39:39

标签: ios swift sprite-kit avfoundation xcode6.4

我正在为Swift和Sprite Kit开发一个应用程序(xCode 6.4,目前正在为iOS 8.4构建)。我正在使用SKVideoNode和AVPlayer一起播放全屏视频。代码如下:

    let path = NSBundle.mainBundle().pathForResource("SPLASH_x", ofType:"mov")
    let vUrl = NSURL.fileURLWithPath(path!)

    let asset = AVAsset.assetWithURL(vUrl) as? AVAsset
    let playerItem = AVPlayerItem(asset: asset)
    let player = AVPlayer(URL: vUrl)
    SplashVideo = SKVideoNode(AVPlayer: player)
    SplashVideo!.xScale = self.size.width / SplashVideo!.size.width
    SplashVideo!.yScale = self.size.height / SplashVideo!.size.height
    SplashVideo!.position = CGPointMake(self.frame.midX, self.frame.midY)
    self.addChild(SplashVideo!)

    var observer: AnyObject? = nil
    observer = player.addPeriodicTimeObserverForInterval(CMTimeMake(1,30), queue: dispatch_get_main_queue(),
        usingBlock: { (time: CMTime) -> Void in
            let secs:Float64 = CMTimeGetSeconds(time)
            println("I think it's playing")
            if (secs > 0.01) {
                self.hideBackground()
                println("I think I'm done observing. Background hidden!")
                player.removeTimeObserver(observer!)
            }
    })
    println("I think I'm playing the splash video:")
    SplashVideo!.play()

(如果不清楚,这发生在didMoveToView中;我已经在文件顶部导入了Foundation,AVFoundation和SpriteKit。)

这在模拟器中工作正常;如果我为我的iPad构建和运行没有任何事情发生 - 它显示黑屏,或者如果我删除时间观察者(以便背景永远不会被隐藏),我只看到背景(背景是第一帧电影 - 我在视频播放开始时遇到黑色闪光,并使用时间观察器作为掩蔽技术来隐藏它。我的一位用户报告说,在他升级到iOS9(不太关心)之前它一直适用于他,另一位用户报告说他听到了.mov文件的音频,但没有看到视频本身(更多的是一个问题) )。所以我得到了各种非工作行为,这是最好的bug。最好的,我的意思是最糟糕的。

我尝试过的事情:

  1. 建立时在Foundation,AVFoundation,SpriteKit中直接链接的各种版本和组合。
  2. 使用AVPlayerLayer而不是SpriteKit(对我来说没有改变行为,没有部署,所以我不知道它是否会对我的任何测试人员有所帮助。)
  3. 完全删除时间观察者(无变化)。
  4. 搜索互联网(没有帮助)。
  5. 撕掉我的头发(ouch)。
  6. 一切都无效。现在我秃了。而且很伤心。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:经过多次试验和错误后,您似乎无法在iOS9中扩展SKVideoNode(或者可能从未支持过?文档不清楚)。无论我做什么,xCode 7的模拟器都不会播放视频,这也无关紧要。在任何情况下,你可以做的是改变节点的大小属性(我想,让Sprite Kit进行缩放?文档看起来很不稳定),这似乎有效:

let asset = AVAsset.assetWithURL(vUrl) as? AVAsset
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(URL: vUrl)
SplashVideo = SKVideoNode(AVPlayer: player)
SplashVideo!.size = self.size
SplashVideo!.position = CGPointMake(self.frame.midX, self.frame.midY)
self.addChild(SplashVideo!)