java - 相机参数 setRotation() 方法不会旋转 onPreviewFrame() 中收到的帧

标签 java android rotation video-streaming android-camera

我有扩展 SurfaceView 并实现 Camera.PreviewCallback 的自定义 View 。我将此 View 用作相机预览。还实现了捕获视频帧以缓冲和流式传输它们的功能。

当设备的方向改变时,我用适当的参数调用 setRotation()。

Camera.Parameters parameters = svVideo.getCamera().getParameters();
parameters.setRotation(rotation);
svVideo.getCamera().setParameters(parameters);

但遗憾的是,在 onPreviewFrame() 回调中捕获的帧的方向没有变化。我想要实现的是,如果我旋转流媒体设备,发送到其他设备的视频流将相应地旋转。

我还尝试按照描述拍摄一些改变旋转的照片。 setRotation() 只影响前置摄像头拍摄的照片的旋转(这很奇怪),后置摄像头的照片根本不受影响。

我的问题是:我怎样才能获得可用于流式传输的正确旋转帧或自己在回调中旋转它们?

这是我的 onPreviewFrame 方法:

@Override
public void onPreviewFrame(final byte[] frame, final Camera camera) {
    final long now = System.nanoTime();
    if (outq.remainingCapacity() >= 2 && (now - this.frame) >= 1000000000 / fps) { //Don't encode more then we can handle, and also not more then FPS.
        queueFrameForEncoding(frame, now);
    }
    getEncodedFrames();
    camera.addCallbackBuffer(frame); //Recycle buffer
}

最佳答案

byte[] rotatedData = new byte[imgToDecode.length]; 
    for (int y = 0; y < imgHeight; y++) {
        for (int x = 0; x < imgWidth; x++)
            rotatedData[x * imgHeight + imgHeight - y - 1] = imgToDecode[x + y * imgWidth];
    }

同样在旋转后你应该交换宽度和高度

int buffer = height;
height = width;
width = buffer;

关于java - 相机参数 setRotation() 方法不会旋转 onPreviewFrame() 中收到的帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560898/

相关文章:

c++ - 使用旋转矩阵旋转三角形 - 从窗口中消失

java - 单选按钮操作监听器中的问题

java - Spring @Value TypeMismatchException :Failed to convert value of type 'java.lang.String' to required type 'java.lang.Double'

java - 返回值不变-java

android - 以编程方式将 View 添加到 Android Viewgroup

javascript - 带有 JQuery 修复的内容旋转器 : how to scroll each thumbnail and not set?

ios - Retina 3.5 在模态视图中旋转到 UIInterfaceOrientationLandscapeLeft 后原点错误

java - 如何防止 JAXB 转义字符串

android - Eclipse 控制台不显示日志

安卓:setContentView() == getViewInflate().inflate()?