2013-10-04 14 views
6

In Android, wie Vorschau-Oberfläche vor Medienrekorder starten. meine app haben videoaufzeichnung funktionalität, wenn ich zu videoaufnahmefragment navigiere es schwarzen bildschirm anzeigen, wenn ich startaufnahme mit start taste starten kamera vorschau ist display und aufnahme starten.Vorschau-Anzeige in Android-Medien-Recorder

So starten Sie die Vorschau vor der Aufnahme. Ich habe Code hinzugefügt, die ich in onCreateView verwendet() von 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); 

und den Code, den ich auf Startknopf verwendet Klick-

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

so Video rekodieren ich in der Lage bin von oben mit Code, aber nicht in der Lage, die Vorschau vor dem Start der Aufnahme anzuzeigen. Bitte helfen Sie mir, wo ich vermisse.Für diesen schwarzen Bildschirm wird vor der Aufnahme von Video angezeigt.

Vielen Dank im Voraus.

+0

Ich habe das gleiche Problem - wie zeigen Sie die Kamera Vorschau ohne tatsächlich Aufnahme ?! Es ist eine schlechte Erfahrung, die Aufnahme zu starten, bevor der Benutzer die Kamera richtig zentriert hat. Es ist beeindruckend, dass noch niemand auf diese Frage geantwortet hat. – Cat

+0

@Cat hast du deine Antwort bekommen? – Ravi

Antwort

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(); 
     } 
    } 

Wenn Sie SurfaceHolder.Callback implementieren, überschreiben Sie die SurfaceCreated-Methode wie folgt. Das hat für mich funktioniert.

2

Ich lief auf das gleiche Problem. Ich habe nachgesehen und hier ist meine Aktivität. Es hat mich ein bisschen gekostet, es nicht zum Absturz zu bringen, also hier ist das Endergebnis. Es zeigt die Vorschau an, bevor der Benutzer auf die Schaltfläche REC klickt. (Ich zeige auch einen Countdown, aber das stört mich nicht). Beachten Sie auch, dass in diesem Beispiel (beim Klicken) zu viel Arbeit am Haupt-Thread ausgeführt wird. Es gibt ein paar Dinge, die hier keine Best Practices sind, aber für ein funktionierendes Beispiel finde ich es gut genug.

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); 
     } 
    } 
}