gpt4 book ai didi

ios - AVPlayerItemVideoOutput copyPixelBufferForItemTime针对特定视频在iOS上给出了不正确的CVPixelBufferRef

转载 作者:行者123 更新时间:2023-12-01 19:53:28 25 4
gpt4 key购买 nike

当iOS上的相同视频copyPixelBufferForItemTime不正确时,您遇到问题了吗?

我有AVPlayerItemVideoOutput,已链接到适当的AVPlayerItem
我调用copyPixelBufferForItemTime,接收CVPixelBufferRef,然后从中检索OpenGL纹理。

CVPixelBufferRef pb = [_playerVideoOutput copyPixelBufferForItemTime:currentTime itemTimeForDisplay:nil];

对于此 sample video,CVPixelBufferRef有一个错误:
int bpr = (int)CVPixelBufferGetBytesPerRow(pb);
int width_real = (int)CVPixelBufferGetWidth(pb);
int width_working = (int)CVPixelBufferGetBytesPerRow(pb)/4;

Mac输出:
bpr = 2400
width_real = 596
width_working = 600

iOS输出:
bpr = 2432
width_real = 596
width_working = 608

如何在iOS上呈现:
enter image description here

在Mac上的呈现方式: enter image description here
CVPixelBufferGetPixelFormatType在两个平台上都返回 BGRA

编辑
在iOS上创建纹理时,我通过 CVPixelBufferGetBaseAddress从像素缓冲区读取数据,并使用提供的大小 CVPixelBufferGetWidth / CVPixelBufferGetHeight:
- (GLuint)createTextureFromMovieFrame:(CVPixelBufferRef)movieFrame
{
int bufferWidth = (int) CVPixelBufferGetWidth(movieFrame);
int bufferHeight = (int) CVPixelBufferGetHeight(movieFrame);

// Upload to texture
CVPixelBufferLockBaseAddress(movieFrame, 0);

CVOpenGLTextureRef texture=0;
GLuint tex = 0;

#if TARGET_OS_IOS==1
void * data = CVPixelBufferGetBaseAddress(movieFrame);
CVReturn err = 0;
tex = algotest::MyGL::createRGBATexture(bufferWidth, bufferHeight, data, algotest::MyGL::KLinear);

#else
CVReturn err = CVOpenGLTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
getGlobalTextureCache(), movieFrame, 0, &texture);
#endif

CVPixelBufferUnlockBaseAddress(movieFrame, 0);

return tex;
}

因此, width_working仅用于调试。因为它不匹配 width_real,并且不传递 width_working而不传递 width_real不起作用,所以我认为这是像素缓冲区的错误。

最佳答案

像素缓冲区在iOS和Mac上均具有每行填充像素,大概是出于对齐的原因。区别在于,mac CVOpenGLTextureCacheCreateTextureFromImage函数可以理解这一点,而iOS createRGBATexture函数则不能,而且没有没有“每行字节数”参数。

您可以在宽度中包括填充像素,然后将其裁剪掉:

tex = algotest::MyGL::createRGBATexture(CVPixelBufferGetBytesPerRow(movieFrame)/4, bufferHeight, data, algotest::MyGL::KLinear);

或者,您可以使用 CVOpenGLESTextureCache(iOS上等效的 CVOpenGLTextureCache),并用 createRGBATexture()替换 CVOpenGLESTextureCacheCreateTextureFromImage()。然后您的Mac和iOS代码将相似,并且iOS代码甚至可能运行得更快,因为iOS上的纹理缓存可以避免纹理数据的冗余复制。

关于ios - AVPlayerItemVideoOutput copyPixelBufferForItemTime针对特定视频在iOS上给出了不正确的CVPixelBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44179891/

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