Samsung Galaxy S5 не будет записывать видео с низким разрешением/частотой кадров

У меня есть приложение, которое использует MediaRecorder для записи видео, и у меня проблема с записью в низком разрешении на Samsung Galaxy S5 SM-G900F (только на этом устройстве — запись с самым низким поддерживаемым разрешением видео работает нормально на всех остальных устройствах, с которыми я тестировал).

Сначала я опрашиваю параметры камеры (с помощью объекта Camera Parameters, поэтому mParameters.getSupportedVideoSizes(); и mParameters.getSupportedPreviewSizes();), чтобы проверить доступные разрешения записи и предварительного просмотра, и S5 возвращает следующие поддерживаемые размеры видео и предварительного просмотра соответственно:

Video Size List:        Preview Size List:
                        W = 1920,   H = 1080
W = 1920,   H = 1080    W = 1440,   H = 1080
W = 1440,   H = 1080    W = 1280,   H = 720
W = 1280,   H = 720     W = 1056,   H = 864
W = 800,    H = 450     W = 960,    H = 720
W = 800,    H = 480     W = 800,    H = 480
W = 720,    H = 480     W = 720,    H = 480
W = 640,    H = 480     W = 640,    H = 480
W = 352,    H = 288     W = 352,    H = 288
W = 320,    H = 240     W = 320,    H = 240
W = 176,    H = 144     W = 176,    H = 144

Диапазон возвращаемых поддерживаемых частот кадров составляет 10 000–30 000, поэтому я выбираю 10 000 для самого низкого разрешения записи (10 кадров в секунду).

Я выбираю самое низкое разрешение, предлагаемое S5, то есть 176 (ш) x 144 (в) (чтобы размер видеофайла был небольшим), а затем делаю следующие настройки MediaRecorder...

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoFrameRate(10);
mMediaRecorder.setVideoSize(176, 144);
mMediaRecorder.setVideoEncodingBitRate(256000);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());   // Preview size is also set to 176 x 144
mMediaRecorder.setOutputFile(mVideoFilename);

...перед тем, как вызвать mMediaRecorder.prepare();, а затем mMediaRecorder.start();.

Этот код отлично работает на «Sony XPeria», «HTC One», «HTC One V», «Samsung Galaxy S3», «HTC Explorer» и ряде других устройств, работающих под управлением различных версий Android от Gingerbread до KitKat (я не могу получить отдельный список размеров видео на Gingerbread).

Только Samsung Galaxy S5 имеет проблемы с записью с разрешением 176 x 144. При вызове mMediaRecorder.start(); запись не начинается с "java.lang.RuntimeException: start failed". исключение.

Я не могу понять, в чем проблема. Все остальные разрешения записи (с повышенными настройками EncodingBitRate) работают нормально — только 176 x 144 не работает на S5.

Кто-нибудь еще видел эту проблему? Кто-нибудь знает, есть ли проблема с S5, из-за которой запись не работает должным образом при самом низком поддерживаемом разрешении видео? Или есть какой-то «трюк» Samsung, который я упускаю?

Любая помощь или идеи будут высоко оценены - я рву на себе волосы из-за этого!


person DDSports    schedule 16.02.2015    source источник
comment
следующие поддерживаемые размеры видео и предварительного просмотра. Что вы использовали для определения поддерживаемых размеров видео?   -  person CommonsWare    schedule 17.02.2015
comment
@CommonsWare, я использую параметры камеры с getSupportedVideoSizes() и getSupportedPreviewSizes(). Я обновил свой вопрос.   -  person DDSports    schedule 17.02.2015
comment
Хорошо, похоже, что ни у кого больше не было такой же проблемы (или, по крайней мере, никогда не удавалось ее решить). Я только что купил Galaxy S5 - когда (если?) я узнаю, что делает этот телефон, я опубликую свои выводы.   -  person DDSports    schedule 23.02.2015


Ответы (2)


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

