У меня есть приложение, которое использует 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, который я упускаю?
Любая помощь или идеи будут высоко оценены - я рву на себе волосы из-за этого!