Ниже приведена структура моего рабочего кода для записи видео и аудио:
Вопросы:
1) Почему нужен CamcorderProfile
? setProfile(...)
, как представляется, устанавливает размеры независимо от QUALITY_HIGH, но позже я устанавливаю размеры, которые я хочу, с помощью setVideoSize(...)
, который переопределяет это. Однако, когда я удаляю две строки CamcorderProfile, приложение падает с setVideoSize(...)
с помощью LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2
.
2) Как мне не записывать аудио? В документации указано, что если setAudioSource(...)
не вызывается, звуковой дорожки не будет. Однако, когда я удаляю эту строку, приложение падает с setProfile(...)
с помощью LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first
.
3) Если я удалю как строки CamcorderProfile, так и строку setAudioSource(...)
, он сработает, как в 1).
4) Я также попытался добавить строку
recorder.setOutputFormat(OutputFormat.DEFAULT);
вместо строк CamcorderProfile. Но теперь он падает с perpare()
. Если setAudioSource(...)
вызывается, то LogCat: E/MediaRecorder(20737): audio source is set, but audio encoder is not set
, если он не называется LogCat: E/MediaRecorder(20544): video source is set, but video encoder is not set
Я просмотрел весь интернет, и я не могу найти хороший пример правильного способа настройки MediaRecorder. Здесь подразумевается, что после API 8 вы должны использовать класс CamcorderProfile, но мне кажется, что он вызывает проблемы.
Любая помощь будет замечательной! Спасибо!
Код (который работает, когда он выполняется ниже):
recorder = new MediaRecorder();
recorder.setCamera(<<camera>>);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(profile);
recorder.setOutputFile(<<Path String>>);
recorder.setVideoSize(<<Width>>, <<Height>>);
recorder.setPreviewDisplay(<<Surface>>);
recorder.setOrientationHint(0);
recorder.setMaxDuration(10000);
recorder.setOnInfoListener(this);
try
{
recorder.prepare();
recorder.start();
} catch ...