У меня есть файл .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?