我捕获视频并处理生成的YUV帧.
输出如下所示:
虽然它通常出现在我手机的屏幕上.但我的同伴收到它就像上面的img.
每个项目都会重复并水平和垂直移动一些值
我拍摄的视频是352×288,我的YPixelCount = 101376,UVPixelCount = YPIXELCOUNT / 4
任何解决这个问题的线索或了解如何在iOS上处理YUV视频帧的起点?
NSNumber* recorderValue = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange];
[videoRecorderSession setSessionPreset:AVCaptureSessionPreset352x288];
And this is the captureOutput function
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{
if(CMSampleBufferIsValid(sampleBuffer) && CMSampleBufferDataIsReady(sampleBuffer) && ([self isQueueStopped] == FALSE))
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
UInt8 *baseAddress[3] = {NULL,NULL,NULL};
uint8_t *yPlaneAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer,0);
UInt32 yPixelCount = CVPixelBufferGetWidthOfPlane(imageBuffer,0) * CVPixelBufferGetHeightOfPlane(imageBuffer,0);
uint8_t *uvPlaneAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer,1);
UInt32 uvPixelCount = CVPixelBufferGetWidthOfPlane(imageBuffer,1) * CVPixelBufferGetHeightOfPlane(imageBuffer,1);
UInt32 p,q,r;
p=q=r=0;
memcpy(uPointer, uvPlaneAddress, uvPixelCount);
memcpy(vPointer, uvPlaneAddress+uvPixelCount, uvPixelCount);
memcpy(yPointer,yPlaneAddress,yPixelCount);
baseAddress[0] = (UInt8*)yPointer;
baseAddress[1] = (UInt8*)uPointer;
baseAddress[2] = (UInt8*)vPointer;
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
}
}
Is there anything wrong with the above code ?
最佳答案 你的代码看起来不好.我可以看到两个错误和一个潜在的问题:
> uvPixelCount不正确. YUV 420格式意味着每个2乘2像素块有颜色信息.所以正确的计数是:
uvPixelCount = (width / 2) * (height / 2);
你写了一些关于yPixelCount / 4的东西,但我在你的代码中看不到.
> UV信息是交错的,即第二平面交替地包含U和V值.或者换一种说法:所有偶数字节地址都有一个U值,所有奇数字节地址都有一个V值.如果你真的需要分离U和V信息,那么memcpy就不会这样做.
>每个像素行后可能会有一些额外的字节.您应该使用CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0)来获取两行之间的字节数.因此,单个memcpy将无法做到.相反,您需要分别复制每个像素行以消除行之间的额外字节.
所有这些事情只能解释部分结果图像.其余部分可能是由于您的代码与接收对等方期望的差异造成的.你没有写任何关于那个的东西?对等体真的需要分离的U和V值吗?你也是4:2:0压缩吗?它是视频范围而不是全范围吗?
如果您提供更多信息,我可以提供更多提示.