我正试图在iOS 7.1上使用Sprite Kit和SKVideoNode显示视频。苹果公司的文档使这看起来非常直接。一个例子取自《精灵套件编程指南》:
SKVideoNode *sample = [SKVideoNode videoNodeWithVideoFileNamed:@"sample.m4v"];
sample.position = CGPointMake(CGRectGetMidX(self.frame),
[self addChild: sample];
[sample play];
我正在尝试相同的代码,但没有看到视频。SKVideoNode确实在节点层次结构中。我也试过多个视频,都是H.264 AAC。
我在这里找到了一个有类似问题的人。他们似乎通过实例化一个AVPlayer来解决这个问题。这也不会为我显示视频。想法?
首先有两件事:
- 你必须将Foundation.framework添加到你的项目中
- 请确保已将视频文件添加到项目中
- 确保您的视频文件是以下格式之一:.mov.mp4v.3gp.3gpp
试试我下面的示例代码:
#import "MyScene.h"
#import <AVFoundation/AVFoundation.h>
@implementation MyScene
{
AVPlayer *_player;
SKVideoNode *_videoNode;
}
-(id)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
[self setupMovie];
}
return self;
}
-(void)setupMovie
{
NSURL *fileURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"loop" ofType:@"mov"]];
_player = [AVPlayer playerWithURL: fileURL];
_videoNode = [[SKVideoNode alloc] initWithAVPlayer:_player];
_videoNode.size = CGSizeMake(200, 100);
_videoNode.position = CGPointMake(150, 150);
[self addChild:_videoNode];
_player.volume = 1.0;
[_videoNode play];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//
}
-(void)update:(CFTimeInterval)currentTime
{
//
}
@end
我刚刚通过使用Prism MPEG4视频编码器转换视频文件的格式解决了这个问题。希望能有所帮助。
我知道这个问题大约在20个月前就被问到了,但我认为我也应该分享我的经验(这可能对正在开发SKVideoNode
并面临相同问题的程序员有帮助,也有与我相同的案例,如下所述),与SKVideoNode
、视频视图显示相关的问题有关。
我最近在探索Sprite Kit
,在那里我找到了SKVideoNode
来在SKScene
上播放视频文件。我创建了一个继承自SKScene
的GameScene
,并在场景skview
([self.scene.view addSubview:aView]
)上添加了一个UIImageView
的实例作为backgroundImage
,接下来我创建了SKVideNode's
实例以及分别添加到scene.view
和scene
的其他UIKit
子视图和SKNode
子视图。
我为SKVideNode's
配置了代码,正如它的类引用文档中提到的那样,我构建并运行应用程序以观看视频播放。但除了视频,屏幕上出现的所有内容,当我增加设备的音量时,我能够听到视频文件的声音(音频)。
由于我能够听到音频,所以我认为我错过了一些配置或它们是一些问题,因为视频视图不可见。
我尝试了一些排列和组合来使用AVPlayer
,不同的文件格式,但仍然相同的行为。之后,我开始挖掘视图layering
和z index
的概念,看看视频是否不在背景图像或任何其他视图后面,仍然相同的行为。
最后,我从屏幕上删除了所有child
和subviews
(包括背景图像),并尝试只播放视频,这一次视频视图在屏幕上可见。
简而言之,我对上述行为的结论是,"如果使用Sprite Kit's
SKVideoNode
想要播放视频,那么我们应该在SKScene
实例中播放,而不是在任何UIKit
视图上播放,因为如果我们试图将SKVideoNode
的实例添加到已经存在UIKit
视图的位置,则该实例是不可见的"
就SpriteKit
而言,它在一个场景中有SKView
和SKScene
,这允许程序员在游戏中同时使用SpriteKit
和UIKit
元素,但这些类型的问题可能会导致在选择我们想要使用的视觉元素类型时出现妥协。
您应该将视频文件添加到捆绑包中并通过捆绑包加载,或者停用沙盒。