iphone – iOS YUV视频捕获输出中的重复场景项目

我捕获视频并处理生成的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压缩吗?它是视频范围而不是全范围吗?

如果您提供更多信息,我可以提供更多提示.

点赞