2017-11-30 137 views
7

Xin chào Tôi đang cố gắng sử dụng API camera v2 để quay video bằng thiết bị Raspberry Pi 3 sử dụng mô-đun camera Raspberry Pi gắn với nó.Trình quay video trên Android: không nhận được bề mặt

Tôi đang phát triển ứng dụng này bằng Android Things with Kotlin.

Dưới đây là cách mã quay video của tôi trông như thế nào.

override fun startRecording(videoCameraCallback: VideoCameraCallback) { 
    val cameraIdList = cameraManager.cameraIdList 
    cameraManager.openCamera(cameraIdList[0], cameraStateCalback, null) 

    Log.d("JJJ", "start recording called") 
} 

    var cameraStateCalback = object : CameraDevice.StateCallback() { 
    override fun onOpened(camera: CameraDevice?) { 
     if (camera != null) { 
      Log.d("JJJ", "onOpened and will now create handler and capture session") 
      //create handler thread 
      val thread = HandlerThread("MyHandlerThread") 
      thread.start() 
      val handler = Handler(thread.looper) 

      //create capture session 
      val mediaRecorderSurface = setMediaOutputSurface() 
      val surfaces = ArrayList<Surface>() 
      surfaces.add(mediaRecorderSurface) 
      captureRequest = camera.createCaptureRequest(TEMPLATE_RECORD).build() 
      camera.createCaptureSession(surfaces, cameraCaptureSessionCallBack,handler) 
      Log.d("JJJ", "Created thread handler and capture session") 
     } 
    } 

    override fun onDisconnected(camera: CameraDevice?) { 
     Log.d("JJJ", "on disconnected") 
    } 

    override fun onError(camera: CameraDevice?, error: Int) { 
     Log.d("JJJ", "on error") 
    } 
} 



var cameraCaptureSessionCallBack = object : CameraCaptureSession.StateCallback(){ 

    override fun onConfigureFailed(session: CameraCaptureSession?) { 
     Log.d("JJJ", "on configured failed") 
    } 

    override fun onConfigured(session: CameraCaptureSession?) { 
     Log.d("JJJ", "start recording") 
     mediaRecorder.start() 

    } 
} 


    private fun setMediaOutputSurface(): Surface { 
      var file = File(context.filesDir.absolutePath) 
     if(file.canWrite() && file.canRead()){ 
      Log.d("JJJ", "File location is fine") 
     } 

     mediaRecorder = MediaRecorder() 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE) //changed this to surface from camera and it fixed the cant get surface error 

     mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) 
     mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264) 
     mediaRecorder.setVideoSize(600,600) 


//  mediaRecorder.setVideoEncodingBitRate(10000000) 
//  mediaRecorder.setVideoEncodingBitRate(512 * 1000) 
     mediaRecorder.setOutputFile(context.filesDir.absolutePath + "/"+System.currentTimeMillis() + ".mp4") 
     mediaRecorder.setVideoFrameRate(30) 

     mediaRecorder.prepare() 
//  mediaRecorder.start() 
     return mediaRecorder.surface 

}

Đây là chiến lược của tôi

  1. danh sách Nhận Camera ID bằng cách sử dụng quản lý máy ảnh.
  2. Mở camera đầu tiên trong danh sách (chỉ có một camera gắn
  3. khi mở ra thành công, tạo handler chủ đề
  4. Tạo mediaRecorder với tất cả các thông số cần thiết (nguồn video, tốc độ khung hình vv
  5. Lấy đối tượng bề mặt từ mediaRecorder (nơi nó không thành công)
  6. Tạo yêu cầu chụp với bề mặt từ các máy nghe nhạc phương tiện truyền thông và các hanlder tạo trước
  7. trên cấu hình thành công, hãy gọi mediaRecorder.start để bắt đầu ghi video.

Các lỗi stacktrace đầy đủ tôi nhận được là dưới đây:

12-01 09:58:23.981 8776-8776/com.jr.survailancedropboxcam W/CameraDevice-JV-0: Stream configuration failed due to: endConfigure:372: Camera 0: Unsupported set of inputs/outputs provided 
12-01 09:58:23.985 8776-8958/com.jr.survailancedropboxcam D/JJJ: on configured failed 
12-01 09:58:23.985 8776-8776/com.jr.survailancedropboxcam E/CameraCaptureSession: Session 0: Failed to create capture session; configuration failed 

Cảm ơn trước

+0

Mọi cập nhật về điều này? Tôi đang đấu tranh quá – MobileMon

+0

Không làm việc stil. bất cứ ai có bất cứ đề nghị? – jonney

+0

Tôi nhận ra một vấn đề cụ thể với mâm xôi pi. Nếu bạn nhìn vào các ghi chú phát hành cho những thứ android https://developer.android.com/things/preview/releases.html, dưới các vấn đề đã biết cho mâm xôi pi có: "Camera: Một CameraCaptureSession mới không thể được tạo ra với nhiều hơn một mục tiêu bề mặt đầu ra. Điều tôi tin là ngăn cản chúng ta hoàn thành chúng ta từ những gì chúng ta cần làm. Tôi nghĩ rằng giải pháp là để mua một bảng khác nhau – MobileMon

Trả lời

1

Với phiên bản mới nhất (AndroidThings DP 6), bạn có thể sử dụng các API Máy ảnh v2

https://android-developers.googleblog.com/2017/11/android-things-developer-preview-6.html

Điều này sẽ hoạt động: https://github.com/googlesamples/android-Camera2Basic

Bạn cần phải chắc chắn rằng bạn có lá cờ thiết lập là true trong manifest

<activity 

    ... 
    android:hardwareAccelerated="true"> 

mẫu Camera2Basic sử dụng API Camera2 và TextureView hiện đang làm việc trên cả hai thiết bị dựa NXP và Raspberry Pi (với hardwareAccelerated cờ được đặt thành đúng)

+0

Wow đó là tuyệt vời. Điều đó chỉ được phát hành ngày hôm qua là tốt. Tôi sẽ cung cấp cho nó một đi – jonney

+0

Tôi cập nhật mã của tôi và những thứ android xây dựng và nhận được một lỗi khác nhau ngay bây giờ. tôi sẽ sửa đổi bài đăng gốc của mình. Hiện tại không thành công khi tôi cố gắng createCaptureSession bằng cách gọi onConfiguredFailed trên gọi lại – jonney

+0

Vẫn không hoạt động đối với tôi.Bất kỳ cập nhật về điều này? – MobileMon

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