Ошибка открытия андроид камеры для потокового видео

Я пытаюсь записать видеопоток с 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);

Повеселись.

Другие вопросы по тегам