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