我的来源是FFmpeg,它是YCbCr平面格式(YUV420P,I420),
由于某些原因,我需要将其转换为YCbCr打包格式(NV12),
它必须通过WIC YCbCr API来完成,我该怎么做?
答案 0 :(得分:1)
为何选择WIC? Libyuv更直接,可能表现更好。
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);
答案 1 :(得分:0)
我不确定WIC是否是正确的API来处理它。媒体基金会的一篇文章Color Converter DSP可以单独使用,肯定会关注转换。它使用SIMD指令进行了很好的优化,并且自Windows Vista开始就存在于核心操作系统中。
FFmpeg的libswscale也做同样的事情。像这样的库和API可能会根据内部实现更好或更差地处理特定方向。有可能NV12在libswscale中没有很好地实现。
同时,I420到NV12是一个非常简单的转换方向,您可以使用一次代码屏幕和SIMD内部函数来实现它,而且效率非常高。