2013-08-23 18 views
7

Tôi đang làm việc trên ứng dụng quay video mà tôi muốn hiển thị xem trước và khi người dùng nhấp vào nút ghi bắt đầu quay và khi người dùng nhấp vào nút dừng, nó dừng ghi.Bắt đầu ghi phương tiện không thành công trong android cho máy ảnh

tôi đã xem trước video trên bề mặt của tôi, nhưng khi tôi bấm nút khởi động nó sụp đổ với lỗi "MEDIA.RECORDER.START (Native) phương pháp. Đây là mã của tôi hãy giúp tôi guys

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

.}

Log là

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

log mèo xin vui lòng. – TheLittleNaruto

+0

@KumarGaurav đã thêm nhật ký –

+0

Hoàn thành Đăng nhập Cat Man ... – TheLittleNaruto

Trả lời

3

trong phương pháp startRecording bạn cố gắng để khóa máy ảnh trước khi bạn mở khóa nó:

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

Điều này có thể ít phức tạp hơn bạn nghĩ. Android đã thực hiện rất nhiều công việc chân cho một cái gì đó đơn giản như ghi âm và quay trở lại các tập tin video bằng cách sử dụng Intents ...

Ghi một video với một máy ảnh App Cách Android của ủy hành động khác ứng dụng là gọi Intent mô tả những gì bạn muốn thực hiện. Điều này bao gồm ba phần: bản thân Intent, một cuộc gọi để bắt đầu Hoạt động bên ngoài và một số mã để xử lý video khi tiêu điểm quay trở lại hoạt động của bạn.

Đây là một chức năng gọi mục đích quay video.

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

Xem Video Các ứng dụng Camera Android trả về video trong tiếp cận mục đích cung cấp cho onActivityResult() như là một Uri trỏ đến vị trí video trong lưu trữ. Đoạn mã sau truy xuất video này và hiển thị nó trong một VideoView.

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

Thêm phần này vào Manifest

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

nguồn: http://developer.android.com/training/camera/videobasics.html

0

tôi đã giải quyết được sự khởi đầu thất bại lỗi -19 bằng cách thay đổi giá trị videoFramesPerSecond như 30. đó là giá trị đề nghị cho mức chất lượng QUALITY_1080p tương ứng với độ phân giải 1080p (1920 x 1080) và mức chất lượng QUALITY_480P- tương ứng với độ phân giải 480p (720 x 480).

nguồn: http://developer.android.com/guide/appendix/media-formats.html

11

Tôi tìm thấy giải pháp này và làm việc của nó tốt cho tôi và giải quyết vấn đề này :)

cho 2.3+ android:

Chỉ cần thay đổi:

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

tới:

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

Tốt đẹp! Họ nên thêm điều này vào trang dành cho nhà phát triển mà bạn nên chỉ định id máy ảnh nếu bạn không sử dụng id mặc định! – Billda

+0

Nó hoạt động! Cảm ơn. – gprathour

+0

Tính năng này cũng hoạt động trên 6+ android. Cảm ơn – EZDsIt

0

Hãy thử sau đây có thể cho nó hoạt động: giúp cho bất kỳ ai:

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

Đối đến gọi nó là dành thời gian chuẩn bị.

Giữ chuẩn bị trong 1 giây và mọi thứ đều hoạt động tốt.

1

comment dòng mã này,

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

Tại sao? Tôi gặp sự cố với settingVideoSize http://stackoverflow.com/questions/33898173/android-media-recorder-setvideosize-do-not-work –

Các vấn đề liên quan