我正在为 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 文件附带的音频但看不到视频本身(更多的担心)。所以我得到了各种非工作行为,这是最好的错误。最好的意思是最坏的。
我尝试过的事情:
- 构建时直接链接Foundation、AVFoundation、SpriteKit的各种版本和组合。
- 使用 AVPlayerLayer 而不是 SpriteKit(我的行为没有改变,没有部署,所以我不知道它是否会帮助我的任何测试人员)。
- 完全移除时间观察器(无变化)。
- 搜索互联网(没有帮助)。
- 扯掉我的头发(哎哟)。
一切都无效。现在我秃了。和悲伤。