Воспроизведение видео на iOS с использованием OpenGL-ES

Я пытаюсь воспроизвести видео (MP4 / H.263) на iOS, но получаю очень нечеткие результаты. Вот код для инициализации чтения ресурса:

mTextureHandle = [self createTexture:CGSizeMake(400,400)];

NSURL * url = [NSURL fileURLWithPath:file];    
mAsset = [[AVURLAsset alloc] initWithURL:url options:NULL];

NSArray * tracks = [mAsset tracksWithMediaType:AVMediaTypeVideo];

mTrack = [tracks objectAtIndex:0];

NSLog(@"Tracks: %i", [tracks count]);

NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary * settings = [[NSDictionary alloc] initWithObjectsAndKeys:value, key, nil];

mOutput = [[AVAssetReaderTrackOutput alloc] 
            initWithTrack:mTrack outputSettings:settings];


mReader = [[AVAssetReader alloc] initWithAsset:mAsset error:nil];
[mReader addOutput:mOutput];

Итак многое для читателя init, теперь собственно текстурирование:

CMSampleBufferRef sampleBuffer = [mOutput copyNextSampleBuffer];    
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

glBindTexture(GL_TEXTURE_2D, mTextureHandle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 600, 400, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress( pixelBuffer ));    
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );    
CFRelease(sampleBuffer);

Все работает хорошо ... за исключением того, что визуализированное изображение выглядит так; нарезанный и перекошенный?

enter image description here

Я даже пытался изучить предпочтительную матрицу преобразования AVAssetTrack , но безрезультатно, поскольку она всегда возвращает CGAffineTransformIdentity .

Примечание: если я переключаю источник на камеру, изображение отображается нормально. Я пропустил какой-то этап декомпрессии? Разве это не должно выполняться программой чтения активов?

Спасибо!

Код: https://github.com/shaded-enmity/objcpp-opengl-video

7
задан arul 7 February 2017 в 16:29
поделиться