摄像头-录制视频后预览画面发生变化

8

我有一个自定义的全屏横屏相机,设备尺寸为1024 x 600。

支持的预览尺寸列表
宽 x 高
176 x 144
320 x 240
352 x 288
528 x 432
640 x 480
1024 x 576
1024 x 768

支持的视频尺寸列表
宽 x 高
176 x 144
320 x 240
352 x 288
640 x 480
720 x 480
1280 x 720

如果没有设置预览大小,我的预览画面会从上下压缩, 左右拉长。

我的预览 getOptimalPreviewSize 返回了 1024 x 576 的大小, 最接近的视频尺寸是 1280 x 720。

因此,在设置视频尺寸并开始录制视频后

mediaRecorder.setVideoSize(1280, 720);

在 surface view 中发生了变化(在这种情况下进行了缩放)。

我想知道,如何解决大小差异问题, 并在录制前后始终看到相同的预览?

3个回答

1
事实上,这是一个棘手的问题,并且因硬件而异。简单地说,对于一些硬件供应商来说,有时是不可能实现的。
硬件供应商决定如何处理原始摄像头传感器分辨率、请求的预览视图和视频采集尺寸以及将预览适配到屏幕分辨率所需的后续处理(插值调整大小)之间的大小和纵横比差异。
通常,“处理”包括:
- 裁剪,即直接丢弃原始图像的某些部分(即边距)。 - 调整大小-意味着使用插值和平均算法生成具有不同大小的图像。纵横比可能会改变。
两者通常都被编程运行在专用硬件或GPU上。系统级芯片(SoC)表示除CPU和GPU外,还有很多专门的硬件可供供应商(仅供应商)用于处理。
如果您的设备使用裁剪来适应尺寸,则预览和最终图像/视频边界将不匹配。除非您为此设备型号量身定制附加处理代码,否则无法解决此问题。
此外,并非所有预览大小都与相机传感器具有相同的宽高比。这很明显,因为预览大小本身具有各种宽高比。

0

我建议仍然使用1280x720。如果您在不录制视频时使用此预览大小,我怀疑不会有显着的性能损失。

让我解释一下:您在setPreviewSize()中选择的分辨率具有两个作用:它定义了由SurfaceView或TextureView接收的图像的宽高比,以及它定义了在Camera.PreviewCallback.onPreviewFrame()(如果您使用setPreviewCallback())中接收的数据缓冲区的大小。这个分辨率不影响在表面或纹理上渲染预览所需的时间,因为这些操作是通过硬件执行的。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接