一、libyuv的优势
libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统。x86、x64、arm架构上进行编译执行,支持SSE、AVX、NEON等SIMD指令加速。
使用FFmpeg的sws_scale进行YUV等转换时,在ARM设备上运行性能较低。下图展示了sws_scale和libyuv两者耗时情况,单位为毫秒:
从图中可以看出,libyuv性能比sws_scale要好一个数量级。所以,对于实时性要求较高的场合,可考虑使用libyuv等NEON指令实现的库。
二、编译
GitHub下载地址: https://github.com/lemenkov/libyuv
编译命令:make -f linux.mk
三、运行
调用libyuv库方式: 将libyuv.h包含到工程,编译时指定libyuv.a库。
//YUYV422转YUV420P
uint8_t* i420_image = video0_yuv420p_buff;
uint8_t* i420_image_y_ptr = i420_image;
uint8_t* i420_image_u_ptr = i420_image_y_ptr + (VIDEO_WIDTH * VIDEO_HEIGHT);
uint8_t* i420_image_v_ptr = i420_image_u_ptr + (int)(VIDEO_WIDTH * VIDEO_HEIGHT * 0.25);
libyuv::YUY2ToI420(
image_buffer[video_buffer.index],VIDEO_WIDTH*2,
(uint8_t*)i420_image_y_ptr, VIDEO_WIDTH,
(uint8_t*)i420_image_u_ptr, (VIDEO_WIDTH >> 1),
(uint8_t*)i420_image_v_ptr, (VIDEO_WIDTH >> 1),
VIDEO_WIDTH, VIDEO_HEIGHT);
//YUYV422转ARGB
libyuv::YUY2ToARGB(image_buffer[video_buffer.index],VIDEO_WIDTH*2,
argb_buffer,VIDEO_WIDTH*4,VIDEO_WIDTH,VIDEO_HEIGHT);
参考文章链接1:https://blog.csdn.net/xiaolong1126626497/article/details/105984222
参考文章链接2:https://blog.csdn.net/fengchu3415/article/details/84871710