2017-11-30 9 views
7

안녕하세요, 저는 카메라 v2 API를 사용하여 라즈베리 파이 카메라 모듈을 사용하는 라즈베리 파이 3 장치를 사용하여 비디오를 녹화하려고합니다.안드로이드 비디오 레코더 : 표면을 얻지 못했습니다.

나는 이것을 Kotlin과 함께 안드로이드를 사용하여 개발 중이다.

내 비디오 녹화 코드는 다음과 같습니다.

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 

}

이 내 전략 카메라 ID의 카메라 관리자를 사용

  1. 가져 오기 목록입니다.
  2. 열기 목록에서 첫 번째 카메라 (
  3. 성공적으로 열 때 연결된 하나의 카메라가 필요한 모든 매개 변수를 mediaRecorder 만들기 핸들러 쓰레드에게
  4. 를 작성,이 (비디오 소스, 프레임 속도 등
  5. 표면 객체를 가져옵니다 비디오 녹화를 시작 mediaRecorder.start 전화, 미디어 플레이어에서 표면 이전에 성공적으로 구성에
  6. 을 만든 hanlder와 캡처 요청을 만들기
  7. (실패)를 mediaRecorder에서.

내가 얻을 전체 스택 트레이스 오류는 다음과 같습니다 :

사전에
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 

덕분에 당신은 카메라 V2 API를에게 사용할 수있는 최신 버전 (AndroidThings DP 6)와

+0

이 업데이트는 무엇입니까? 나도 고생 중이야 – MobileMon

+0

아직 일하지 않고있다. 누구든지 어떤 제안이 있습니까? – jonney

+0

나는 라즈베리 파이에 관련된 문제를 깨달았다. https://developer.android.com/things/preview/releases.html의 안드로이드 용 릴리스 노트를 보면 나무 딸기 파이에 대한 알려진 문제가 있습니다. "카메라 : 하나 이상의 카메라로 새로운 CameraCaptureSession을 만들 수 없습니다 목표 출력 표면. " 내가 믿는 것은 우리가해야 할 일에서 우리를 성취하지 못하게하는 것입니다. 솔루션은 다른 보드를 구입하는 것이라고 생각합니다. – MobileMon

답변

1

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

정상 작동해야합니다. https://github.com/googlesamples/android-Camera2Basic

당신은 당신이 플래그는 카메라 2 API를 사용하여 매니페스트

<activity 

    ... 
    android:hardwareAccelerated="true"> 

Camera2Basic 샘플에서 true로 설정되어 있는지 확인해야하고 TextureView 이제 hardwareAccelerated와 (모두 NXP와 라즈베리 파이 기반 장치에서 작동 플래그가 true로 설정 됨)

+0

와우 그게 좋습니다. 그것은 어제도 발표되었다. 내가 그것을 줄거야 – jonney

+0

나는 내 코드와 안드로이드 것들을 빌드하고 지금 다른 오류를 얻을 업데이 트되었습니다. 나는 원래 게시물을 수정합니다. 콜백에서 onConfiguredFailed를 호출하여 createCaptureSession을 만들려고하면 이제 실패합니다. – jonney

+0

여전히 저를 위해 작동하지 않습니다.이것에 대한 어떤 업데이 트? – MobileMon