使用与生成的视频文件不同的预览大小录制视频

Dan*_*ith 27 android android-camera mediarecorder

我试图允许用户录制与录制时可以看到的实际屏幕预览不同的视频.这似乎可以从这个有关getSupportedVideoSizes功能的文档中说明:

如果返回的列表不为null,则返回的列表将包含至少一个Size,如果将摄像机用作视频源,则返回列表中的一个大小必须传递给MediaRecorder.setVideoSize()以用于摄像机应用程序.在这种情况下,预览的大小可以与视频记录期间记录的视频的分辨率不同.

这表明某些手机将从此fn返回null(根据我的经验,Galaxy SIII会这样做),但对于那些不这样做的手机,可以提供与实际视频不同的分辨率的预览.这种理解是否正确?有些手机允许这种行为吗?

尝试解决方案:

在功能的官方描述中setPreviewDisplay,用于设置视频录制漫长过程中,提到:

如果使用null surface调用此方法或根本不调用此方法,则介质记录器将不会更改摄像机的预览表面.

这似乎是我想要的,但不幸的是,如果我这样做,整个视频录制过程完全搞砸了.我假设在录制视频的过程中,此函数不能传递null或根本不调用.也许在其他情况下这是可以的.不幸的是,这似乎对我没有帮助.

我唯一接下来的步骤是查看TextureViews并使用预览纹理而不是典型的SurfaceView实现,以便使用openGL将纹理拉伸到我想要的大小(与实际分辨率不同)(并裁剪屏幕上的任何多余部分) ,然后使用Surface setPreviewDisplaySurface(SurfaceTexture surfaceTexture)构造函数为该函数构造一个Surface.我想避免使用TextureViewICS下面的不兼容性,也因为这会增加显着的复杂性.

这似乎是一个微妙的过程,但我希望有人可以在这方面提供一些建议.

谢谢.

小智 2

a.假设用户设置x,y的大小为视频大小

b.现在使用 getSupportedVideoSizes 函数获取整个列表并查看 x,y 是否属于其中之一并设置 MediaRecorder.setVideoSize()。如果 x,y 不属于 getSupportedVideoSizes 列表,则设置视频的默认配置文件记录。

这是关于视频大小的

现在谈到预览尺寸,没有太多解决方法选项。采用保存 SurfaceView 的relativelayout。

<android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/preview"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 />
Run Code Online (Sandbox Code Playgroud)

Preview 是 SurfaceView 的名称。在这里,我给出了将其大小重新调整为宽度和高度的一半的示例。

resetCamera();  //reset the camera   

ViewGroup.LayoutParams params = preview.getLayoutParams();
RelativeLayout myRelLayout = (RelativeLayout) findViewById(R.id.myRelLayout);
params.width = (int) (myRelLayout.getWidth()/2);
params.height = (int)(myRelLayout.getHeight()/2);
preview.setLayoutParams(params);

initCamera(); //initiate the camera(open camera, set parameter, setPreviewDisplay,startPreview)
Run Code Online (Sandbox Code Playgroud)

请查看预览的分辨率,然后根据视频尺寸相应缩小高度或宽度。

希望能帮助到你。