Я обрабатываю необработанные данные кадров биплана yuv420, которые я получаю из сети, и мне нужно создать CVPixelBuffer, чтобы обработать его в основной образ, а также записать на диск с помощью AVAssetWriter.
Когда я пытаюсь создать CVPixelBuffer с кодом ниже с шириной, такой как 120, 240 или 480, он выделяет память и создает правильный CVPixelBuffer с правильными значениями bytePerRow для обеих плоскостей (например, ширина 120 дает значение 120 bytePerRow).
Однако, когда я ввожу кадр с шириной, такой как 90, 180 или 360, он создает ошибочный bytePerRow, такой как 192 bytePerRow для ширины кадра 180. Это вызывает проблемы с отрисовкой позже в CoreImage или AVAssetWriter.
См. приведенный ниже код для создания CVPixelBuffer.
CGSize frameSize = CGSizeMake(180,240);
CVPixelBufferRef pixelBuffer = NULL;
NSDictionary *pixelAttributes = @{(id)kCVPixelBufferIOSurfaceOpenGLESFBOCompatibilityKey : (id)kCFBooleanTrue,
(id)kCVPixelBufferIOSurfaceCoreAnimationCompatibilityKey : (id)kCFBooleanTrue,
(id)kCVPixelBufferIOSurfaceOpenGLESTextureCompatibilityKey : (id)kCFBooleanTrue,
(id)kCVPixelBufferOpenGLESCompatibilityKey: (id)kCFBooleanTrue};
CVReturn result = CVPixelBufferCreate(NULL, frameSize.width, frameSize.height, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, (__bridge CFDictionaryRef _Nullable)(pixelAttributes), &pixelBuffer);
Обратите внимание, что я не могу использовать CVPixelBufferCreateWithPlanarBytes, который заставляет меня самостоятельно выделять память и вызывает утечку памяти позже при использовании с Core Image, который не является предметом этой проблемы.