Ios SKVideoNode中的视频在Xcode模拟器中运行良好,在大多数设备上无法播放
我正在为Swift和Sprite工具包xCode 6.4开发一个应用程序,目前正在为iOS 8.4开发。我正在使用SKVideoNode和AVPlayer来播放全屏视频。守则如下:Ios SKVideoNode中的视频在Xcode模拟器中运行良好,在大多数设备上无法播放,ios,swift,sprite-kit,avfoundation,xcode6.4,Ios,Swift,Sprite Kit,Avfoundation,Xcode6.4,我正在为Swift和Sprite工具包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.assetWithUR
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中;我已经在文件的顶部导入了基础、AvFunt和SpReTeKIT。
这在模拟器中运行良好;如果我为我的iPad构建并运行什么都没发生,它会显示一个黑屏,或者如果我移除时间观察者,这样背景就不会被隐藏,我只看到了背景,背景是电影的第一帧,在视频播放开始时,我遇到了一个黑色的闪光,我使用时间观察者作为掩蔽技术来隐藏它。我的一个用户报告说,在他升级到iOS9之前,它一直对他有效。另一个用户报告说,他听到了与.mov文件一起的音频,但没有看到视频本身,这更令人担忧。所以我得到了各种各样的非工作行为,这是最好的bug。我所说的最好是指最坏
我尝试过的事情:
各种版本和组合的直接链接在基础,AVFLAST,SRIPITEKIT建设时。
使用AVPlayerLayer而不是SpriteKit对我来说没有行为上的改变,没有部署,所以我不知道它是否对我的测试人员有帮助。
移除时间观察者完全没有改变。
搜索互联网没有帮助。
把我的头发扯下来,哎哟。
所有这些都是无效的。现在我秃顶了。悲哀。回答我自己的问题:经过多次尝试和错误,似乎无法在iOS9中缩放SKVideoNode,或者可能从未支持过?文件不清楚。不管我做什么,xCode 7的模拟器都不会播放视频,这也是事实,这对事情没有帮助。在任何情况下,您都可以更改节点的size属性,然后让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!)
在ObjC中,我遇到了一个类似的问题,这是因为玩家在开始游戏之前就被释放了。你可以试着让你的玩家成为一个类变量,看看这是否有帮助。我认为这在swift中不是一个问题,但可能不是。我应该补充一点,如果你对x和y的缩放量相同,这并不重要。也就是说,我并没有试图使视频的纵横比与本机视频的纵横比不同,或者通过setScale方法进行设置。在iOS9中似乎没有缩放SKVideoNode的方法可以工作。同样,这可能是有目的的或已知的,但我在文档中找不到任何引用。