Android 安卓:录制的视频似乎失真了*
我正在尝试使用MediaRecorder从摄像机录制视频。下面是一段代码片段 剪断。。Android 安卓:录制的视频似乎失真了*,android,video,Android,Video,我正在尝试使用MediaRecorder从摄像机录制视频。下面是一段代码片段 剪断。。 mr.setAudioSource(MediaRecorder.AudioSource.MIC); mr.setVideoSource(MediaRecorder.VideoSource.CAMERA); mr.setOutputFormat(MediaRecorder.OutputFormat.ThreeGPP); mr.setAudioEncoder(MediaRecorder.AudioEncoder
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mr.setOutputFormat(MediaRecorder.OutputFormat.ThreeGPP);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mr.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
setVideoSize先生(200200);
setVideoFrameRate先生(15);
…啪
代码在里程碑/机器人上执行,将创建非空输出文件。但当我试图观看视频时,它看起来是这样的:
我的第一个想法是某种编码错误,所以我尝试了各种可能的OutputFormat/视频编码器组合,但对结果没有影响
LogCat显示以下错误
CameraInput:不支持的参数(x-pvmf/媒体输入节点/cap配置界面;valtype=键特定值)
但我不明白,我可能弄错了什么。我使用了camera.getParameters(),使用返回的参数设置预览大小,然后使用camera.setParameters()将它们推回
我完成了我能找到的每一段示例代码,但仍然没有找到解决方案
有人有什么想法吗?嘿,
我知道你不久前发布了这篇文章,我怀疑你是否还在寻找答案,但我认为这可能会帮助其他人
我想你的问题是setVideoSize先生(200200)代码>
我怀疑手机摄像头是否支持1X1的拍摄分辨率。最好使用类似于mr.setVideoSize(camcoder.get(camcoder.QUALITY\u LOW)、videoFrameWidth、camcoder.get(camcoder.QUALITY\u LOW)、videoFrameHeight的东西代码>
这将确保相机支持分辨率。还要确保预览分辨率与相机分辨率匹配,否则可能会导致相同的问题。我知道当相机打开时,如果将预览设置为高质量,将相机设置为低质量,我会遇到这种情况
Camera.Parameters p = mCamera.getParameters();
p.setPreviewSize(mSur.getWidth(), mSur.getHeight());
mCamera.setParameters(p);
当你准备录音的时候
mCamera.unlock();
if (mRecorder == null) {
mRecorder = new MediaRecorder();
} else {
mRecorder.reset();
}
mNextRecordFileName = getOneFileName();
mRecorder.setCamera(mCamera);
mRecorder.setVideoSource(mVideoSource);
mRecorder.setAudioSource(mAudioSource);
mRecorder.setPreviewDisplay(mSur.getHolder().getSurface());
mRecorder.setOutputFormat(mVideoFormat);
//设置在setEncoder之前才有效,如果不设置,htc会崩溃掉
mRecorder.setVideoSize(this.mSur.getWidth(), mSur.getHeight());
Log.i(TAG, this.mSur.getHolder().getSurfaceFrame().height()+"gao");
Log.i(TAG, this.mSur.getHolder().getSurfaceFrame().width()+"kuan");
Log.i(TAG, "宽"+this.mSur.getWidth()+"高"+mSur.getHeight());
mRecorder.setVideoEncoder(mVideoEncoder);
mRecorder.setAudioEncoder(mAudioEncoder);
mRecorder.setOutputFile(mNextRecordFileName);
希望它能帮助您您必须设置正确的setVideoSize(x,y)函数。
您必须调用提供大小选项的函数,并从该列表中进行选择,以避免录制的视频失真(我在Galaxy S3上看到过这一点),请确保将相机参数preview size和mediarecorder videosize设置为相同的高度和宽度
要获取支持的相机预览大小,请执行以下操作:
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> list = parameters.getSupportedPreviewSizes();
parameters.setPreviewSize(list.get(X).width, list.get(X).height);
// If you set Width and Height not supported by device you will get exception
// MediaRecorder object mMediaRecoder
mMediaRecoder.setVideoSize(list.get(X).width, list.get(X).height);
Camera.Parameters=Camera.getParameters();
列表=参数。getSupportedPreviewSizes();
parameters.setPreviewSize(list.get(X).width,list.get(X).height);
//如果您设置了设备不支持的宽度和高度,您将得到异常
//MediaRecorder对象记录程序
mMediaRecoder.setVideoSize(list.get(X).宽度,list.get(X).高度);
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> list = parameters.getSupportedPreviewSizes();
parameters.setPreviewSize(list.get(X).width, list.get(X).height);
// If you set Width and Height not supported by device you will get exception
// MediaRecorder object mMediaRecoder
mMediaRecoder.setVideoSize(list.get(X).width, list.get(X).height);