背景介绍
最近收到一个典型的问题,感觉比较通用,在此和大家分享一下。
最近,团队负责为客户开发一个需求:将我们的多媒体框架适配到一个新的平台上。这项任务本身没有啥难度,就按照SOP,经历了需求分析和详细设计阶段后,将任务交付给团队的其他成员进行实现和验证。最终,小伙伴完成了开发工作并将产品交付给客户进行验收。
但是客户在实际使用过程中发现会出现花屏现象,大概情况如下:
问题分析
小伙伴自己在排查问题时花了很长时间,却始终无法找到出现问题的原因。因此,他向我寻求帮助询问:“这个问题是由什么导致的”。
做多媒体时间比较久之后,长期解决问题的经验让自己一眼就发现了问题所在:这是由于YUV图像格式转换引起的。原来新平台RAW转YUV时候用的YUV420P格式,而在渲染时候却用的是YUV420SP格式,这两个格式存储格式略有差别。于是向小伙伴解释了问题原因,他自己进行了修复工作,随后进行了版本迭代。
解决方案
最后小伙伴讲转换的图像在渲染之前坐了如下转换,然后按照YUV420SP格式进行渲染即可:
void convertYUV420PtoYUV420SP(const unsigned char* yuv420p,
unsigned char* yuv420sp, int width, int height) {
int frameSize = width * height;
int uvSize = frameSize / 4;
// Copy Y component as is
memcpy(yuv420sp, yuv420p, frameSize);
// Deinterleave U and V components
for (int i = 0; i < uvSize; i++) {
yuv420sp[frameSize + i] = yuv420p[frameSize + i * 2];
yuv420sp[frameSize + uvSize + i] = yuv420p[frameSize + i * 2 + 1];
}
}
补充说明
YUV(亮度-色度-饱和度)模型是一种用于描述颜色的方式,其中亮度(Y分量)表示图像的亮度信息,而色度(UV分量)表示颜色信息。在视频处理中,常用的YUV格式包括YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411以及YUV420等。
其中,YUV420是一种常见的格式,它包括YUV420P和YUV420SP两种变体。在YUV420P中,色度信息(UV)被平面存储,即每个像素点对应一个UV对,而在YUV420SP中,色度信息被交错存储,即UV分量被压缩并交错存储,以节省空间。这种编码方式在视频压缩中被广泛应用,可以有效减少数据量而保持图像质量。
关于yuv的详细介绍,建议看看极客时间中声网视频专家李江老师的课程,覆盖了所有的RGB,YUV相关介绍,通俗易懂,图文并茂,值得推荐。
关于YUV的工具,推荐YUVPlayer,如下链接可以下载:
https://github.com/Tee0125/yuvplayer
参考资料
(1)https://github.com/byhook/ffmpeg4android/blob/master/readme/%E5%9B%BE%E8%A7%A3YU12%E3%80%81I420%E3%80%81YV12%E3%80%81NV12%E3%80%81NV21%E3%80%81YUV420P%E3%80%81YUV420SP%E3%80%81YUV422P%E3%80%81YUV444P%E7%9A%84%E5%8C%BA%E5%88%AB.md
(2)https://gist.github.com/Jim-Bar/3cbba684a71d1a9d468a6711a6eddbeb
(3)https://time.geekbang.org/column/article/449795
(4)https://github.com/Tee0125/yuvplayer
作者:我是一枚爱跑步的程序猿,维护公众号和知乎专栏《MediaStack》,有兴趣可以关注,一起学习音视频知识,时不时分享实战经验。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。