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 просто уродливые аварии?
Я уже несколько часов борюсь с ошибкой -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, которое по умолчанию используется в камере. Я изменил его на что угодно, и да, я могу записать его хорошо