2013-10-04 7 views
6

में पूर्वावलोकन डिस्प्ले एंड्रॉइड में मीडिया रिकॉर्डर शुरू होने से पहले पूर्वावलोकन सतह को कैसे दिखाया जाए। मेरे ऐप में वीडियो रिकॉर्डिंग कार्यक्षमता है, जब मैं वीडियो रिकॉर्डिंग खंड पर नेविगेट करता हूं तो यह ब्लैक स्क्रीन प्रदर्शित करता है, जब मैं स्टार्ट बटन कैमरा पूर्वावलोकन का उपयोग करके रिकॉर्डिंग शुरू करता हूं तो प्रदर्शित होता है और रिकॉर्डिंग शुरू होती है।एंड्रॉइड मीडिया रिकॉर्डर

रिकॉर्डिंग से पहले पूर्वावलोकन कैसे शुरू करें। मैं 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); 

का) कोड है कि मैं onCreateView में प्रयोग किया जाता है (और कोड है कि मैं प्रारंभ बटन पर इस्तेमाल किया क्लिक-

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

तो मैं इसके बाद के संस्करण का उपयोग करके वीडियो पुनःकूटित करने में सक्षम हूँ जोड़ लिया है कोड, लेकिन रिकॉर्डिंग शुरू करने से पहले पूर्वावलोकन दिखाने में सक्षम नहीं है। कृपया मेरी मदद करें जहां मैं गुम हो रहा हूं। क्योंकि वीडियो को रिकोड करने से पहले उस ब्लैक स्क्रीन को प्रदर्शित किया जाता है।

अग्रिम धन्यवाद।

+0

मुझे एक ही समस्या है - आप वास्तव में रिकॉर्डिंग के बिना कैमरा पूर्वावलोकन कैसे प्रदर्शित करते हैं ?! उपयोगकर्ता को कैमरे को सही तरीके से केंद्रित करने का मौका मिलने से पहले रिकॉर्डिंग शुरू करने के लिए यह एक खराब उपयोगकर्ता अनुभव है। यह प्रभावशाली है कि किसी ने अभी तक इस प्रश्न का जवाब नहीं दिया है। – Cat

+0

@ क्या आपको अपना जवाब मिला? – 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 को लागू करते हैं। कॉलबैक, इस तरह सतह को ओवरराइड करें। यह मेरे लिए काम किया।

2

मैं एक ही समस्या में भाग गया। मैंने इसे देखा और मेरी गतिविधि यहाँ है। यह मुझे क्रैश न करने के लिए थोड़ा सा प्रयास करता है, इसलिए अंतिम परिणाम यहां दिया गया है। यह उपयोगकर्ता आरईसी बटन पर क्लिक करने से पहले पूर्वावलोकन प्रदर्शित करता है। (मैं उलटी गिनती भी प्रदर्शित कर रहा हूं, लेकिन इसे ध्यान में रखें)। ध्यान दें कि इस उदाहरण में मुख्य धागे पर बहुत अधिक काम किया जाता है (क्लिक करते समय)। यहां कुछ ऐसी चीजें हैं जो सर्वोत्तम प्रथा नहीं हैं, लेकिन एक कामकाजी उदाहरण के लिए मुझे लगता है कि यह काफी अच्छा है।

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); 
     } 
    } 
} 
संबंधित मुद्दे