2011-04-29 19 views
4

AndroidのMediaRecorderを使用してアプリケーションにビデオ録画機能を追加しようとしていますが、結果のビデオが緑色の線で壊れて見えます(オーディオは問題ありません)。次のコードは、私がMediaRecorderオブジェクトを初期化するために使用するものである:Android 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(); 

私はすでに提案herehereを見てきましたが、彼らは私の原因を助けていないように見えます。私は、それは間違ったビデオサイズと関係があるかもしれないと思う。だから私の質問はこれは:APIレベル7を使用して互換性のあるビデオサイズを取得する良い方法はありますか? APIレベル8ではCamcorderProfileを使用できますが、7では何も使用できません。

+2

[this](http://stackoverflow.com/questions/4244999/problem-with-video-recording-after-auto-focus-in-android)の最後の回答はそれを行いました。 Camera.unlock()の前にCamera.stopPreview()を呼び出す必要があります。 – jvergeldedios

+0

私は似たような問題を抱えており、100%で修正していません。私は多くの投稿を読んでいて、みんなは言います - バグです。しかし、すべての携帯電話ではありません。また、setVideoSize(320,240)(320,240は電話で働いていましたが、緑色のぼんやりとしたものよりも多く設定されています) - それも修正する必要があります – Peter

答えて

1

デバイスのビデオサイズはプレビューサイズと同じです。最初に、設定したビデオサイズが利用可能かどうかを確認する必要があります。異なるデバイスのビデオサイズは異なる場合があります。最初に、getSupportedPreviewSizes()を使用してプレビューサイズを確認し、ビデオサイズを設定します。ビデオサイズが正しくない場合、緑色の線が表示されます。

0

あなたはこれらのオプションを変更し、qulityのはどのように変化するかを見ることができます:

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

次のコードは、とにかくあなたのためにビデオ録画します:

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) { 

     } 

    }