使用FFmpeg的sws_scale进行YUV等转换时,从执行日志上看,在Android设备上运行性能较低,如下所示,单位为毫秒。
对于实时性要求较高的场合,可考虑使用libyuv等NEON指令实现的库。
对比可发现libyuv相对sws_scale有数十倍性能改善。
使用libyuv接口时得注意它参数定义,以NV21ToI420为例,其定义如下。参数src_stride_y和src_stride_vu都应该传递源Y平面的宽。
// 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);