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을 다시 시작하는 것이 맞습니까?
업데이트, 여기 iOS의 새로운 VideoToolbox 하드웨어 액세스 API를 사용하는 실제 작업 솔루션이 있습니다. http://stackoverflow.com/a/33335884/763355 – MoDJ