我试图搜索这个问题很多,但从未见过任何令人满意的答案,所以现在我有最后的希望.
我有一个onPreviewFrame回调设置.这给出了一个byte[]支持预览格式的原始帧(NV21带H.264编码类型).
现在,问题是回调始终开始byte[]从固定方向给出帧,每当设备旋转它不反映到捕获的byte[]帧.我曾尝试与setDisplayOrientation和setRotation,但这些API的只反映了正在显示不是所有捕获的预览byte []框.
Android文档甚至说,Camera.setDisplayOrientation只影响显示预览,而不影响帧字节:
这不会影响onPreviewFrame(byte [],Camera),JPEG图片或录制视频中传递的字节数组的顺序.
最后,在任何API级别,有没有办法改变byte[]帧的方向?
如果您不关心格式,一种可能的方法是使用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)
| 归档时间: |
|
| 查看次数: |
6558 次 |
| 最近记录: |