2017-11-30 114 views
7

Merhaba Kameraya bağlı Raspberry Pi kamera modülünü kullanan Raspberry Pi 3 aygıtını kullanarak video kaydetmek için kamera v2 API'sini kullanmaya çalışıyorum.Android video kaydedici: yüzey alınamadı

Bunu Android Things ile Kotlin kullanarak geliştiriyorum.

Video kayıt kodumun nasıl göründüğü aşağıda açıklanmıştır.

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 

}

Bu benim strateji Kamera Kimliği kamera yöneticisini kullanarak

  1. alın listesidir.
  2. Açık listeden birinci kamera (
  3. başarıyla açıldığında bağlı tek bir kamera gerekli tüm parametreleri ile mediaRecorder oluşturma işleyici konuyu
  4. oluşturmak vardır (video kaynağı, kare hızı vb
  5. yüzey nesnesini alın Video kaydını başlatmak için mediaRecorder.start diyoruz, medya oynatıcı yüzeye ve daha önce başarıyla yapılandırıldı üzerinde
  6. oluşturulan hanlder ile yakalama isteği oluşturun
  7. (başarısız) mediaRecorder den.

i olsun tam StackTrace hata aşağıdaki gibidir:

önceden
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 

teşekkürler Kamera v2 API'leri kullanabilirsiniz son sürümü (AndroidThings DP 6) ile

+0

Bu konuda herhangi bir güncelleme var mı? Ben de mücadele ediyorum – MobileMon

+0

Çalışmıyor. herhangi birinin önerisi varmı? – jonney

+0

Ahududu pi'ye özgü bir konu olduğunu fark ettim. Ahududu pi için bilinen sorunlar altında, https://developer.android.com/things/preview/releases.html android şeyler için sürüm notlarına bakarsanız: "Kamera: Yeni bir CameraCaptureSession birden fazla ile oluşturulamaz." hedef çıkış yüzeyi. Benim inanıyorum ki, yapmamız gereken şeyden bizi elde etmemizi engelliyor. Bence çözüm farklı bir tahta satın almaktır. – MobileMon

cevap

1

https://android-developers.googleblog.com/2017/11/android-things-developer-preview-6.html Bu işlem şu şekilde olmalıdır: https://github.com/googlesamples/android-Camera2Basic

Sen bayrak Camera2 API kullanarak bildirim

<activity 

    ... 
    android:hardwareAccelerated="true"> 

Camera2Basic örnek true olarak ayarlanmış olduğundan emin olun gerekiyor ve TextureView şimdi hardwareAccelerated ile (hem NXP ve Ahududu Pi tabanlı cihazlarda çalışır flag true olarak ayarlandı)

+0

Wow, bu harika. Bu sadece dün serbest bırakıldı. Ben bir – jonney

+0

go vereceğim Kodumu güncelledim ve android şeyler kurmak ve şimdi farklı bir hata olsun. Orijinal yazımı değiştireceğim. Geri çağırma – jonney

+0

'da onConfiguredFailed'i arayarakCaptureSession oluşturmaya çalıştığımda artık başarısız oluyor Yine de benim için çalışmıyor.herhangi bir güncelleme var mı_ – MobileMon