android中的扩展相机视图?

android中的扩展相机视图?,android,android-layout,Android,Android Layout,我在应用程序中使用的摄影机视图与本机摄影机不同,例如,本机摄影机视图如下所示, 但在我的应用程序中,视图不一样,我使用surfaceview为我的自定义相机和媒体录像机捕获视频,在布局中我使用帧布局 <Button android:id="@+id/widget34" android:background="@drawable/camrecord" android:layout_height="60dp" android:layout_width="60dp"

我在应用程序中使用的摄影机视图与本机摄影机不同,例如,本机摄影机视图如下所示,

但在我的应用程序中,视图不一样,我使用surfaceview为我的自定义相机和媒体录像机捕获视频,在布局中我使用帧布局


<Button android:id="@+id/widget34" android:background="@drawable/camrecord"
    android:layout_height="60dp" android:layout_width="60dp"
    android:layout_gravity="right" android:layout_marginRight="20dp">
</Button>
<Button android:id="@+id/widget33" android:background="@drawable/stoprecord"
    android:layout_gravity="right" android:layout_height="60dp"
    android:layout_width="60dp" android:layout_marginTop="-60dp"
    android:layout_marginRight="20dp">
</Button>

我尝试使用预定义的屏幕高度和屏幕宽度查看,但它再次似乎有些拉伸,这是我的拉伸相机视图,

我如何解决这个问题,如果有人知道这个问题,请帮我解决


谢谢。

看起来长宽比已经不存在了。 尝试更改相机的预设分辨率

在摄像机参数上调用
setPreviewSize
,并在摄像机设备上设置摄像机参数。重新启动预览

编辑:添加代码

mCameraDevPara.setPreviewSize(PREVIEW_WIDTH, PREVIEW_HEIGHT);
mCameraDev.setParameters(mCameraDevPara);
mMediaRecoder.setCamera(mCameraDev);

PREVIEW\u WIDTH
PREVIEW\u HEIGHT
应该是您想要设置的预览分辨率的宽度和高度。

最后,我通过设置videEncodingBitRate、AudioEncodingBitRate、AudioSamplingRate等,找到了在android 2.1中录制高质量视频的代码。使用此方法,您可以设置视频的属性,以提供高质量的视频

有关设置高质量和低质量参数的信息,请参阅本页

下面是我在安卓2.1基础版本中用来制作高质量视频的代码

recorder = new MediaRecorder();
Method[] methods = recorder.getClass().getMethods();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(24);
recorder.setVideoSize(720, 480);

for (Method method : methods) {
    try {
        if (method.getName().equals("setAudioChannels")) {
            method.invoke(recorder, String.format("audio-param-number-of-channels=%d", 1));
        } else if (method.getName().equals("setAudioEncodingBitRate")) {
            method.invoke(recorder, 12200);
        } else if (method.getName().equals("setVideoEncodingBitRate")) {
            method.invoke(recorder, 3000000);
        } else if (method.getName().equals("setAudioSamplingRate")) {
            method.invoke(recorder, 8000);
        } else if (method.getName().equals("setVideoFrameRate")) {
            method.invoke(recorder, 24);
        }
    } catch (IllegalArgumentException e) {

        e.printStackTrace();
    } catch (IllegalAccessException e) {

        e.printStackTrace();
    } catch (InvocationTargetException e) {

        e.printStackTrace();
    }
}

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

如何设置MediaRecorder的预览大小您需要在
Camera
对象上设置预览大小,然后通过
setCamera
方法将Camera对象传递给
MediaRecorder
。简单地说,您可以针对特定摄影机对象设置预览分辨率,然后将该摄影机对象传递给mediarecorder。另外,请确保在xml中定义的曲面视图的宽度和高度与预览分辨率相同。我已添加了代码,请先使用标准分辨率(如VGA[640x480]),这样可以保持纵横比,但如果设备屏幕大于VGA,则可能无法填充设备屏幕。希望有帮助。我如您所说添加了,但在开始录制recorder.start()时,它显示以下错误06-15 16:20:49.862:error/AndroidRuntime(10837):java.lang.IllegalStateException 06-15 16:20:49.862:error/AndroidRuntime(10837):在android.media.MediaRecorder.start(本机方法)上,能否使用
getPreferredPreviewSizeForVideo
返回的大小。还可以使用与要录制的视频大小相同的纵横比设置预览大小。
recorder = new MediaRecorder();
Method[] methods = recorder.getClass().getMethods();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(24);
recorder.setVideoSize(720, 480);

for (Method method : methods) {
    try {
        if (method.getName().equals("setAudioChannels")) {
            method.invoke(recorder, String.format("audio-param-number-of-channels=%d", 1));
        } else if (method.getName().equals("setAudioEncodingBitRate")) {
            method.invoke(recorder, 12200);
        } else if (method.getName().equals("setVideoEncodingBitRate")) {
            method.invoke(recorder, 3000000);
        } else if (method.getName().equals("setAudioSamplingRate")) {
            method.invoke(recorder, 8000);
        } else if (method.getName().equals("setVideoFrameRate")) {
            method.invoke(recorder, 24);
        }
    } catch (IllegalArgumentException e) {

        e.printStackTrace();
    } catch (IllegalAccessException e) {

        e.printStackTrace();
    } catch (InvocationTargetException e) {

        e.printStackTrace();
    }
}

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);