gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:31:26 27 4
gpt4 key购买 nike

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

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

一切正常......除了渲染图像看起来像这样;切片和歪斜?

enter image description here

我什至尝试查看 AVAssetTrack 的首选转换矩阵,但无济于事,因为它总是返回 CGAffineTransformIdentity

旁注:如果我将源切换到相机,图像会得到很好的渲染。我错过了一些减压步骤吗?这不应该由 Assets 阅读器处理吗?

谢谢!

代码:https://github.com/shaded-enmity/objcpp-opengl-video

最佳答案

我认为 CMSampleBuffer 出于性能原因使用填充,因此您需要为纹理设置正确的宽度。

尝试设置纹理的宽度:CVPixelBufferGetBytesPerRow(pixelBuffer)/4(如果你的视频格式使用每像素 4 个字节,如果其他则更改)

关于objective-c - 使用 OpenGL-ES 在 iOS 上播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620490/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com