2016-08-18 3 views
2

imageReader 개체 및 기타 잘 알려진 camera2 API를 사용하여 장치의 카메라에서 YUV_420_888 프레임의 스트림을 얻으려면 코드를 구성했습니다. 이제이 프레임을 NV21 픽셀 형식으로 변환하고이 형식의 프레임이 특정 계산을 수행 할 것으로 기대하는 원시 함수를 호출해야합니다. 이것은 내가 프레임의 바이트를 다시 정렬하는 ImageReader 콜백 내에서 사용하고있는 코드입니다 :이미지 판독기에서 YUV_420_888 형식에서 NV21로 프레임이 잘못 변환되었습니다.

 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

+1

'convertYUV420ToNV21'와'compressToJpeg' 다음에 청색과 적색이 바뀝니다. –

+0

@VladimirKulyk 출력 스트림에 쓸 때 Blue 및 Red의 언 스왑을 위해 0/2/1로 다시 정렬 – AngeloS

답변

0

카메라의 미러 이미지를 생성하는 것이 괜찮아요을 무슨 뜻인지 이해 수 있기를 바랍니다. 미러링을 원하지 않으면 각 행의 픽셀을 스와핑하여 수평 미러링을 수행해야합니다.

+0

오늘 하루를 저장합니다. 그게 내가 찾는 힌트 야. – user3417052

관련 문제