2

同じビデオを再生するための 2 つの異なるビューがあります。ビデオの実行中に 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]);
                        }
                    });
 }];

2 番目のビューでは、dispatch_get_main_queue からビデオをロードして、両方のビューのビデオが同期するようにします。

最初のビューから 2 番目のビューにビデオのデータをロードする際に、誰かが私を助けてくれることを期待していました。

4

2 に答える 2

1

このアプローチを機能させることができるとは思いません。ビデオはハードウェアでデコードされ、グラフィック バッファがグラフィック カードに送信されます。あなたがしたいことは、ビデオを 1 つのビューでデコードし、最初のビューのコンテンツをキャプチャして、2 番目のビューで表示することです。最初のウィンドウのコンテンツをキャプチャしてメイン メモリに戻すのに時間がかかり、それらのコンテンツをビデオ カードに再度送信する必要があるため、同期は維持されません。基本的に、それはうまくいきません。また、2 つの h.264 ビデオ ストリームをデコードして、それらが同期していると期待することもできません。

これを完全に別のアプローチで実装できます。h.264 ビデオをディスク上のフレームにデコードし (各フレームを PNG として保存)、一連の PNG の N 番目の PNG をデコードし、結果を 2 つの異なるウィンドウに表示する独自のループを作成する場合。これは、新しい iPhone 4 と 5、および iPad 2 と 3 で効果的な実装になるのに十分な速さで動作します。より高度な実装を利用したい場合は、iOS 用の私の AVAnimator ライブラリを見てください。このアプローチが機能する可能性があります。既存のコードを使用する場合は 20 分で。

于 2013-06-16T21:58:54.223 に答える