【问题标题】:preview stretches when start video recording开始视频录制时预览会拉伸
【发布时间】:2017-10-30 23:27:25
【问题描述】:

我正在尝试进行自定义相机活动。在 MediaRecorder 开始录制视频之前,一切正常。预览在没有明显原因的情况下水平拉伸,如下所示。我已尝试更改预览大小和一些建议,但找不到可行的解决方案。请有任何想法!!

注意:我使用的是 TextureView 对象。

录制前预览

录制时预览

启动相机

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
    mST = surface;
    try {
        mCamera.setDisplayOrientation(90);
        mCamera.setPreviewTexture(mST);
        mCamera.startPreview();
        isReleased = false;
    }catch(Exception e){}
    //startVideoPreview();
}

启动媒体记录器

private boolean prepareMediaRecorder() {
    mediaRecorder = new MediaRecorder();
    mCamera.unlock();
    mediaRecorder.setCamera(mCamera);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_TIME_LAPSE_HIGH));
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
    mediaRecorder.setMaxDuration(30000); //set maximum duration 60 sec.
    mediaRecorder.setMaxFileSize(50000000); //set maximum file size 50M
    mediaRecorder.setPreviewDisplay(new Surface(mTextureView.getSurfaceTexture()));
    mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/tempVid.mp4");



    if(camId == Camera.CameraInfo.CAMERA_FACING_BACK){
        mediaRecorder.setOrientationHint(90);
    }else{
        mediaRecorder.setOrientationHint(270);
    }
    try {
        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        releaseMediaRecorder();
        return false;
    }
    return true;
}

非常感谢

【问题讨论】:

标签: java android camera mediarecorder textureview


【解决方案1】:

您的应用存在两个问题。

一,你应该选择适合你的预览尺寸。您在 onSurfaceTextureAvailable() 中的代码依赖于默认值,这太乐观了。某些设备的预览大小默认设置很奇怪。特别是当您希望在表面上显示实时预览时。您应该选择最佳预览大小(从Parameters.getSupportedPreviewSizes() 返回的列表中)。最佳尺寸将最适合给定的宽度和高度。最重要的因素是纵横比。而且,您还希望预览不要太小或太大。你可以举个简单的例子getBestPreviewSize ()

第二个问题是 MediaRecorder 还设置了“预览”大小。每个 CamcorderProfile 定义了一个特定的帧大小,当您选择它时,屏幕上的实时预览会相应更改。您可以使用 MediaRecorder.setVideoSize() 覆盖它,但如果此大小不适合所选的 CamcorderProfile,您的记录可能会被破坏。

并非所有受支持的预览尺寸都可用于视频录制(请参阅Parameters.getSupportedVideoSizes())。因此,如果您打开预览是为了录制视频,您应该选择 MediaRecorder 可以使用的最佳预览尺寸,并确保您将 Camera 和 MediaRecorder 都设置为这种方式。

最后,请注意您正在使用已弃用的相机 API。如果您的目标设备是 Lollipop 及更高版本,请考虑切换到 camera2 API。

【讨论】:

  • 我将尝试这个解决方案,如果它有效,我会告诉你。
  • 经过一些尝试,我能够让它变得更好,但不如预期。我通过在初始化 MediaRecorder 时设置视频大小来做到这一点,但它仍然会扩展,但只是一点点。
  • 你现在用什么尺寸的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 2017-01-10
  • 2020-07-23
  • 1970-01-01
相关资源
最近更新 更多