羽沐川 2016-07-01 10:21 采纳率: 0%
浏览 5023
已结题

Android 中MediaRecorder+SurfaceView 录制视频的时图像变形

项目需要一个能录制十分钟左右自动停止的功能,找SDK发现满足不了需求,没办法就自己写了
基本都写完了,但是在录制的时候图像会拉伸变形,查了好多资料一直也没有一个好办法,现在
我解决了预览变形的,下面不知道怎么弄了,请教那位大神帮助一下
MediaRecorder配置类
if (!isRecorder && mMediaRecorder == null) {
mMediaRecorder = new MediaRecorder();
try {
mMediaRecorder.setCamera(mCamera);
// 设置从摄像头采集图像
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER)
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置视频文件的输出格式
// 必须在设置声音编码格式、图像编码格式之前设置
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// mMediaRecorder.setMaxDuration(1000);
// 设置图像编码的格式
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
//Use myVideoSize from above

            mMediaRecorder.setVideoSize(320, 240);
            // 设置声音编码的格式
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制
            /*
             * mMediaRecorder.setAudioChannels(1);//1单声道 2 多声道
             * mMediaRecorder.setAudioSamplingRate(12500);
             * //设置录制的音频采样率——频率越高,音质越好
             * mMediaRecorder.setAudioEncodingBitRate(16); // 设置录制的音频编码比特率
             */
            // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制
            // 每秒 4帧
            mMediaRecorder.setVideoFrameRate(30);
            mMediaRecorder.setVideoEncodingBitRate(10 * 1024 * 1024);
            // 文件输出路劲
            mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());
            mMediaRecorder.setPreviewDisplay(mHolder.getSurface());             
            mMediaRecorder.prepare();
            // mCamera.startPreview();
            mMediaRecorder.start();

}

设置照相机
if (mCamera != null) {
freeCameraResource();
}
try {
mCamera = Camera.open();
if(mCamera != null && isOpenCamera) setCameraParams();
mCamera.startPreview();
mCamera.setDisplayOrientation(0);
mCamera.setPreviewDisplay(mHolder);

mCamera.unlock();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

// 设置照相机
private void setCameraParams() {
    // TODO Auto-generated method stub
    if (mCamera != null) {
        params = mCamera.getParameters();   
        WindowManager manager = (WindowManager) VideotTranscribe.this.getSystemService(VideotTranscribe.this.WINDOW_SERVICE); 
        Display display = manager.getDefaultDisplay(); 
       // Point screenResolution = new Point(display.getWidth(), display.getHeight());
        //Point p = getBestCameraResolution(params, screenResolution);
        params.setPreviewSize(display.getWidth(),display.getHeight());//防止录制预览图像变形
        mCamera.setParameters(params);          
        params = mCamera.getParameters();
    }

    跪求大神指导
  • 写回答

3条回答 默认 最新

  • HACK__ZSMJ 2016-07-15 02:38
    关注

    如果没有进行surfaceview居中显示操作的话,你的预览分辨率和surfaceview的长宽比例要一致

    评论

报告相同问题?

悬赏问题

  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误