如何通过WIC将YCbCr平面格式转换为UWP的压缩格式



我的源代码来自FFmpeg,它是YCbCr平面格式(YUV420P,I420),

由于某些原因,我需要将其转换为YCbCr压缩格式(NV12),

而且它必须通过WIC YCbCr API来实现,我该怎么办?

为什么选择WIC?利比尤夫更直接,可能表现更好。

https://code.google.com/p/libyuv/

特点:

缩放YUV以准备压缩内容,使用点、双线性或框过滤器
从网络摄像头格式转换为YUV
从YUV转换为用于渲染/效果的格式
旋转90/180/270度以调整纵向模式下的移动设备
针对x86/x64上的SSE2/SSSE3/AVX2进行了优化。

API:

/ Convert NV12 to I420.
LIBYUV_API
int NV12ToI420(const uint8* src_y, int src_stride_y,
               const uint8* src_uv, int src_stride_uv,
               uint8* dst_y, int dst_stride_y,
               uint8* dst_u, int dst_stride_u,
               uint8* dst_v, int dst_stride_v,
               int width, int height);
// Convert NV21 to I420.
LIBYUV_API
int NV21ToI420(const uint8* src_y, int src_stride_y,
               const uint8* src_vu, int src_stride_vu,
               uint8* dst_y, int dst_stride_y,
               uint8* dst_u, int dst_stride_u,
               uint8* dst_v, int dst_stride_v,
               int width, int height);

我不确定WIC是否是处理它的正确API。Color Converter DSP,一款来自Media Foundation的可以独立使用的产品,肯定会负责转换。它使用SIMD指令进行了很好的优化,并且自Windows Vista时代以来就存在于核心操作系统中。

FFmpeg的libswscale也做同样的事情。像这样的库和API可能会根据内部实现更好或更糟地处理特定的方向。NV12可能没有在libswscale中很好地实现。

同时,I420到NV12是一个非常简单的转换方向,您可以使用一次代码屏幕和SIMD内部函数非常高效地实现它。

最新更新