我有两个不同的视图,用于播放相同的视频,我正在创建一个应用程序,在视频运行时将在两个视图之间切换多次。
我目前使用视频加载第一个视图,如下所示:
NSURL *url = [NSURL URLWithString:@"http://[URL TO VIDEO HERE]"];
AVURLAsset *avasset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:avasset];
player = [[AVPlayer alloc] initWithPlayerItem:item];
playerLayer = [[AVPlayerLayer playerLayerWithPlayer:player] retain];
CGSize size = self.bounds.size;
float x = size.width/2.0-202.0;
float y = size.height/2.0 - 100;
//[player play];
playerLayer.frame = CGRectMake(x, y, 404, 200);
playerLayer.backgroundColor = [UIColor blackColor].CGColor;
[self.layer addSublayer:playerLayer];
NSString *tracksKey = @"tracks";
[avasset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
^{
dispatch_async(dispatch_get_main_queue(),
^{
NSError *error = nil;
AVKeyValueStatus status = [avasset statusOfValueForKey:tracksKey error:&error];
if (status == AVKeyValueStatusLoaded) {
//videoInitialized = YES;
[player play];
}
else {
// You should deal with the error appropriately.
NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]);
}
});
}];
在我的第二个视图中,我想从dispatch_get_main_queue加载视频,以便两个视图中的视频同步。
我希望有人可以帮助我将视频数据从第一个视图加载到第二个视图。
答案 0 :(得分:3)
这很简单:
启动第一个玩家:
AVAsset *asset = [AVAsset assetWithURL:URL];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
第二个玩家以相同的方式,但是,使用第一个玩家的相同资产。 我已经验证,它有效。
Apple页面上有您需要的所有信息: https://developer.apple.com/library/mac/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html
这种抽象意味着您可以使用不同的方式播放给定的资产 球员同时
此引用来自此页面。
答案 1 :(得分:0)
我认为你无法使用这种方法。视频在硬件中解码,然后图形缓冲区被发送到图形卡。您似乎想要做的是在一个视图中解码视频,然后捕获第一个视图的内容并在第二个视图中显示它。这将不会保持同步,因为将第一个窗口的内容捕获回主存储器需要时间,然后需要再次将这些内容发送到视频卡。基本上,这是行不通的。您也无法解码两个h.264视频流,并希望它们保持同步。
您可以完全采用其他方法实现此目的。如果将h.264视频解码为磁盘上的帧(将每个帧保存为PNG),然后编写自己的循环,将在一系列PNG中解码第N个PNG,然后在两个不同的窗口中显示结果。这将足够快地在新的iPhone 4和5以及iPad 2和3上有效实现。如果你想使用更高级的实现,看看我的AVAnimator库的iOS,你可以使这种方法工作如果使用现有代码,则在20分钟内完成。