Подтвердить что ты не робот

Android не может записывать видео с передней лицевой камеры, запуск MediaRecorder: -19

У меня есть два разных базовых кода с той же проблемой.

Первый - это код, скопированный прямо с сайта developer.android.com: http://developer.android.com/guide/topics/media/camera.html#custom-camera

Второй - это код:

http://android-er.blogspot.com.au/2011/10/simple-exercise-of-video-capture-using.html

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

Это происходит на следующих устройствах:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

  • Nexus 7 4.2.1 (он имеет только фронтальную камеру)

Я пробовал то, что выглядит как 2.2 Param Camera Camera, а некоторые, как утверждают некоторые люди, требуются с некоторыми устройствами Samsung и HTC, хотя несколько разных статей ссылаются на разные клавиши String:

c = Camera.open(frontFacingCameraID); // attempt to get a Camera instance
Camera.Parameters params = c.getParameters();
params.set("cam-mode", 1);
params.set("cam_mode", 1);
params.set("camera-id", 1);
c.setParameters(params);

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

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

Вещь, которая заставляет меня думать, что ничего плохого в большей части кода заключается в том, что обычная камера работает нормально. Поэтому я предполагаю, что это связано с методом prepareVideoRecorder()/prepareMediaRecorder(), который устанавливает Media Recorder.

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

Я должен сказать, что Android Camera и MediaRecorder API сосут. По сравнению с iOS это немного беспорядок, не говоря уже о некоторых страшных проблемах несовместимости параметров пара и разных разрешениях на фрагментированном ландшафте устройств.

Предполагая, что я могу заставить его работать на своих JB-устройствах, знает ли кто-нибудь из опыта, если большинство из этих проблем разрешено с помощью API 15 ICS?

Я бы предпочел не поддерживать API 10 Gingerbread, если его будет слишком сложно поддерживать.

4b9b3361

Ответ 1

Хорошо, поэтому я, наконец, получил его.

Вопрос, по-видимому, определенно относится к настройкам профиля и, в частности, к частоте кадров.

На Nexus S, моем основном тестовом устройстве, если я исследую Camera.Parameters, я получаю:

Для задней камеры:
15 FPS до 30 FPS, достаточно справедливо.

Для фронтальной камеры:
7.5 FPS до 30 FPS, хорошо.

Затем я проверяю Профили, которые я пытаюсь использовать,:

CamcorderProfile.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW

QUALITY_LOW:
audioBitRate: 12200
audioChannels: 1
audioCodec: AMR_NB audioSampleRate: 8000
продолжительность: 30
fileFormat: THREE_GPP
качество: 0
videoBitRate: 256000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 176
videoFrameHeight: 144

QUALITY_HIGH:
audioBitRate: 24000
audioChannels: 1
audioCodec: AAC
audioSampleRate: 16000
продолжительность: 60
fileFormat: MPEG_4
качество: 1
videoBitRate: 3000000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 720
videoFrameHeight: 480

Ясно, что профиль высокого качества предназначен для задней камеры, поскольку передняя сторона имеет только 640x480. Но они оба указывают 30 FPS.

Теперь....

Вот и странность.

Если я установил ЛЮБУЮ частоту кадров для камеры заднего вида, независимо от того, какой профиль он сбой с ошибкой: -19

mediaRecorder.setVideoFrameRate(fpsInt);

Это не большая проблема. Мне не нужна задняя камера, но это странно, учитывая, что профили дефолтны до 30, а Params говорят, что они принимают 15-30. Но никакая внутренняя ценность iv не пыталась работать. Если я опускаю setVideoFrameRate, это будет прекрасно.

Во всяком случае, перемещаясь на переднюю облицовочную камеру.

Итак, если я использую профиль QUALITY_LOW И установите частоту кадров до 15 или ниже, она волшебным образом работает.

mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoFrameRate(15);

Infact любое значение, 1 - 15 работ. Что кажется странным.

Итак, я понимаю, что, возможно, я могу найти разрешение и выбрать подходящие разрешения для большинства камер, хотя им также довольно уверенно почти все фронтальные камеры с минимальным VGA 640x480.

Но как насчет частоты кадров? В случае с Nexus S я не вижу никакого способа определить значение 15 или ниже, не догадываясь? Должен ли я стремиться всегда использовать LOWEST частоту кадров, которая возвращается камерой?

Я взглянул на Galaxy Nexus и у него 3 диапазона частоты кадров, первый - 15-15, а второй - 15-30. Его профиль низкого качества похож на более высокое разрешение. Если я использую низкий профиль на Galaxy Nexus, он работает нормально.

