2

我有两个不同的视图用于播放相同的视频,我正在创建一个应用程序,该应用程序将在视频运行时在两个视图之间切换多次。

我目前使用视频加载第一个视图,如下所示:

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 加载视频,以便两个视图中的视频同步。

我希望有人可以帮助我将视频数据从第一个视图加载到第二个视图中。

4

2 回答 2

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

这种抽象意味着您可以同时使用不同的播放器播放给定的资产

此报价来自此页面。

于 2014-11-10T13:33:32.417 回答
1

我认为您无法使用这种方法。视频在硬件中解码,然后将图形缓冲区发送到图形卡。您似乎想要做的是在一个视图中解码视频,然后捕获第一个视图的内容并在第二个视图中显示它。这不会保持同步,因为将第一个窗口的内容捕获回主内存需要时间,然后这些内容需要再次发送到视频卡。基本上,这是行不通的。您也无法解码两个 h.264 视频流并期望它们同步。

您可以完全用另一种方法来实现这一点。如果您将 h.264 视频解码为磁盘上的帧(将每个帧保存为 PNG),然后编写自己的循环,该循环将解码一系列 PNG 中的第 N 个 PNG,然后在两个不同的窗口中显示结果。这将运行得足够快,可以在较新的 iPhone 4 和 5 以及 iPad 2 和 3 上有效实现。如果您想使用更高级的实现,请查看我的 iOS AVAnimator 库,您可以使用这种方法如果您使用现有代码,则在 20 分钟内。

于 2013-06-16T21:58:54.223 回答