如何通过onPreviewFrame回调更改捕获的byte []帧的方向?

9 android-camera

我试图搜索这个问题很多,但从未见过任何令人满意的答案,所以现在我有最后的希望.

我有一个onPreviewFrame回调设置.这给出了一个byte[]支持预览格式的原始帧(NV21H.264编码类型).

现在,问题是回调始终开始byte[]从固定方向给出帧,每当设备旋转它不反映到捕获的byte[]帧.我曾尝试与setDisplayOrientationsetRotation,但这些API的只反映了正在显示不是所有捕获的预览byte []框.

Android文档甚至说,Camera.setDisplayOrientation只影响显示预览,而不影响帧字节:

这不会影响onPreviewFrame(byte [],Camera),JPEG图片或录制视频中传递的字节数组的顺序.

最后,在任何API级别,有没有办法改变byte[]帧的方向?

bvi*_*dal 2

如果您不关心格式,一种可能的方法是使用YuvImage类获取 JPEG 缓冲区,使用该缓冲区创建一个Bitmap并将其旋转到相应的角度。像这样的东西:

@Override
public void onPreviewFrame(byte[] data, Camera camera) {

    Size previewSize = camera.getParameters().getPreviewSize();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] rawImage = null;

    // Decode image from the retrieved buffer to JPEG
    YuvImage yuv = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);
    yuv.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), YOUR_JPEG_COMPRESSION, baos);
    rawImage = baos.toByteArray();

    // This is the same image as the preview but in JPEG and not rotated
    Bitmap bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
    ByteArrayOutputStream rotatedStream = new ByteArrayOutputStream();

    // Rotate the Bitmap
    Matrix matrix = new Matrix();
    matrix.postRotate(YOUR_DEFAULT_ROTATION);

    // We rotate the same Bitmap
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, previewSize.width, previewSize.height, matrix, false);

    // We dump the rotated Bitmap to the stream 
    bitmap.compress(CompressFormat.JPEG, YOUR_JPEG_COMPRESSION, rotatedStream);

    rawImage = rotatedStream.toByteArray();

    // Do something we this byte array
}
Run Code Online (Sandbox Code Playgroud)