S5 возвращает (10000, 30000) из getSupportedPreviewFpsRange(), что, согласно документации, является диапазоном частоты кадров видео, поддерживаемой устройством, что означает, что поддерживается любая частота кадров в этом диапазоне. (или устройство попытается максимально приблизиться к скорости, указанной в mMediaRecorder.setVideoFrameRate()).

S5 думает иначе! Установка частоты кадров 10, как я делаю, останавливает MediaRecorder от начала записи видео со знакомым исключением MediaRecorder(22664): start failed: -19.

При вызове mMediaRecorder.setVideoFrameRate(10) я получаю исключение CameraSource(262): Requested frame rate (10) is not supported: 15,24,30, подразумевающее, что поддерживаются только частоты кадров 15, 24 и 30. Я получаю такое же исключение, если использую mMediaRecorder.setVideoFrameRate(20), но если я использую mMediaRecorder.setVideoFrameRate(30), все работает нормально.

Я также получаю исключение OMX-VENC-720p(262): Invalid entry returned from get_supported_profile_level 2130706433, 65536, которое, похоже, связано с настройками MediaRecorder, но никто не может догадаться, что оно означает на самом деле.

Я понятия не имею, как я должен знать, что 15 кадров в секунду, 24 кадра в секунду и 30 кадров в секунду являются единственными поддерживаемыми частотами кадров.

Если кто-нибудь еще знает, как я могу узнать это, не спотыкаясь об исключение CameraSource(262): Requested frame rate (X) is not supported: 15,24,30, я хотел бы знать, что это такое.

Метод, который я использую, доказал свою эффективность на десятках типов устройств, включая Samsung S3, поэтому эта проблема, похоже, специфична для S5. Поэтому мне приходится принудительно устанавливать частоту кадров, специфичную для S5, сначала выясняя, на каком телефоне работает приложение, что не идеально — спасибо за это Samsung!

Наконец, кто-нибудь знает, как/где я могу сообщить об этой ошибке в Samsung?

person DDSports    schedule 27.02.2015
comment
Действительно поражен тем, что никто другой во всем сообществе SO не столкнулся с этой проблемой. Неужели я единственный разработчик, который пытается запустить некачественную запись на S5? - person DDSports; 17.03.2015

Этот пост здесь (Android не может записывать видео с фронтальной камерой, запуск MediaRecorder не удался: -19) проливает больше света на эту конкретную проблему, и все это, кажется, указывает на то, что API камеры немного - ну - нафф! После «решения» этой проблемы с S5 я обнаружил точно такую ​​же проблему с Sony XPeria Z. Несмотря на то, что возвращает Camera.getParameters().getSupportedPreviewFpsRange(), эти телефоны на самом деле поддерживают только 15/24/30 кадров в секунду. (S5) и 15/30 кадров в секунду (Xperia Z) для реальных видеозаписей MediaRecorder через mMediaRecorder.setVideoFrameRate().

Возможно, подсказкой здесь является слово «Предварительный просмотр» в имени метода getSupportedPreviewFpsRange(), а возвращаемые значения применяются ТОЛЬКО к поверхности предварительного просмотра. Возможно, разработчики Samsung и Sony для этих телефонов слишком буквально восприняли это название метода и возвращают только значения частоты кадров в режиме предварительного просмотра, оставляя разработчику возможность угадывать частоту кадров видео; Я узнал на собственном горьком опыте, что, похоже, вообще нет способа узнать, какие значения FPS поддерживаются для записи видео MediaRecorder.

Большинство телефонов, кажется, заменяют setVideoFrameRate() значением «ОК», если предоставленное значение не поддерживается, тем самым защищая разработчика от необходимости угадывать поддерживаемые скорости. S5 и Z (и, возможно, другие) просто слепо принимают любое значение, установленное в setVideoFrameRate(), а затем услужливо завершают работу с ошибкой -19, если выбранное вами значение не поддерживается. Как отмечает @Madhava Jay в своем посте: «Я не вижу способа определить [частоту кадров], не просто угадывая».

Может случиться так, что камера может поддерживать диапазон частот кадров, но реализация MediaRecorder от Sony и Samsung не может принять эти частоты.

Лучшие вещи Android!

person DDSports    schedule 23.03.2015