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 era Camera Params, а также, что некоторые люди утверждают, требуется с некоторыми устройствами Samsung и HTC, хотя несколько разных статей ссылаются на разные строковые ключи:

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.

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

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

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

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

6 ответов


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

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

<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) - ... Первый параметр-это идентификатор камеры, которую вы открыли, в частности, фронтальной камеры.


хорошо, так что я, наконец, это работает.

проблема, похоже, определенно связана с настройками профиля и, в частности, частотой кадров.

на Nexus S, моем основном тестовом устройстве, если я зондирую камеру.Параметры, которые я получаю:

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

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

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

CamcorderProfile.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW

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

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

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

сейчас....

вот странность.

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

mediaRecorder.setVideoFrameRate(fpsInt);

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

В любом случае, переход на переднюю камеру.

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

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

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

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

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

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

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

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

Кажется, что Nexus S не ведет себя так, как он обещает в отношении установки FPS в соответствии с его камерой.getParameters().getSupportedPreviewFpsRange ()

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

кажется, что обещание setProfile фиксирует все проблемы в 2.Икс был не совсем прав.

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

вот почему на Android еще нет Facebook Poke и Twitter Vine???? : P

дерьмо Google, wtf с вашей камерой API?

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

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

или Nexus S и Nexus 7 просто уродливые аварии?


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


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

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

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

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


вы должны посмотреть здесь 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();
}

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