这几天做浏览器渲染视频帧的时候,发现视频颜色偏绿,很像视频上面覆盖了一层绿色的蒙版。看到这个现象的时候,以为是视频解码数据的问题,浏览器不会出错,没太在意。我直到自己构造视频帧画面的时候,才发现浏览器对 NV12、NV21 格式的视频渲染有问题,其他格式(如 YV12)的渲染是正常的。
YUV 格式的简介
请看 https://www.cnblogs.com/dwdxdy/p/3713968.html
YV12 和 NV12 的区别是 U、V 平面(plane)在 YV12 中是相互独立的,而在 NV12 中是交叉存储的。即,YV12 有三个平面:Y、U、V,NV12 有两个平面:Y、UV。
YUV 与 RGB 的转换
请看 https://blog.youkuaiyun.com/liyuanbhu/article/details/68951683
R=Y+1.403×(V−128)
G=Y–0.343×(U–128)–0.714×(V–128)
B=Y+1.770×(U–128)
RGB 和 YUV 的取值范围[0,255]
所以当 YUV 为 (0,0,0) 时,对应的 RGB 为 (0,135,0),是绿色。
浏览器渲染视频帧的流程
请看 https://blog.youkuaiyun.com/luoshengyang/article/details/52082146
大致过程就是:
1、media 模块解码产生 video_frame
2、cc 模块将 video_frame 转为 resource,然后随着绘制命令一同传递给 browser 端的 gl_re