Android захватывает замедленное видео с помощью CamcorderProfile
Я пытаюсь снять замедленное видео на моем Nexus 5x. Вот как я настраиваю медиа-рекордер:
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH_SPEED_HIGH);
mMediaRecorder = new MediaRecorder();
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set the high speed CamcorderProfile
mMediaRecorder.setProfile(profile);
// Step 4: Set output file
// Step 5: Prepare media recorder
// Step 6: Capture video
Проблема в том, что снятые видео не являются медленными видео со скоростью 120 кадров в секунду, которые поддерживает мое устройство. Это обычные видео 29 кадров в секунду.
Я прошел этот ответ, который говорит о следующем в официальной документации:
Для всех высокоскоростных профилей, определенных ниже ((от QUALITY_HIGH_SPEED_LOW до QUALITY_HIGH_SPEED_2160P), они похожи на обычные профили записи, только с более высокой выходной частотой кадров и скоростью передачи данных. Поэтому, устанавливая эти профили с помощью setProfile(CamcorderProfile) без указания каких-либо других параметров кодирования будет производить высокоскоростное видео, а не замедленное видео с различной частотой кадров захвата и вывода (воспроизведения). Чтобы записывать замедленное видео, приложение должно соответствующим образом установить частоту кадров и скорость вывода видео (воспроизведение) с помощью setVideoFrameRate (int) и setVideoEncodingBitRate (int) на основе коэффициента замедленного движения. Если приложение намеревается выполнить запись видео с помощью кодера MediaCodec, оно должно установить каждое отдельное поле MediaFormat аналогично в соответствии с этим CamcorderProfile.
То, что я не получаю, это то, что setProfile уже вызывает два метода setVideoFrameRate и setVideoEncodingBitRate с параметрами, полученными из выбранного CamcorderProfile. Почему мне нужно позвонить им снова? Что мне здесь не хватает?
Любая помощь будет принята с благодарностью. На всю жизнь я не могу заставить это работать!
РЕДАКТИРОВАТЬ: я пытался назвать методы, как это так, но он по-прежнему захватывает видео с нормальной скоростью:
mMediaRecorder.setVideoFrameRate(profile.videoFrameRate/4);
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate/4);
1/4, так как объявленная частота кадров CamcorderProfile.QUALITY_HIGH_SPEED_HIGH равна 120, и я хочу снять видео со скоростью 30 кадров в секунду, как указано в документе здесь
public int videoFrameRate
Добавлен на уровне API 8 Целевая частота кадров видео в кадрах в секунду.
Это целевая частота кадров записанного видео в секунду, если приложение настраивает запись видео с помощью setProfile(CamcorderProfile) без указания каких-либо других параметров кодирования MediaRecorder. Например, для высокоскоростных профилей качества (от QUALITY_HIGH_SPEED_LOW до QUALITY_HIGH_SPEED_2160P) это частота кадров, с которой видео записывается и воспроизводится. Если приложение намеревается создать сценарий использования медленного движения с высокоскоростными профилями качества, оно должно установить другую частоту кадров видео, соответствующую желаемой частоте кадров выходного (воспроизведения), через setVideoFrameRate(int). Например, если QUALITY_HIGH_SPEED_720P объявляет 240Fps videoFrameRate в CamcorderProfile, и приложение намеревается создать замедленную запись видео с 1/8 фактором, приложение должно установить 30 fps через setVideoFrameRate(int). Невыполнение этого требования приведет к высокоскоростному видео с нормальной скоростью воспроизведения (240 к / с для приведенного выше примера). Если приложение намеревается выполнить запись видео с помощью кодера MediaCodec, оно должно установить каждое отдельное поле MediaFormat аналогично в соответствии с этим CamcorderProfile.
1 ответ
mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);
или же
mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);