2013-10-04 16 views
6

アンドロイドでは、メディアレコーダーを開始する前にプレビューサーフェスを表示する方法。 私のアプリはビデオ録画機能を持っています。ビデオ録画の断片に移動すると黒い画面が表示されます。スタートボタンを使用して録画を開始すると、カメラのプレビューが表示され、録画が開始されます。アンドロイドメディアレコーダーのプレビュー表示

録画前にプレビューを開始する方法。 iはfragment-

surfaceHolder = mySurfaceView.getHolder(); 
camera = Camera.open(); 
if(camera!=null){ 
    camera.setDisplayOrientation(90); 
    Camera.Parameters param; 
    param = camera.getParameters(); 
    param.setPreviewFrameRate(20); 
    param.setPreviewSize(176, 144); 
    camera.setParameters(param); 
    camera.setPreviewDisplay(surfaceHolder); 
} 

mediaRecorder = new MediaRecorder(); 
camera.unlock(); 
mediaRecorder.setCamera(camera); 
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
CamcorderProfile camcorderProfile_HQ = CamcorderProfile 
      .get(CamcorderProfile.QUALITY_HIGH); 
mediaRecorder.setProfile(camcorderProfile_HQ); 
String filePath = getOutputMediaFile(MEDIA_TYPE_VIDEO).getPath(); 
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); 
mediaRecorder.setOutputFile(filePath); 

と私は私が上記使用してビデオを再符号化することができる午前

mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 
mediaRecorder.prepare(); 
mediaRecorder.start(); 

クリック - スタートボタンを使用するコードのiはonCreateViewで使用されるコード()を追加しましたコードが記録される前にプレビューを表示することはできません。 ビデオを録画する前に黒い画面が表示されています。

ありがとうございます。

+0

同じ問題があります。実際に録画せずにカメラのプレビューをどのように表示しますか?ユーザーがカメラを適切にセンタリングする前に録画を開始するのは悪いユーザーエクスペリエンスです。誰もこの質問に答えなかったのは印象的です。 – Cat

+0

@Catあなたはあなたの答えを得ましたか? – Ravi

答えて

4
public void surfaceCreated(SurfaceHolder holder) { 
     if (mCamera != null) { 
      Parameters params = mCamera.getParameters(); 
      mCamera.setParameters(params); 
      try { 
       //mCamera.setDisplayOrientation(90); 
       mCamera.setPreviewDisplay(holder); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mCamera.startPreview(); 
     } 
    } 

SurfaceHolder.Callbackを実装する場合は、このようにsurfaceCreatedメソッドをオーバーライドします。これは私のために働いた。

2

同じ問題が発生しました。私はそれを見て、ここに私の活動です。それはクラッシュしないように私に少しの努力が必要だったので、最終結果がここにあります。ユーザーがRECボタンをクリックする前にプレビューが表示されます。 (私もカウントダウンを表示していますが、気にしないでください)。この例のメインスレッドでは(クリックすると)あまりにも多くの作業が行われていることにも注意してください。ここにはベストプラクティスではないものがいくつかありますが、実際の例では十分だと思います。

import android.app.Activity; 
import android.hardware.Camera; 
import android.media.CamcorderProfile; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.os.Environment; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.io.File; 
import java.io.IOException; 

public class MainActivity extends Activity implements SurfaceHolder.Callback { 

    private static final String LOG_TAG = MainActivity.class.getCanonicalName(); 
    Button myButton; 
    MediaRecorder mediaRecorder; 
    SurfaceHolder surfaceHolder; 
    boolean recording; 
    private TextView mTimer; 
    private Camera mCamera; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     recording = false; 
     mediaRecorder = new MediaRecorder(); 
     mCamera = Camera.open(); 
     initMediaRecorder(); 

     SurfaceView myVideoView = (SurfaceView) findViewById(R.id.videoview); 
     surfaceHolder = myVideoView.getHolder(); 
     surfaceHolder.addCallback(this); 

     myButton = (Button) findViewById(R.id.mybutton); 
     myButton.setOnClickListener(myButtonOnClickListener); 

     mTimer = (TextView) findViewById(R.id.timer); 
    } 

    private Button.OnClickListener myButtonOnClickListener 
      = new Button.OnClickListener() { 

     @Override 
     public void onClick(final View arg0) { 
      CountDownTimer countDownTimer = new CountDownTimer(90 * 1000, 1000) { 
       @Override 
       public void onTick(long millisUntilFinished) { 
        mTimer.setText(String.valueOf(millisUntilFinished/1000)); 
       } 

       @Override 
       public void onFinish() { 
        onClick(arg0); 
       } 
      }; 

      if (recording) { 
       // Stop recording and finish 
       try { 
        mediaRecorder.stop(); 
        mediaRecorder.reset(); 
        mediaRecorder.release(); 
        finish(); 
       } catch (Exception e) { 
        Log.e(LOG_TAG, "Failed to stop recorder", e); 
       } 

      } else { 
       // Release the camera and start recording 
       mCamera.release(); 
       countDownTimer.start(); 
       mediaRecorder.start(); 
       recording = true; 
       myButton.setText("STOP"); 
      } 
     } 
    }; 


    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     if (mCamera != null) { 
      Camera.Parameters params = mCamera.getParameters(); 
      mCamera.setParameters(params); 
      try { 
       mCamera.setPreviewDisplay(holder); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mCamera.startPreview(); 
     } 
     prepareMediaRecorder(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder arg0) { 

    } 

    private void initMediaRecorder() { 
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
     CamcorderProfile camcorderProfile_HQ = CamcorderProfile.get(CamcorderProfile.QUALITY_CIF); 
     mediaRecorder.setProfile(camcorderProfile_HQ); 
     File file = new File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), "myvideo.mp4"); 
     if (file.exists()) { 
      file.delete(); 
     } 
     mediaRecorder.setOutputFile(file.getAbsolutePath()); 
     mediaRecorder.setMaxDuration(90000); // Set max duration 90 sec. 
     mediaRecorder.setMaxFileSize(15000000); // Set max file size 15M 
    } 

    private void prepareMediaRecorder() { 
     mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 

     try { 
      mediaRecorder.prepare(); 
     } catch (IllegalStateException | IOException e) { 
      Log.e(LOG_TAG, "Failed to prepare recorder", e); 
     } 
    } 
} 
関連する問題