
这是初始化资产阅读的代码:
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,GL_RGBA,600,400,GL_BGRA_EXT,GL_UNSIGNED_BYTE,CVPixelBufferGetBaseAddress( pixelBuffer )); CVPixelBufferUnlockBaseAddress( pixelBuffer,0 ); CFRelease(sampleBuffer);
一切都很好……除了渲染的图像看起来像这样;切片和歪斜?
我甚至尝试过调查AVAssetTrack的首选转换矩阵,但无济于事,因为它总是返回CGAffinetransformIDentity.
侧注:如果我将源切换到相机,图像会变得很好.我错过了一些减压步骤吗?这不应该由资产读者处理吗?
谢谢!
代码:https://github.com/shaded-enmity/objcpp-opengl-video
解决方法 我认为CMSampleBuffer出于性能原因使用填充,因此您需要为纹理选择合适的宽度.尝试使用以下命令设置纹理的宽度:CVPixelBufferGetBytesPerRow(pixelBuffer)/ 4(如果您的视频格式每像素使用4个字节,则更改为其他)
总结以上是内存溢出为你收集整理的objective-c – 使用OpenGL-ES在iOS上播放视频全部内容,希望文章能够帮你解决objective-c – 使用OpenGL-ES在iOS上播放视频所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)