ffmpeg конвертирует переменную частоту кадров .webm в видео с постоянной частотой кадров - PullRequest
0 голосов
/ 08 июля 2019

У меня есть файл .webm записи игры со скоростью 16 кадров в секунду. Однако при попытке обработать видео с помощью OpenCV кажется, что видео записано с переменной частотой кадров, поэтому, когда я пытаюсь использовать OpenCV для получения кадра каждую секунду, получая каждый 16-й кадр, он не будет работать, так как видео Поток закончится преждевременно.

Поэтому я пытаюсь преобразовать видео .webm с переменным кадром, которое утверждает, что оно имеет частоту кадров 16 кадров в секунду, в видео с постоянным кадром, поэтому я могу извлекать один кадр за каждую секунду. Я пробовал следующую команду ffmpeg из https://ffmpeg.zeranoe.com/forum/viewtopic.php?t=5518:

ffmpeg -i input.webm -c:v copy -b:v copy -r 16 output.webm

Однако произойдет следующая ошибка:

[NULL @ 00000272ccbc0c40] [Eval @ 000000bc11bfe2f0] Undefined constant or missing '(' in 'copy'
[NULL @ 00000272ccbc0c40] Unable to parse option value "copy"
[NULL @ 00000272ccbc0c40] Error setting option b to value copy.

Error setting up codec context options.

Вот код, который я пытаюсь использовать для обработки кадра каждую секунду:

video = cv2.VideoCapture(test_mp4_vod_path)
print("Opened ", test_mp4_vod_path)
print("Processing MP4 frame by frame")

# forward over to the frames you want to start reading from.
# manually set this, fps * time in seconds you wanna start from
video.set(1, 0)
success, frame = video.read()
#fps = int(video.get(cv2.CAP_PROP_FPS))  # this will return 0!
fps = 16  # hardcode fps
total_frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
print("Loading video %d seconds long with FPS %d and total frame count %d " % (total_frame_count/fps, fps, total_frame_count))

count = 1
while video.isOpened():
    success, frame = video.read()
    if not success:
        break

    if count % fps == 0:
        print("%dth frame is %d seconds on video"%(count, count/fps))
    count += 1

Код закончится до того, как приблизится к концу видео, поскольку видео не имеет постоянного FPS. Как я могу преобразовать видео с переменным FPS в видео с постоянным FPS?

1 Ответ

0 голосов
/ 13 июля 2019
  • Для параметров webM в FFmpeg читайте: https://trac.ffmpeg.org/wiki/Encode/VP9.

  • Не используйте параметр codec copy при преобразовании частоты кадров.

Возможное решение (2M - это тестовое значение, отрегулируйте для вашего видео):

ffmpeg -i input.we -c:v libvpx-vp9 -minrate 2M -maxrate 2M -b:v 2M -pix_fmt yuv420p -r 16 output.webm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...