Android: Как инициализировать MediaRecorder без действительной поверхности для предварительного просмотра видео?

Я создаю приложение для камеры, где видео постоянно захватываются и сохраняются на SD-карте. Видеоролики короткие (несколько минут), а их длина задана с помощью setMaxDuration().

Весь процесс отлично работает, а основной вид деятельности - на переднем плане. Но, когда я перехожу к другому действию (например, настройкам), видеозапись работает в фоновом режиме только до достижения максимальной продолжительности. Файл сохраняется, но новая последовательность не может быть запущена потому что prepare() терпит неудачу, по-видимому, потому что setPreviewDisplay() не любит иметь подходящую поверхность для прикрепления.

Я попытался использовать фиктивную поверхность, фиктивный SurfaceHolder, lockCanvas() и различные другие трюки, но ничего не работает. Есть ли способ инициализировать MediaRecorder без действительной поверхности?

Ответ 1

К сожалению, для записи видео (Android SDK 1,6 - 2,2) вам необходимо предварительно просмотреть действительную поверхность. Для удаления этого ограничения требуется запрос расширения http://code.google.com/p/android/issues/detail?id=9570

Ответ 3

Я думаю, что приложение IP Webcam может это сделать, хотя я не знаю, как это сделать. Может быть, он работает только при >= 2.3. Я не уверен, в какой версии я видел, как он работает. Я задал вопрос, как он работает.

Ответ 4

Вам просто нужно создать поверхность с MediaCodec, добавив следующую строку:

Surface  mySurface = MediaCodec.createPersistentInputSurface();
mMediaRecorder.setPreviewDisplay(mySurface);

...

mMediaRecorder.prepare();

Ответ 5

Выполняете ли вы обратные вызовы Surface?

Зачем вам нужно инициализировать MediaRecorder без допустимой поверхности?

Вы должны записывать, даже когда вы покидаете основное мероприятие? или останавливается ли запись до того, как порождается другая ацитивность?