2013-10-04 20 views
6

W Androidzie pokazanie powierzchni podglądu przed uruchomieniem nagrywarki multimediów. Moja aplikacja ma funkcję nagrywania wideo, kiedy przechodzę do fragmentu nagrywania wideo, wyświetla się czarny ekran, kiedy zaczynam nagrywanie za pomocą przycisku start, podgląd kamery jest wyświetlany i rozpoczyna się nagrywanie.Wyświetlanie podglądu w nagrywarce z Androidem

jak rozpocząć podgląd przed nagraniem. Mam kod, że użyłem w onCreateView() z fragmentom

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

i kod, który używany na przycisk start click

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

więc jestem w stanie przekodować wideo za pomocą wyżej dodany kod, ale nie można wyświetlić podglądu przed rozpoczęciem nagrywania. Pomóż mi, gdzie mnie brakuje. Ten czarny ekran jest wyświetlany przed przekodowaniem wideo.

Z góry dziękuję.

+0

Mam ten sam problem - jak wyświetlić podgląd kamery bez nagrywania ?! Rozpoczęcie nagrywania jest niekorzystne z punktu widzenia użytkownika, zanim użytkownik ma szansę prawidłowo wyśrodkować kamerę. To imponujące, nikt jeszcze nie odpowiedział na to pytanie. – Cat

+0

@Cat dostałeś odpowiedź? – Ravi

Odpowiedz

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

Jeśli zastosujesz SurfaceHolder.Callback, zastąp metodę surfaceCreated w ten sposób. To działało dla mnie.

2

Wpadłem na ten sam problem. Sprawdziłem to i tu jest moja aktywność. Trzeba było trochę wysiłku, by nie upaść, więc oto ostateczny wynik. Wyświetla podgląd, zanim użytkownik kliknie przycisk REC. (Wyświetlam również odliczanie, ale nie przeszkadza mi to). Zauważ także, że wykonano zbyt dużo pracy w głównym wątku w tym przykładzie (po kliknięciu). Jest kilka rzeczy, które nie są najlepszymi praktykami, ale dla przykładu uważam, że jest wystarczająco dobry.

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