android - 在图像阅读器中将帧从 YUV_420_888 格式错误转换为 NV21

标签 android yuv pixelformat android-camera2

我配置了我的代码,以便使用 imageReader 对象和其他众所周知的 camera2< 从我的设备相机获取 YUV_420_888 帧流 API。现在我需要将这些帧转换为 NV21 像素格式并调用一个 native 函数,该函数期望此格式的帧执行某些计算。这是我在 imagereader 回调中使用的代码,用于重新排列帧的字节:

        ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader mReader) {
                Image image = null;
                image = mReader.acquireLatestImage();
                if (image == null) {
                    return;
                }                           

                byte[] bytes = convertYUV420ToNV21(image);

                nativeVideoFrame(bytes);
                image.close();   
            }
        };

private byte[] convertYUV420ToNV21(Image imgYUV420) {

    byte[] rez;

    ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer();
    ByteBuffer buffer1 = imgYUV420.getPlanes()[1].getBuffer();
    ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer();

    int buffer0_size = buffer0.remaining();
    int buffer1_size = buffer1.remaining();
    int buffer2_size = buffer2.remaining();

    byte[] buffer0_byte = new byte[buffer0_size];
    byte[] buffer1_byte = new byte[buffer1_size];
    byte[] buffer2_byte = new byte[buffer2_size];
    buffer0.get(buffer0_byte, 0, buffer0_size);
    buffer1.get(buffer1_byte, 0, buffer1_size);
    buffer2.get(buffer2_byte, 0, buffer2_size);


    ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
    try {
        outputStream.write( buffer0_byte );
        outputStream.write( buffer1_byte );
        outputStream.write( buffer2_byte );
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    rez = outputStream.toByteArray( );   

    return rez;
}

但不知道为什么,生成的帧在水平方向“翻转”了。换句话说,当我将相机向右移动时,经过我所描述的打包程序后的帧向左移动,就像传感器被放置在一个反自然的位置一样。

希望你能明白我的意思

谢谢,

JM

最佳答案

相机产生镜像是可以的。如果您不希望它被镜像 - 您需要执行水平镜像,交换每行中的像素。

关于android - 在图像阅读器中将帧从 YUV_420_888 格式错误转换为 NV21,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024263/

相关文章:

java - android:layout_alignParentTop ="true"和 android:layout_centerVertical ="true"不设置 imageView 在屏幕顶部居中

android - 设备重启后恢复使用 AlarmManager 设置的警报

c++ - 如何使用 libjpeg 将 YUYV 原始数据压缩为 JPEG?

android - 如何在 Android 的 ViewPager 中实现可扩展列表?

android 寻找代理流和stagefright 播放器的问题

image - 打印 YUV 图像的像素值

android - 有没有人设法使用 RenderScript 和新的 Camera API 获得 YUV_420_888 帧?

ffmpeg - FFPROBE - "Unspecified pixel format"

Android TextView setTextSize 错误地增加了文本大小

wpf - 如何将 PixelFormats.IndexedX 与 RenderTargetBitmap 一起使用?