2012-02-01 3 views
0

Я пытаюсь записать поток видео с моего Galaxy Tab на сервер. согласно this manual я должен сделать что-то вроде этого:Ошибка открытия камеры андроида для потокового видео

 frontCamera = getFrontCamera(); 
     if((socket!= null)&&(frontCamera!=null)) 
     { 
      try { 
       frontCamera.setPreviewDisplay(cameraPreview.getHolder()); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       Log.e("","",e1); 

      } 
      frontCamera.startPreview(); 
      recorder = new MediaRecorder(); 
      frontCamera.unlock(); 
      recorder.setCamera(frontCamera); 
      recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
      recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
      recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 
      pfd = ParcelFileDescriptor.fromSocket(socket); 
      recorder.setOutputFile(pfd.getFileDescriptor()); 
      recorder.setPreviewDisplay(cameraPreview.getHolder().getSurface()); 
      try { 
       recorder.prepare(); 
       recorder.start(); 
} catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       Log.e("","",e); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       Log.e("","",e); 
      } 

но все терпит неудачу на этапе recorder.start(); с странной ошибкой

02-01 19:03:39.265: E/MediaRecorder(11922): start failed: -19 

что это значит и что мне нужно сделать, чтобы начать рекордер?

UPD: Проблема возникает из-за моего метода getFrontCamera. когда я заменяю его на camera.open(), все работает правильно.

protected Camera getFrontCamera() 
{ 
    Camera.CameraInfo inf = new Camera.CameraInfo(); 
    for(int i = 0; i< Camera.getNumberOfCameras(); i++) 
    { 

     Camera.getCameraInfo(i, inf); 
     if(inf.facing==Camera.CameraInfo.CAMERA_FACING_FRONT) 
     { 
      return Camera.open(i); 
     } 
    } 
    return null; 
} 

UPD2 - да, явная настройка формата и кодеров решена проблема -

 recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 

Может быть, потому что предварительно строить форматы для задней камеры ... Но странно в любом случае.

ответ

0

Я не вижу настройки выходного формата, поэтому попробуйте добавить к записанному настройки:

recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
+0

Это делается с помощью recorder.setProfile (...) as fa как я понимаю. – Raiv

+0

О, я отследил до этого -19 значение NO_INIT и, скорее всего, вернулся из setupCameraSource, когда (* cameraSource) -> initCheck() не в порядке. – pmod

+0

У меня была такая же проблема с таинственной ошибкой -19 на Nexus S на IC 4.0.4. Итак, для меня это явно указывало, что частота кадров составляет <15 FPS и размер видео до 320x240. – nifo

0

Есть look

И хотя это потоковое видео, так что набор -

recorder.setOutputFormat(8); 
recorder.setOutputFile(socketFd); 

Удачи.

0

У меня есть взломать здесь, продлевая класс медиа-рекордера и удаляя super.setVideoFrameRate (курс), решает проблему для меня.

+1

То же самое, что и не называть его. Не полезно. –

0

Если вы все еще хотите использовать CamcorderProfile.QUALITY_HIGH с передней камерой, вы можете использовать следующее:

CamcorderProfile camcorderProfile = CamcorderProfile.get(currentCameraId, CamcorderProfile.QUALITY_HIGH); 
recorder.setProfile(camcorderProfile); 

где int currentCameraId является Camera.CameraInfo.CAMERA_FACING_BACK или ...FRONT

Так что профиль действительно зависит от камеры (для телефоны высокого класса, похоже, работают отлично без различия, поскольку все они поддерживают 1080p к настоящему времени, но телефоны младшего класса могут сбой в противном случае)