2015-11-27 3 views
1

Я реализую видеозапись с камерой Android. Я использую MediaCodec для кодирования кадров из обратного вызова onPreviewFrame().Запись замедленного видео с использованием MediaCodec на Android

Теперь я хочу записать замедленное видео. Как установить частоту захвата камеры или частоту кадров? Где я могу установить эти параметры, например, если я хочу записывать со скоростью 120 кадров в секунду и играть со скоростью 30 кадров в секунду?

Ниже то, что я исследовал:

Я записал видео замедленного с MOTO X (имеющее встроенной функцией записи видео замедленной) и используется FFmpeg проверить его кадры в секунду. Я обнаружил, что он записывается со скоростью 110 кадров в секунду (около 120 кадров в секунду) и воспроизведения со скоростью 30 кадров в секунду. Это доказывает, что он обеспечивает аппаратную поддержку для записи при высоких кадрах в секунду.

Однако, когда я использую getSupportedPreviewFpsRange, чтобы проверить его поддерживаемый диапазон кадров в секунду, есть только четыре набора поддерживаемых кадров в секунду в диапазоне без одного больше, чем 30 кадров в секунду:

min_fps: 15,0, max_fps15.0

min_fps : 15,0, max_fps20.0

min_fps: 15,0, max_fps30.0

min_fps: 24,0, max_fps30.0

Я использовал setPreviewFpsRange, чтобы установить fps выше, но он остается не более 30 кадров в секунду. Я также попытался установить KEY_FRAME_RATE и KEY_CAPTURE_RATE MediaFormat. Но это все еще не работает.

Я также искал solution, установив CamcorderProfile или setVideoFrameRate с MediaRecorder. Но я работаю с MediaCodec.

Может ли кто-нибудь помочь мне с этой проблемой?

ответ

0

для медленной записи.

mMediaRecorder.setVideoFrameRate (QUALITY_HIGH_SPEED_LOW);

для высокой скорости запись.

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH); 
+0

Это MediaRecorder, а не MediaCodec. – fadden

+0

Спасибо за ваш ответ. Вы действительно пытались использовать это для записи замедленного видео? Я попытался использовать MediaRecorder. Но это все еще не сработало. –

+0

Здравствуйте, спасибо за ответ, знаете ли вы приложение для Android-андроид (стороннего производителя), которое уже фиксирует скорость 120 кадров в секунду? Спасибо –

2

Захват видеокадров с более высокой скоростью не решает проблему. Если вы снимаете со скоростью 120 кадров в секунду и проигрываете со скоростью 120 кадров в секунду, вы получаете высокоскоростное воспроизведение видео с обычной скоростью.

Что вы хотите сделать, это изменить временные метки. MediaCodec поддерживает видео VFR (переменная частота кадров). Вместо того, чтобы тратить 1 секунду на 60 кадров, которые будут воспроизводиться со скоростью 30 кадров в секунду, вы записываете 30 кадров в секунду, которые будут воспроизводиться со скоростью 15 кадров в секунду.

Поток H.264, созданный с помощью AVC-кодировщика MediaCodec, не содержит временных меток. Вы указываете метку времени для каждого фрейма при подаче вывода в MediaMuxer, генерируя файл .mp4. Большинство примеров кода просто берут метку времени, полученную от камеры, и передают ее через MediaCodec в MediaMuxer без изменений, но вы можете настроить ее. Единственное, что вы не можете сделать, это позволить временной метке вернуться назад.

Если вы посмотрите на то, как фильм «восемь прямоугольников» равен generated in Grafika, вы можете видеть, что он воспроизводит выходную метку времени, чтобы сделать воспроизведение фильма медленнее или быстрее.

Еще один простой способ выполнить одно и то же без изменения частоты кадров - это удвоить рамки. Для части замедленного воспроизведения просто передайте один и тот же кадр в кодировщик несколько раз. Опять же, вам нужно настроить временные метки представления для каждого кадра, но ваше видео будет иметь постоянный 30 кадров в секунду. (Было бы лучше, если бы вы интерполировали фреймы, но это намного сложнее.)

+0

Спасибо за ваш ответ! Но я думаю, что видео, воспроизводимое со скоростью 15 кадров в секунду, может быть медленным. Если видео, снятое со скоростью 60 кадров в секунду или более, и воспроизведение со скоростью 30 кадров в секунду, будет лучшим выбором. Мне действительно интересно, есть ли способ по-настоящему записать видео с более высокой частотой кадров? –

+0

@ZebinXu: Это определяется источником видео (то есть камерой), а не MediaCodec. Чтобы получить замедление 30 кадров в секунду, вам нужно сказать, что камера удваивает скорость захвата кадров, одновременно изменяя временные метки, поданные в MediaMuxer. Единственный интерес, который MediaCodec имеет в тайм-аутах фрейма, заключается в попытке ограничить скорость потока потока конкретным значением ... если вы говорите, что хотите 8 Мбит/с, он должен уметь определять, сколько кадров появляется за секунду, и может используйте временные метки рамки, чтобы понять это. – fadden

+0

Да, спасибо. Но я хочу сказать, почему я не могу захватить видео высокой скорости с помощью API или другого кода с устройства с поддержкой высокоскоростного захвата оборудования? –