2013-06-16 5 views
0

동일한 비디오를 재생하기위한 두 가지 다른보기가 있습니다. 비디오가 실행되는 동안 두 개의보기간에 여러 번 전환하는 응용 프로그램을 만들고 있습니다.하나의 비디오로 두 개의 AVPlayers로드하기

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

제 대답을 올바른 것으로 검토하십시오. 감사합니다. – Nikita

답변

0

나는이 접근 방식을 사용할 수 없을 것이라고 생각합니다. 비디오는 하드웨어로 디코딩 된 다음 그래픽 버퍼로 보내집니다. 당신이하고 싶은 것 한 장면에서 비디오를 디코딩 한 다음 첫 번째보기의 내용을 캡처하여 두 번째보기에 표시하는 것입니다. 첫 번째 창의 내용을 메인 메모리에 다시 캡처하는 데 시간이 걸리고 그 내용을 비디오 카드로 다시 보내야하기 때문에 동기화되지 않습니다. 기본적으로, 그것은 작동하지 않을 것입니다. 또한 두 개의 h.264 비디오 스트림을 디코드 할 수 없으며 비디오 스트림을 동기화 할 수 없습니다.

다른 방법으로 완전히 구현할 수 있습니다. 디스크상의 프레임으로 h.264 비디오를 디코딩 한 다음 (각 프레임을 PNG로 저장) 일련의 PNG에서 N 번째 PNG를 디코딩 한 다음 두 개의 다른 창에 결과를 표시하는 자체 루프를 작성합니다. 새로운 iPhone 4 및 5와 iPad 2 및 3에서 효과적으로 구현 될 수있을만큼 빠르게 작동합니다. 고급 구현을 사용하려는 경우 iOS 용 AVAnimator 라이브러리를 살펴보고이 접근 방식을 사용할 수 있습니다 기존 코드를 사용하는 경우 20 분 안에 첫 번째에서 같은 자산을 사용

AVAsset *asset = [AVAsset assetWithURL:URL]; 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 

과 같은 방법으로 두 번째 플레이어 :하지만, 첫번째 선수 초기화

:

+0

제안에 감사드립니다! 이 라이브러리는 원격 비디오 파일에서도 작동합니까? –

+0

스트리밍 비디오에 대해 이야기하고 있다고 가정하고 스트리밍은 지원되지 않습니다 (네트워크 스트리밍은 완전히 다른 짐승입니다). 그러나 h.264 비디오가 원격 서버의 일반 파일에있는 경우에는 다운로드 한 다음 다운로드가 완료되면 열 수 있습니다. 디스크의 h.264 비디오 파일을 읽고 압축되지 않은 RGB 픽셀을 포함하는 파일의 내용을 압축 해제하는 논리에 대해서는 AVAssetReaderConvertMaxvid 클래스를 참조하십시오. 예제 프로젝트 AVDecodeEncode는 압축을 풀고 다시 압축하는 데 필요한 코드를 표시하지만 압축 해제 부분 만 사용하려고합니다. – MoDJ

+0

도서관에서 먼저 좋은 직장! iOS에서 동영상을 처리하는 데 좋은 구현. 불행히도 비디오 스트리밍을 처리 할 솔루션이 필요합니다. –

관련 문제