Ошибка открытия андроид камеры для потокового видео
Я пытаюсь записать видеопоток с Galaxy Tab на сервер. в соответствии с этим руководством я должен сделать что-то вроде этого:
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);
Может быть, из-за предустановленных форматов для задней камеры... Но все равно странно.
4 ответа
Я не вижу настройки выходного формата, поэтому попробуйте добавить к настройке рекордера:
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
У меня есть хак, расширение класса медиа-рекордера и удаление super.setVideoFrameRate(rate) решает проблему для меня.
Если вы все еще хотите использовать CamcorderProfile.QUALITY_HIGH
с фронтальной камерой вы можете использовать следующее:
CamcorderProfile camcorderProfile = CamcorderProfile.get(currentCameraId, CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(camcorderProfile);
где int currentCameraId
является Camera.CameraInfo.CAMERA_FACING_BACK
или же ...FRONT
Таким образом, профиль действительно зависит от камеры (для телефонов высокого класса он, кажется, работает нормально без различия, так как все они поддерживают 1080p к настоящему времени, но в противном случае телефоны низкого уровня могут выйти из строя)
И хотя это потоковое видео, так что установите -
recorder.setOutputFormat(8);
recorder.setOutputFile(socketFd);
Повеселись.