我正在尝试允许用户录制与录制时可以看到的实际屏幕预览不同的视频。这似乎可以从this documentation concerning the getSupportedVideoSizes
function说明:
如果返回的列表不为null,则返回的列表将包含at 至少一个大小和返回列表中的一个大小必须是 传递给MediaRecorder.setVideoSize()用于摄像机应用程序if 相机用作视频源。 在这种情况下,大小 预览可能与录制视频的分辨率不同 在视频录制过程中。
这表明有些手机将从此fn返回null(根据我的经验,Galaxy SIII可以),但对于那些不这样做的手机,可以提供与实际视频不同分辨率的预览。这种理解是否正确?有些手机允许这种行为而其他手机不允许吗?
尝试解决方案:
在official description of the setPreviewDisplay
中使用的lengthy process of setting up for video recording函数中,提到:
如果使用null surface调用此方法或根本不调用此方法,则为media 录音机不会改变摄像机的预览表面。
这似乎是我想要的,但不幸的是,如果我这样做,整个视频录制过程完全搞砸了。我假设在录制视频的过程中,此函数不能传递null或根本不调用。也许在其他情况下这是可以的。不幸的是,这似乎对我没有帮助。
我接下来的步骤是查看TextureView
并使用预览纹理而不是典型的SurfaceView实现,以便使用openGL将纹理拉伸到我想要的大小(与实际分辨率不同)(并裁剪屏幕上的任何多余部分,然后使用Surface的setPreviewDisplay
构造函数构建Surface(SurfaceTexture surfaceTexture)
函数的Surface。由于ICS下面的不兼容性,我想避免使用TextureView
,并且因为这会增加显着的复杂性。
这似乎是一个微妙的过程,但我希望有人可以在这方面提供一些建议。
谢谢。
答案 0 :(得分: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"
/>
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)
请查看预览的分辨率,然后根据视频大小相应缩小高度或宽度。
希望它有所帮助。
答案 1 :(得分:1)
正如您所提到的,这只有在getSupportedVideoSizes()返回非空列表时才有可能。
但是如果你看到一个非空列表,那么这个简单的方法应该可以工作:
使用setPreviewSize设置所需的预览分辨率;您选择的尺寸必须是getSupportedPreviewSizes给出的尺寸之一。
分别使用setPreviewDisplay或setPreviewTexture将预览显示设置为SurfaceView或SurfaceTexture。
开始预览。
创建媒体录制器,并使用setVideoSize中的一种尺寸直接使用getSupportedVideoSizes设置其视频尺寸,或使用预定义的Camcorder profiles之一配置所有给定质量/尺寸的介质记录器设置。
将相机对象传递给MediaRecorder的setCamera电话,配置其余的媒体录像机,然后开始录制。
在具有非null getSupportedVideoSizes列表的设备上,这将导致预览保持在setPreviewSize调用设置的分辨率,并且录制以设置的视频大小/摄像机配置文件分辨率运行。在没有支持视频大小的设备上,MediaRecorder将重置预览大小以匹配录制大小。您应该能够通过设置非常低的预览分辨率和高记录分辨率来测试这一点(例如,160x120用于预览,720p用于录制)。应该很明显,当录制开始时,MediaRecorder会将预览分辨率切换为720p,因为预览质量会大幅提升。
请注意,预览尺寸与SurfaceView的尺寸没有直接关联;相机预览的输出将缩放以适合SurfaceView,因此,如果您的SurfaceView的尺寸是100x100像素,由于您的布局和设备,无论您使用的预览分辨率如何,都将缩放到100x100以进行显示。因此,您仍然需要确保SurfaceView的宽高比保持正确,以便预览不会失真。
对于电源效率,您不应使用比SurfaceView中实际像素数高得多的预览分辨率,因为在Surfaceview中拟合预览时,额外的分辨率将会丢失。这当然只有在getSupportedVideoSizes()返回非空值时才能进行记录。
答案 2 :(得分:0)
首先,我会尝试回答您的具体问题。
是的,预览尺寸通常与录制尺寸不同。预览尺寸通常与显示尺寸无关。因此,如果手机显示CIF(352 x 288),但能够录制D1(720 x 480),则预览尺寸和录制尺寸将有所不同。我觉得其他专家在这一点上已经做了充分的回答。
除了一些低端手机外,大多数最新手机都支持此功能。
与setPreviewDisplay
一起,我们也必须考虑这一点:
一个例外是,如果在调用startPreview()之前未设置预览曲面(或设置为null),则可以使用非null参数调用此方法一次以设置预览曲面。 (这允许相机设置和曲面创建并行发生,节省时间。)预览曲面在预览运行时可能不会改变。
在使用setPreviewDisplay
表面调用NULL
时,您能否分享一下您面临的问题?