Android MediaRecorder使用绿线生成损坏的video

我正在尝试使用Android中的MediaRecorder为我的应用添加video录制function,但生成的video看起来像绿线一样损坏(音频很好)。 以下代码是我用来初始化MediaRecorder对象的代码:

mMediaRecorder = new MediaRecorder(); mCamera.unlock(); mMediaRecorder.setCamera(mCamera); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setOutputFile(Utility.CAPTURE_VIDEO_FILENAME); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); mMediaRecorder.setMaxDuration(60000); mMediaRecorder.setVideoFrameRate(20); mMediaRecorder.setMaxFileSize(5000000); mMediaRecorder.setVideoSize(352, 288); mMediaRecorder.setPreviewDisplay(mPreview.mHolder.getSurface()); mMediaRecorder.prepare(); mMediaRecorder.start(); 

我已经看过这里和这里的建议,但它们似乎没有帮助我的事业。 但我确实认为它可能与不正确的video大小有关。 所以我的问题是:在使用API​​级别7时,有没有什么好方法可以获得兼容的video大小? 据我所知,我可以使用CamcorderProfile,如果我在API级别8,但7。

设备中的video大小等于预览大小。 您必须先检查您设置的video大小是否可用。 不同设备中的video大小可能不同。因此,首先使用getSupportedPreviewSizes ()检查可用的预览大小,然后设置video大小。如果video大小不正确,则会出现绿线。

检查代码中的setRecordingHint(true);

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRecordingHint(boolean)

此参数的设置会在少数设备上导致video中的绿色毛刺。

您可以更改这些选项,看看质量如何变化:

 recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 

以下代码将为您录制video:

MediaRecorder录音机;

 private void initRecorder() { recorder = new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { recorder.setOrientationHint(90);//plays the video correctly }else{ recorder.setOrientationHint(180); } recorder.setOutputFile("/sdcard/MediaAppVideos/"+randomNum+".mp4"); } private void prepareRecorder() { recorder.setPreviewDisplay(holder.getSurface()); try { recorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void surfaceDestroyed(SurfaceHolder holder) { try { if (recording) { recorder.stop(); recording = false; } recorder.release(); // finish(); } catch (Exception e) { } }