2016-03-23 5 views
8

में कैमरा 2 एपीआई का उपयोग करके वीडियो रिकॉर्ड करते समय प्रोग्रामेटिक रूप से तस्वीरें कैसे लेना है I कैमरा 2 एपीआई का उपयोग करके वीडियो रिकॉर्ड करते समय छवि को कैप्चर करना चाहते हैं।एंड्रॉइड

दो अलग-अलग डेमो उपलब्ध हैं। 1. To capture image और 2. To record video

मैं उन्हें एक अनुप्रयोग में गठबंधन की कोशिश की। लेकिन कई चीजों में उलझन में।

  • कैमराडिवाइस एकल है जो एंड्रॉइड डिवाइस से जुड़े एक कैमरे का प्रतिनिधित्व करता है।
  • अनुरोध में आवश्यक विभिन्न टेम्पलेट। छवि के लिए: mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); और वीडियो के लिए mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
  • ImageReader की createCaptureSession विधि सतह की आवश्यकता है और वीडियो MediaRecorder की आवश्यकता है।

CameraCaptureSession.StateCallback को छवि और वीडियो दोनों के लिए createCaptureSession विधि में आवश्यक है।

और कैमरा 2 एपीआई नए हैं। तो Google पर कोई और उदाहरण उपलब्ध नहीं है।

किसी को इसके बारे में कोई जानकारी है? एंड्रॉइड में रिकॉर्डिंग करते समय फोटो कैप्चर करना कैसा है?

+0

क्या आपने उन समाधानों का प्रयास किया है जिन्हें हम आपको प्रस्तावित करते हैं? –

+0

मैं इसे निश्चित रूप से आजमाउंगा। –

उत्तर

0
public void onClick(View v) { 
    // TODO Auto-generated method stub 

    // if(v == myButton) 
    // { 
    if (recording) { 
     // stop recording and release camera 
     // type.setVisibility(View.GONE);1 
     type.setText(""); 
     myChronometer.stop(); 
     myChronometer.setBase(SystemClock.elapsedRealtime()); 
     // mediaRecorder.stop(); // stop the recording 
     releaseMediaRecorder(); // release the MediaRecorder object 
     // 
     myCamera.lock(); 
     recording = false; 

     // "/sdcard/fivo_flim/" + "fivo_flim_"+video_no 
     // + ".mp4"; 


     System.out.println("11111111111 "+SessionManager.getVideoCount(prefs1)); 

     new UploadPicture(VideoScreen.this, mApi, "/", new File(
       "/sdcard/record/" + "record" 
         + SessionManager.getVideoCount(prefs1) + ".mp4")) 
       .execute(); 
     SessionManager.saveVideoCount(prefs1, 
       SessionManager.getVideoCount(prefs1) + 1); 

     mWakeLock.release(); 
     System.out.println("uuuuuuuuuuuuuuuuuu"); 
    } else { 
     // Release Camera before MediaRecorder start 
     releaseCamera(); 
     mWakeLock.acquire(); 

     if (!prepareMediaRecorder()) { 
      Toast.makeText(
        VideoScreen.this, 
        "Fail in PrepareCamera()!\n   \n Please Insert SD Card or\n Restart your phone ", 
        Toast.LENGTH_LONG).show(); 
      finish(); 
     } 
     System.out.println("prepare media recorder"); 
     try { 
      mediaRecorder.prepare(); 
     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     System.out.println("Starting Media Recorder"); 
     try { 
      mediaRecorder.start(); 
     } catch (Exception e) { 
      // TODO: handle exception 
      System.out.println("exception is " + e); 
     } 
     type.setText("Recording..."); 

     myChronometer.setBase(SystemClock.elapsedRealtime()); 
     myChronometer.start(); 

     recording = true; 
     myButton.setClickable(false); 
     try { 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        myButton.setClickable(true); 
       } 
      }, 3000); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 

@SuppressLint({ "NewApi", "SdCardPath" }) 
private boolean prepareMediaRecorder() { 
    myCamera = getCameraInstance(); 
    mediaRecorder = new MediaRecorder(); 
    myCamera.setDisplayOrientation(90); 
    myCamera.unlock(); 
    mediaRecorder.setCamera(myCamera); 
    mediaRecorder.setOrientationHint(90); 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    mediaRecorder.setProfile(CamcorderProfile 
      .get(CamcorderProfile.QUALITY_HIGH)); 

    File mediaStorageDir = new File("/sdcard/record/"); 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Logger.Debug("failed to create directory"); 
     } 
    } 


    video_no=SessionManager.getVideoCount(prefs1); 


    mFiles.add("/sdcard/record/" + "record" + video_no 
      + ".mp4"); 
    mediaRecorder.setOutputFile("/sdcard/record/" + "record" 
      + video_no + ".mp4"); 
    video_no++; 

    mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder() 
      .getSurface()); 

    try { 
     mediaRecorder.prepare(); 

    } catch (IllegalStateException e) { 
     releaseMediaRecorder(); 
     return false; 

    } catch (IOException e) { 
     releaseMediaRecorder(); 
     return false; 
    } 

    return true; 

} 

