2013-03-29 4 views
2

OpenGL 응용 프로그램에서 비디오가 무기한 재생됩니다 (비디오가 끝나면 비디오 다시 시작). 이렇게하려면 AV 기반을 활용하려고합니다. AVAssetReader 및 AVAssetReaderTrackOutput을 만들고 copyNextSampleBuffer 메서드를 사용하여 CMSampleBufferRef를 가져 와서 각 프레임에 대한 OpenGL 텍스처를 만듭니다. 비디오 루프 재생을위한 AVFoundation

NSString *path = [[NSBundle mainBundle] pathForResource:videoFileName ofType:type]; 
    _url = [NSURL fileURLWithPath:path]; 

    //Create the AVAsset 
    _asset = [AVURLAsset assetWithURL:_url]; 

    //Get the asset AVAssetTrack 
    NSArray *arrayAssetTrack = [_asset tracksWithMediaType:AVMediaTypeVideo]; 
    _assetTrackVideo = [arrayAssetTrack objectAtIndex:0]; 

    //create the AVAssetReaderTrackOutput 
    NSDictionary *dictCompressionProperty = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id) kCVPixelBufferPixelFormatTypeKey]; 
    _trackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:_assetTrackVideo outputSettings:dictCompressionProperty]; 

    //Create the AVAssetReader 
    NSError *error; 
    _assetReader = [[AVAssetReader alloc] initWithAsset:_asset error:&error]; 
    if(error){ 
     NSLog(@"error in AssetReader %@", error); 
    } 
    [_assetReader addOutput:_trackOutput]; 
    //_assetReader.timeRange = CMTimeRangeMake(kCMTimeZero, _asset.duration); 

    //Asset reading start reading 
    [_assetReader startReading]; 

그리고 내 GLKViewController의 -update 방법

나는 다음과 같은 전화 :

if (_assetReader.status == AVAssetReaderStatusReading){ 
    if (_trackOutput) { 
     CMSampleBufferRef sampleBuffer = [_trackOutput copyNextSampleBuffer]; 
     [self createNewTextureVideoFromOutputSampleBuffer:sampleBuffer]; //create the new texture 
    } 
}else if (_assetReader.status == AVAssetReaderStatusCompleted) { 
    NSLog(@"restart"); 
    [_assetReader startReading]; 
} 

은 다 읽고 난이 AVAssetReading를 다시 시작하려고 할 때 AVAssetReader까지 모든 작업의 ​​벌금 읽기 상태에 있지만 [_assetReader startReading]이라는 새 호출로 인해 응용 프로그램이 출력없이 중단됩니다. 내가 뭘 잘못하고있어? 독서가 끝나면 AVAssetReading을 다시 시작하는 것이 맞습니까?

+0

업데이트, 여기 iOS의 새로운 VideoToolbox 하드웨어 액세스 API를 사용하는 실제 작업 솔루션이 있습니다. http://stackoverflow.com/a/33335884/763355 – MoDJ

답변

4

AVAssetReader은 찾기 또는 다시 시작을 지원하지 않으므로 기본적으로 순차적 디코더입니다. 같은 샘플을 다시 읽으려면 새 AVAssetReader 개체를 만들어야합니다.

1

감사합니다. Costique! 당신의 제안은 나를 다시 문제로 인도합니다. 드디어 새로운 AVAssetReader를 작성하여 읽기를 다시 시작했습니다. 그러나이를 수행하기 위해 새로운 AVAssetReaderTrackOutput을 만들어야하고 새로운 AVAssetReader 에 추가해야한다고 언급했습니다.

[newAssetReader addOutput:newTrackOutput];