Ответ 1
У меня нет большого опыта работы с MediaRecorder, но я читал некоторые связанные темы, и я постараюсь ответить на ваши вопросы:
1, 3 и 4) CamcorderProfile устанавливает не только разрешение, но и устанавливает формат вывода и кодировщики (как для аудио, так и для видео). Вы получаете ошибку, потому что вам, вероятно, нужно использовать setOutputFormat
перед вызовом setVideoSize
, и вам придется вызывать setVideoEncoder
и setAudioEncoder
после этого, если вы не хотите использовать CamcorderProfile. [В соответствии с этим answer]
2) Опять же, CamcorderProfile также устанавливает свойства звука (такие как Codec, BitRate, SampleRate,...), поэтому вам нужно установить источник звука перед его вызовом, поэтому приложение разбилось. Если вы не хотите записывать аудио, попробуйте следующий код: (я не тестировал его, поэтому я действительно не знаю, работает ли он, но я уверен, что он это делает)
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoSize(WIDTH, HEIGHT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
recorder.setOutputFile(PATH);
recorder.setPreviewDisplay(SURFACE);
recorder.prepare();
recorder.start();
Также имейте в виду, что если вы не хотите использовать CamcorderProfile (это означает, что вы хотите записывать только аудио или видео), вам может потребоваться установить дополнительные параметры, чтобы убедиться, что у вас есть качество, которое вы хотите. Взгляните на следующий пример кода:
recorder = new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
// Following code does the same as getting a CamcorderProfile (but customizable)
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// Video Settings
recorder.setVideoSize(WIDTH, HEIGHT);
recorder.setVideoFrameRate(FRAME_RATE);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
recorder.setVideoEncodingBitRate(VIDEO_BITRATE);
// Audio Settings
recorder.setAudioChannels(AUDIO_CHANNELS);
recorder.setAudioSamplingRate(SAMPLE_RATE);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setAudioEncodingBitRate(AUDIO_BITRATE);
// Customizable Settings such as:
// recorder.setOutputFile(PATH);
// recorder.setPreviewDisplay(SURFACE);
// etc...
// Prepare and use the MediaRecorder
recorder.prepare();
recorder.start();
...
recorder.stop();
recorder.reset();
recorder.release();
Надеюсь, это поможет вам.