@SuppressLint("SdCardPath") 
private void releaseMediaRecorder() { 
    if (mediaRecorder != null) { 
     mediaRecorder.reset(); 
     mediaRecorder.release(); 
     mediaRecorder = null; 
     myCamera.lock(); 

    } 
} 

private void releaseCamera() { 
    if (myCamera != null) { 
     myCamera.release(); 
     myCamera = null; 
    } 

} 

} 
6

कैमरा 2 एपीआई और वीडियो स्नैपशॉट्स के लिए, आपको कुछ हद तक कैमरा 2 वीडियो नमूना सुधारने की आवश्यकता होगी।

  • 3 कब्जा लक्ष्य सतह: पूर्वावलोकन (एक TextureView या SurfaceView), जेपीईजी (एक ImageReader), और रिकॉर्डिंग (MediaRecorder या MediaCodec)।
  • तीनों से दर्रा सतहों
  • createCaptureSession लिए वीडियो रिकॉर्डिंग नहीं है, बस पूर्वावलोकन
  • लक्षित करने के लिए दोहरा अनुरोध सेट करते हैं वीडियो रिकॉर्डिंग, दोनों पूर्वावलोकन और रिकॉर्डिंग सतह से लक्षित करते हुए शुरू करने के लिए दोहराई जाने वाली अनुरोध सेट मीडियारेकॉर्डर (कैमरा 2 वीडियो के रूप में); दोहराना अनुरोध में केवल पूर्वावलोकन को लक्षित करने के लिए रिकॉर्डिंग स्विच को रोकते समय।
  • जब आप कोई चित्र लेना चाहते हैं, तो एक अनुरोध के साथ एक एकल कैप्चर() कॉल जारी करें जो जेपीईजी सतह, पूर्वावलोकन सतह को लक्षित करता है, और यदि रिकॉर्डिंग सक्रिय है, रिकॉर्डिंग सतह।
  • इमेज रीडर से जेपीईजी प्राप्त करें जब इसकी इमेज उपलब्ध कॉलबैक आग लगती है।
+0

इसलिए मैंने इसे अपने सैमसंग एस 5 पर करने की कोशिश की और यह लगभग 1/2 सेकंड के लिए पूर्वावलोकन और रिकॉर्डिंग को फ्रीज करता है। मैंने एक ही परिणाम के साथ केवल छवि पाठक के लिए अनुरोध भेजने का प्रयास किया। इससे बचने के लिए कोई रास्ता? – GroovyDotCom

+0

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

0

एड़ी Talvala के जवाब (जो मैं डायन सहमत) का विस्तार करने के लिए:

आप वीडियो रिकॉर्ड करते समय, आप बस एक भी CaptureRequest केवल एक ImageReader.The की सतह को लक्षित जारी एक भी तस्वीर पर कब्जा करना चाहते हैं वीडियो रिकॉर्डिंग का दोहराना अनुरोध बंद नहीं किया जाएगा। इसके साथ आप रिकॉर्ड किए जा रहे वीडियो से स्नैपशॉट ले सकते हैं।

मुझे आशा है कि इससे मदद मिलेगी, अगर आपको कुछ कोड नमूने चाहिए तो मैं उन्हें घर पर पोस्ट करूंगा।

+0

से कम है, तो मैं कोड नमूने का स्वागत करता हूं ... –

0

इस दोस्त का प्रयास करें:

public void takeSnapshot(CameraCaptureSession.CaptureCallback captureCallback) { 
    try { 
     //In case that we are in legacy 
     if (null == mCameraActivity || CameraSettings.isLegacyHardwareLevel()) 
      return; 

     int captureTemplate = CameraDevice.TEMPLATE_VIDEO_SNAPSHOT; 
     final CaptureRequest.Builder captureBuilder; 
     captureBuilder = YourCameraDevice.createCaptureRequest(captureTemplate); 
     captureBuilder.addTarget(YourImageReader.getSurface()); 
     //To get the right orientation we must to get it in base of the sensor position. 
     SensorOrientation = CameraManager.getCameraCharacteristics(mCameraId).get(
      CameraCharacteristics.SENSOR_ORIENTATION); 
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, SensorOrientation); 

     mCaptureSession.capture(captureBuilder.build(), captureCallback, mBackgroundHandler); 

    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 
0

एक वीडियो के लिए एक वीडियो थंबनेल बनाएँ।यदि वीडियो भ्रष्ट है या प्रारूप समर्थित नहीं है तो शून्य वापस आ सकता है।

private void makeVideoPreview() { 
    Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND); 
    saveImage(thumbnail); 
}