2013-10-09 14 views
10

Tôi hiện đang phát triển một ứng dụng cần quay video ở chế độ nền và xử lý video.Cách sử dụng Máy ảnh Android trong nền?

(Nó cần để có được máy ảnh dữ liệu xem trước thời gian thực trong nền và phải xử lý hình ảnh dữ liệu preview)

Tuy nhiên, để đạt được điều đó, tôi cần phải sử dụng Camera và OpenCV như dịch vụ, và có vẻ như rằng không thể sử dụng JavaCameraView trong OpenCV và Android.Hardware.Camera mà không sử dụng bất kỳ bản xem trước nào.

Đây là câu hỏi của tôi.

  1. Tôi nghe nói rằng NativeCamera trong OpenCV có thể được sử dụng cho mục đích này. Có thể không? (Có thể có ví dụ?)

  2. Có phương pháp nào để tôi có thể sử dụng JavaCameraView (hoặc các nội dung tương tự) cho mục đích này không? Tôi hiện đang sử dụng Galaxy S4.

  3. Có bất kỳ cách giải quyết tốt nếu android không hỗ trợ phương pháp như vậy? (Sử dụng máy ảnh Preview mà không xem bề mặt, hoặc camera Process dữ liệu mà không sử dụng xem trước)

  4. (KHÔNG BẮT BUỘC) Tại sao android không hỗ trợ hoạt động như vậy? Điều đó rất phiền!

Cảm ơn bạn đã trả lời câu hỏi.

+0

Tôi có tình huống tương tự như bạn bây giờ. Bạn đã có một số giải pháp? –

+0

Bản sao có thể có của [android - sử dụng máy ảnh từ bên trong dịch vụ nền] (http://stackoverflow.com/questions/6901542/android-use-camera-from-within-background-service) –

+1

https://github.com/ kevalpatel2106/android-hidden-camera - thư viện này cung cấp giao diện dễ dàng để chụp ảnh từ nền. –

Trả lời

0

Bạn có thể sử dụng dịch vụ để khởi động camera ở chế độ nền. Bạn có thể tham khảo this. Hy vọng điều này sẽ giúp bạn.

+0

Vấn đề là phương pháp thường được sử dụng để triển khai máy ảnh trong Dịch vụ không hoạt động. – EngineerCat

+0

Nhiều người đã đề xuất sử dụng Dummy Surfaceview hoặc làm cho surfaceview hầu như không nhìn thấy được (bằng cách làm cho nó rất nhỏ), nhưng trình xem lướt sóng giả không thành công cho thiết bị của tôi. Ngoài ra, không thể sử dụng surfaceview vì tôi cần phát triển sao cho máy ảnh hoạt động ngay cả khi tôi lướt qua các ứng dụng khác (vì tôi muốn áp dụng nó cho mục đích giao diện người dùng dựa trên chuyển động) và điều này sẽ gây ra surfaceview (bất kể kích thước)) Bị phá hủy. – EngineerCat

2

nó có thể với các bước sau ..

Tạo một hoạt động mà sẽ bắt đầu dịch vụ nền của bạn trên một số sự kiện hoặc bạn cũng có thể sử dụng quản lý báo động bắt đầu và dừng dịch vụ theo yêu cầu của bạn.

Xem mã bên dưới sẽ giúp bạn.

public boolean starMediaRecording(){ 
     Camera.Parameters params = mServiceCamera.getParameters(); 
     mServiceCamera.setParameters(params); 
     Camera.Parameters p = mServiceCamera.getParameters(); 

     final List<Size> listSize = p.getSupportedPreviewSizes(); 
     Size mPreviewSize = listSize.get(2); 
     p.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     p.setPreviewFormat(PixelFormat.YCbCr_420_SP); 
     mServiceCamera.setParameters(p); 

     try { 
      mServiceCamera.setPreviewDisplay(mSurfaceHolder); 
      mServiceCamera.startPreview(); 
     } 
     catch (IOException e) { 
      Log.e(TAG, e.getMessage()); 
      e.printStackTrace(); 
     } 

     mServiceCamera.unlock(); 

     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.setCamera(mServiceCamera); 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
     mMediaRecorder.setOutputFile("/sdcard/filenamevideo.mp4"); 
     mMediaRecorder.setVideoFrameRate(30); 
     mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height); 
     mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 

     mMediaRecorder.prepare(); 
     mMediaRecorder.start(); 

     mRecordingStatus = true; 

     return true; 

} 

public void stopMediaRecorder() { 
    mServiceCamera.reconnect(); 

    mMediaRecorder.stop(); 
    mMediaRecorder.reset(); 

    mServiceCamera.stopPreview(); 
    mMediaRecorder.release(); 

    mServiceCamera.release(); 
    mServiceCamera = null; 
    } 
} 
Các vấn đề liên quan