Подтвердить что ты не робот

Android захват замедленного видео

Как я могу захватить медленное видео в моем приложении?

Я попытался использовать

 mMediaRecorder.setVideoFrameRate(100);

но приложение сработает, если я установил значение 20 или более с IllegalStateException.

Я много исследовал.Нормальное видео составляет от 24 до 30 кадров в секунду. Чтобы увидеть видео с замедленным движением, нам нужно захватить 100-120 кадров в секунду, но устройство не позволяет этого. Но я вижу, что камера по умолчанию на моем устройстве имеет опцию медленного движения. Также несколько приложений в магазине воспроизведения позволяют создавать видео с замедленным движением. Я также попытался установить более высокий setCaptureRate(), но при этом также снимается видео в обычном режиме. В нескольких местах упоминается, что фильм с замедленным движением может быть выполнен с помощью OpenCV/JavaCV, но я не смог понять, как использовать эти библиотеки для захвата замедленного видео в android?

4b9b3361

Ответ 1

Из предоставленного вами источника (CamcorderProfile) все, что вам нужно сделать, это УВЕЛИЧЕНИЕ изображений в секунду:

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

или

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);

Итак, если вы берете 100 изображений в секунду и показываете 25 кадров в секунду, эта записанная секунда занимает 4 секунды до показанных

Пожалуйста, прочитайте документацию по классу, который вы используете:

public static final int QUALITY_HIGH_SPEED_LOW

Высокий уровень скорости ( >= 100 кадров в секунду), соответствующий наименьшему доступному разрешению.

Для всех высокоскоростных профилей, определенных ниже ((от QUALITY_HIGH_SPEED_LOW до QUALITY_HIGH_SPEED_2160P), они аналогичны обычным профилям записи, с только более высокой частотой кадров вывода и скоростью передачи данных. Поэтому установка этих профилей с помощью setProfile (CamcorderProfile) без указания каких-либо другие параметры кодирования будут генерировать видео высокой скорости, а не видео с замедленным воспроизведением, которые имеют разные скорости кадров и воспроизведения (воспроизведения). Для записи замедленных видеороликов приложение должно установить скорость видеозаписи (воспроизведения) и скорость передачи данных соответствующим образом через setVideoFrameRate (int ) и setVideoEncodingBitRate (int), основанный на коэффициенте замедленного движения.Если приложение намерено делать видеозапись с кодировщиком MediaCodec, оно должно установить каждое отдельное поле MediaFormat аналогично в соответствии с данным видеокамером.

Ответ 2

Попробуйте этот код. Это поможет...

myCamera = getCameraInstance();
mediaRecorder = new MediaRecorder();
myCamera.unlock();
mediaRecorder.setCamera(myCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());

Ответ 3

Что сработало для меня, так это повысить скорость захвата mMediaRecorder, например:

mMediaRecorder.setVideoFrameRate(profile.videoFrameRate / 2);
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate / 2);
mMediaRecorder.setCaptureRate(profile.videoFrameRate);

Где profile есть набор CamcorderProfile с QUALITY_HIGH (у меня не может быть больше, так как я использую LG G2, API 19).

Здесь в моем случае profile.videoFrameRate равно 30.

Подробнее о setCaptureRate в официальной документации:

Установите скорость захвата видео. Это можно использовать для установки другой скорости захвата видеокадров, чем скорость записи записанного видео. Этот метод также устанавливает режим записи на временной интервал. Во время видеозаписи времени записывается только видео. Параметры, связанные с аудио, игнорируются при запуске сеанса записи по времени, если приложение устанавливает их.

Результат видеозаписи в два раза длиннее начального захвата. Однако установка скорости захвата отключает звук. В моем случае скорость max fps составляет 30 кадров в секунду, а затем она воспроизводится со скоростью 15 кадров в секунду.

Надеюсь, что это поможет.

Ответ 4

Хотя я не могу захватить плавное замедленное видео без рывков, но я могу конвертировать захваченное видео в замедленное движение, используя ffmpeg, который получается очень плавным и четным. Для интеграции FFmpeg в android мы можем использовать предварительно скомпилированные библиотеки, такие как ffmpeg-android.

В соответствии с рассматриваемым случаем мы можем снимать видео с камеры и затем преобразовывать его в замедленное движение с помощью ffmpeg.

Чтобы создать медленное видео, мы можем использовать следующую команду -

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-filter_complex", "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputFileAbsolutePath};

Здесь

-y

Перезаписать выходные файлы без запроса

-i

ffmpeg читает с произвольного количества входных "файлов", указанных опцией -i

-map

На метки метки вывода ссылаются на -map.

-b: v

Установите битрейт видео

-r

Установите частоту кадров

-vcodec

Установите видеокодек

-filter_complex filtergraph

Определите сложный фильтр-график, то есть один с произвольным количеством входов и/или выходов. Фильтр работает, изменяя временную метку представления (PTS) каждого видеокарта. Чтобы замедлить ваше видео, вам необходимо использовать множитель, превышающий 1. Например, если есть два прецедентных кадра, показанных на отметках времени 1 и 2, и вы хотите замедлить видео, эти метки времени должны стать 2 и 4 соответственно. Таким образом, мы должны умножить их на 2.0.

Вы можете ускорить или замедлить звук с помощью звукового фильтра atemto. Фильтр atempo ограничен использованием значений от 0,5 до 2,0 (поэтому он может замедлить его до не менее половины первоначальной скорости и ускорить до более чем на два раза). Чтобы замедлить звук до половины его скорости, мы должны использовать значение atempo 0.5.

Просмотрите этот учебник по редактированию видеофайлов fffmpeg, который я написал в своем блоге, который включает создание замедленного видео и полный код учебника здесь.