使用OpenGL-ES在iOS上播放视频

7

我正在尝试在iOS上播放视频(MP4/H.263),但是结果非常模糊。 这是初始化资源读取的代码:

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];

读者初始化的内容就到这里,现在开始进入实际的纹理处理:

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);

除了渲染的图像看起来像这样; 切片和倾斜,一切都运行良好。
我甚至尝试查看AVAssetTrack的首选变换矩阵,但一直没有成功,因为它总是返回CGAffineTransformIdentity。
附注:如果我将源切换到相机,则图像会被正确渲染。 我错过了某些解压缩步骤吗? 难道资产读取器不应该处理这个问题吗?
谢谢!
代码:https://github.com/shaded-enmity/objcpp-opengl-video

4
你介意分享一下这个项目的代码吗?我正在尝试做类似的事情,但是开始起步很困难。 - Michael Nguyen
我也有兴趣使用OpenGL ES进行视频播放。你有没有遵循任何教程?或者你有什么建议的博客吗? - Sk Borhan Uddin
如果我成功找回了我用于此的代码,我会在Github上分享它,并提供一些详细的README步骤。我猜API方面可能有些变化,所以代码可能有点过时(我不再从事iOS开发,所以无法确定,但我们会看看)。 - arul
@arul...你成功地在某个地方分享了代码吗?我很感兴趣看看:)提前谢谢! - zeus
我更新了问题,并附上了我从损坏的硬盘备份中恢复的代码。 - arul
1个回答

6
我认为CMSampleBuffer使用填充是出于性能的考虑,因此您需要为纹理设置正确的宽度。
尝试使用以下内容设置纹理的宽度:CVPixelBufferGetBytesPerRow(pixelBuffer)/ 4(如果您的视频格式使用4个字节每像素,请更改)

你说得对,哇,我没有意识到错误的纹理宽度会以如此奇特的方式扭曲图像。非常感谢! - arul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接