С Nexus 7 я не могу исследовать CamcorderProfile, я все равно получаю нулевые указатели, что странно. Он говорит, что поддерживает 4 FPS - 60 FPS. Если я выберу QUALITY_LOW, который, как вы думаете, должен работать, он сработает, и я не могу найти частоту кадров, с которой она будет работать. Хотя ошибка относится к setProfile, поэтому я думаю, что проблема связана со встроенным профилем. Разумеется, точка Android API заключается в том, что она совместима, это устройство корабля с флагом, а камера FF существует для видеоконференций, это не так.

Итак, хотя я работаю над двумя устройствами, использующими индивидуальные пользовательские настройки для каждого, я не вижу четкого способа заставить его работать на нескольких устройствах с помощью кода.

Похоже, что Nexus S не ведет себя так, как он promises к настройке FPS в соответствии с его Camera.getParameters(). getSupportedPreviewFpsRange()

Я все счастлив за то, что он использовал настройки Auto FPS, но, видимо, это не так с камерой FF, так что я должен делать? Я должен явно установить FPS на Nexus S и в этом случае на что-нибудь от 1 до 15 FPS, несмотря на то, что камера сообщила мне, что она обрабатывает 7,5 - 30 FPS.

Похоже, что обещание setProfile, фиксирующего все проблемы в 2.x, не было полностью истинным.

Я могу понять, если вы пишете приложение камеры для конкретного ПЗУ, вы просто настраиваете его на это конкретное оборудование, которое может объяснить, почему у людей, как правило, всегда есть багги-приложения для камер на пользовательских ромах. НО... как работают загружаемые приложения для записи видео? Являются ли они обычными для каждого устройства?

Именно поэтому theres нет Facebook Poke и Twitter Vine на Android еще????: P

Shit Google, wtf с вашим API-интерфейсом камеры?

Означает ли ANYONE способ наилучшей практики определения разрешения и частоты кадров для всех совместимых с API-интерфейсом API 15+?

Возможно ли это, или я собираюсь писать собственный код на каждом тестируемом устройстве, а затем просто бросать кости на остальных?

Или это Nexus S и Nexus 7 - просто уродские несчастные случаи?

Ответ 2

Сегодня я тоже боролся с этой проблемой.

Сначала убедитесь, что ваши разрешения настроены правильно. В частности, для записи видео вам нужно:

<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.microphone"/>

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Во-вторых, и это сложная часть, эта строка из учебника не работает с фронтальной камерой!

mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

Эта подпись для CamcorderProfile.get() по умолчанию относится к профилю для обратной камеры:

Возвращает профиль видеокамеры для первой обратной камеры на устройстве с заданным уровнем качества. Если  устройство не имеет обратную камеру, это возвращает значение null.

Вместо этого используйте http://developer.android.com/reference/android/media/CamcorderProfile.html#get(int,%20int). Первый параметр - это идентификатор камеры, которую вы открыли, в частности, фронтальную камеру.

Ответ 3

попробуйте с QUALITY_LOW, потому что QUALITY_HIGH не поддерживается в передней камере.

Ответ 4

Я уже несколько часов борюсь с ошибкой -19. Ответ для меня - в ответе Мадхавы и, в частности, mCamera.unlock();

то есть. В сочетании с первым ответом о заданном профиле этот код

        Camera cam = Camera.open(frontCamID);
        cam.unlock();
        recorder.setCamera(cam);

Позволяет мне выбирать и записывать с передней камеры.

Ответ 5

вы должны посмотреть здесь http://developer.android.com/guide/topics/media/camera.html#capture-video

порядок команд, перечисленных там, очень важен.

я использовал второй пример кода здесь Как записать видеозапись на Android?

и изменили начальные функции записи

protected void startRecording() throws IOException 
{
    mrec = new MediaRecorder();  // Works well

    mCamera.setPreviewDisplay(surfaceHolder);
    mCamera.startPreview();

    mCamera.unlock();
    mrec.setCamera(mCamera);

    mrec.setPreviewDisplay(surfaceHolder.getSurface());
    mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mrec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 

    mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    mrec.setOutputFile("/sdcard/zzzz.3gp");
    mrec.setPreviewDisplay(surfaceHolder.getSurface());

    mrec.prepare();
    mrec.start();
}

Ответ 6

У меня была та же проблема. После того, как я исправился, в чем была причина, я нашел только одного виновника. Разрешение 720 × 480, которое по умолчанию используется в камере. Я изменил его на все, и да, я могу хорошо его записать...