2013-08-23 11 views
7

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

मैं अपने सतह पर वीडियो पूर्वावलोकन मिल गया लेकिन जब मैं शुरू बटन दबाएँ यह त्रुटि "MEDIA.RECORDER.START (मूल निवासी विधि) के साथ दुर्घटना। यहाँ मेरी कोड कृपया मुझे लोग मदद है।

@Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      surfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
      surfaceHolder = surfaceView.getHolder(); 
      surfaceHolder.addCallback(this); 
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      Button start =(Button)findViewById(R.id.start); 
      Button stop =(Button)findViewById(R.id.stop); 
      stop.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        camera.stopPreview(); 
        stopRecording(); 
       } 
      }); 
      start.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        startRecording(); 
       } 
      }); 
    } 

    @Override 
public void surfaceCreated(SurfaceHolder holder) { 
    camera = Camera.open(); 
    if (camera != null){ 
     Camera.Parameters params = camera.getParameters(); 
     camera.setParameters(params); 
    } 
    else { 
     Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show(); 
     finish(); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    if (previewRunning){ 
     camera.stopPreview(); 
    } 
    Camera.Parameters p = camera.getParameters(); 
    List<Camera.Size> sizes = p.getSupportedPreviewSizes(); 
    Camera.Size cs = sizes.get(0); 
    p.setPreviewSize(cs.width, cs.height); 
     camera.setParameters(p); 

    try { 
     camera.setPreviewDisplay(holder); 
     camera.startPreview(); 
     previewRunning = true; 
    } 
    catch (IOException e) { 
     Log.e(TAG,e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

private MediaRecorder mediaRecorder; 
    private final int maxDurationInMs = 20000; 
    private final long maxFileSizeInBytes = 500000; 
    private final int videoFramesPerSecond = 20; 

    public boolean startRecording(){ 
     try { 
      camera.unlock(); 

      mediaRecorder = new MediaRecorder(); 

      mediaRecorder.setCamera(camera); 
      mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

      mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 

      mediaRecorder.setMaxDuration(maxDurationInMs); 

     File tempFile = new File(getCacheDir(),"test.mp4"); 
      mediaRecorder.setOutputFile(tempFile.getPath()); 

      mediaRecorder.setVideoFrameRate(videoFramesPerSecond); 
      mediaRecorder.setVideoSize(surfaceView.getWidth(), surfaceView.getHeight()); 

      mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
      mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 

      mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 

      mediaRecorder.setMaxFileSize(maxFileSizeInBytes); 

         mediaRecorder.prepare(); 
      mediaRecorder.start(); 

      return true; 
     } catch (IllegalStateException e) { 
      Log.e(TAG,e.getMessage()); 
      e.printStackTrace(); 
      return false; 
     } catch (IOException e) { 
      Log.e(TAG,e.getMessage()); 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    public void stopRecording(){ 
     mediaRecorder.stop(); 
     camera.lock(); 
    } 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview(); 
    previewRunning = false; 
    camera.release(); 
} 

}

लॉग

08-31 02:20:11.781: E/MediaRecorder(14519): start failed: -19 
08-31 02:20:11.781: D/AndroidRuntime(14519): Shutting down VM 
08-31 02:20:11.781: W/dalvikvm(14519): threadid=1: thread exiting with uncaught exception (group=0x416c9700) 
08-31 02:20:11.781: E/AndroidRuntime(14519): FATAL EXCEPTION: main 
08-31 02:20:11.781: E/AndroidRuntime(14519): java.lang.RuntimeException: start failed. 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.media.MediaRecorder.start(Native Method) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.example.cameratest.MainActivity.startRecording(MainActivity.java:135) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.example.cameratest.MainActivity$2.onClick(MainActivity.java:61) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.view.View.performClick(View.java:4240) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.view.View$PerformClick.run(View.java:17721) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.os.Handler.handleCallback(Handler.java:730) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.os.Looper.loop(Looper.java:137) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at java.lang.reflect.Method.invokeNative(Native Method) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at java.lang.reflect.Method.invoke(Method.java:525) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at dalvik.system.NativeStart.main(Native Method) 
+0

लॉग बिल्ली करें। – TheLittleNaruto

+0

@ कुमार गौराव ने जोड़ा –

+0

पूर्ण लॉग कैट मैन ... – TheLittleNaruto

उत्तर

3
अपने startRecording विधि में

कैमरा लॉक करने के लिए इससे पहले कि आप इसे अनलॉक करने की कोशिश है:

mediaRecorder = new MediaRecorder(); 
camera.lock(); 
camera.unlock(); 
-3

यह आपके विचार से बहुत कम जटिल हो सकता है। एंड्रॉयड रिकॉर्डिंग और उद्देश्य का उपयोग करके वीडियो फ़ाइल लौटने के रूप में सरल कुछ के लिए पैर बहुत काम किया है ...

रिकार्ड एक कैमरा एप्लिकेशन दूसरे के कार्यों सौंपने का एंड्रॉयड तरीके के साथ एक वीडियो अनुप्रयोग एक इरादा का आह्वान करना है जो वर्णन करता है कि आप क्या करना चाहते हैं। इसमें तीन टुकड़े शामिल हैं: इरादा स्वयं, बाह्य गतिविधि शुरू करने के लिए एक कॉल, और वीडियो को संभालने के लिए कुछ कोड जब आपकी गतिविधि पर ध्यान केंद्रित करता है।

यहां एक ऐसा फ़ंक्शन है जो वीडियो को कैप्चर करने के इरादे का आह्वान करता है।

private void dispatchTakeVideoIntent() { 
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO); 
} 

वीडियो Android कैमरा आवेदन एक उरी भंडारण में वीडियो स्थान की ओर इशारा करते के रूप में) onActivityResult (के लिए दिया आशय में वीडियो रिटर्न देखें। निम्न कोड इस वीडियो को पुनर्प्राप्त करता है और इसे वीडियो व्यू में प्रदर्शित करता है। http://developer.android.com/training/camera/videobasics.html

0

मैं समाधान कर लिया है 30. के रूप में videoFramesPerSecond मान बदलकर शुरू त्रुटि -19 में विफल रहा है जो सिफारिश मूल्य है:

private void handleCameraVideo(Intent intent) { 
mVideoUri = intent.getData(); 
mVideoView.setVideoURI(mVideoUri); 
} 

प्रकट

<uses-feature android:name="android.hardware.camera" /> 

स्रोत को यह जोड़े QUALITY_1080p- 1080p (1920 x 1080) रिज़ॉल्यूशन और QUALITY_480P- 480p (720 x 480) रिज़ॉल्यूशन से संबंधित गुणवत्ता स्तर से संबंधित गुणवत्ता स्तर।

स्रोत: http://developer.android.com/guide/appendix/media-formats.html

11

मैं मिला यह समाधान और उसके मेरे लिए ठीक काम कर रहा है और इस समस्या को :)

2 के लिए

हल किया।3 + एंड्रॉयड:

बस बदलने के लिए:

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

रहे हैं:

mediaRecorder.setProfile(CamcorderProfile.get(CameraID,CamcorderProfile.QUALITY_HIGH)); 
+0

अच्छा! उन्हें डेवलपर पृष्ठों में यह जोड़ना चाहिए कि यदि आप डिफ़ॉल्ट का उपयोग नहीं कर रहे हैं तो आपको कैमरा आईडी निर्दिष्ट करनी चाहिए! – Billda

+0

यह काम करता है! धन्यवाद। – gprathour

+0

यह 6+ एंड्रॉइड के लिए भी काम करता है। धन्यवाद – EZDsIt

0

यह काम हो सकता है निम्नलिखित का प्रयास करें: किसी को भी करने में मदद: भेजे लिए

 try { 
      mediaRecorder.prepare(); 
      Thread.sleep(1000); 
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
     mediaRecorder.start(); 

फोन था तैयार करने के लिए समय लेना।

1 सेकंड के लिए तैयार रखें और सब ठीक काम किया गया है।

1

टिप्पणी कोड की इस पंक्ति,

mediaRecorder.setVideoSize(surfaceView.getWidth(), surfaceView.getHeight()); 
+0

क्यों? मुझे VideoSize सेटिंग के साथ कोई समस्या है http://stackoverflow.com/questions/33898173/android-media-recorder-setvideosize-do-not-work –

संबंधित मुद्दे