假设我有某种格式的图像(其二进制表示形式,例如来自 OpenCV 的 cv::Mat 或来自 Android 的 YuvImage,未压缩),并将其数据解释为 YUV NV21(嗯,这是 DJI 提供的示例) SDK,差不多了)。这是我所得到的:
由此,我假设原始格式不是 NV21。 YUV2? RGB888? RGB32?还有其他东西吗?
如何猜测二进制数据的原始格式是什么?
如果这有帮助,帧是从 DJI 无人机流中获取的。
YUV 图像输出使用 Android 库,根据所使用的设备会产生不同的 YUV 格式。
就我而言,根据我使用的两个设备中的哪一个,我需要切换两个颜色通道(NV12 到 NV21)的字节。
真正帮助我理解我所拥有的格式的是使用以下 YUV 播放器:https://github.com/Tee0125/yuvplayer https://github.com/Tee0125/yuvplayer
在播放器中,您可以主动更改数据的解释方式,只需测试不同的设置,直到找到正确的设置。
虽然不知道你是否需要,但我会提供我用来切换频道的方法。
/**
* Changes a NV12 yuv Frame to the NV21 format. Basically the two color channels are switched.
*
* @param yuvFrameNV12 The YUV Frame in the NV12 format.
* @param width The width of the frame.
* @param height The height of the frame.
* @return The YUV Frame in the NV21 format.
*/
private static byte[] convertNV12toNV21(byte[] yuvFrameNV12, int width, int height) {
final int length = yuvFrameNV12.length;
for (int i1 = 0; i1 < length; i1 += 2) {
if (i1 >= width * height) { //start after the luminance bytes
byte tmp = yuvFrameNV12[i1];
yuvFrameNV12[i1] = yuvFrameNV12[i1+1];
yuvFrameNV12[i1+1] = tmp;
}
}
return yuvFrameNV12;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)