opencv - ffmpeg 将可变帧率 .webm 转换为恒定帧率视频

标签 opencv image-processing video ffmpeg video-processing

我有一个 16fps 的游戏记录的 .webm 文件。但是,在尝试使用 OpenCV 处理视频时,视频似乎是以可变帧率录制的,因此当我尝试使用 OpenCV 通过获取每 16 帧来每秒获取一帧时,它不会工作,因为视频流将提前结束。

因此,我正在尝试将声称帧率为 16 fps 的可变帧 .webm 视频转换为具有恒定帧的视频,这样我就可以每秒提取一帧。我尝试了来自 https://ffmpeg.zeranoe.com/forum/viewtopic.php?t=5518 的以下 ffmpeg 命令:

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 视频?

最佳答案

可能的解决方案(2M 是一个测试值,根据您的视频进行调整):

ffmpeg -i input.we -c:v libvpx-vp9 -minrate 2M -maxrate 2M -b:v 2M -pix_fmt yuv420p -r 16 output.webm

关于opencv - ffmpeg 将可变帧率 .webm 转换为恒定帧率视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56937468/

相关文章:

android - 视频播放黑屏但有声音

python - 如何从 OpenCV 中的图像中删除空白?

python - 从实时非 youtube 视频流中提取图像帧

c# - 如何使用高度和宽度调整 Texture2D 的大小?

c++ - 强制 WIC 将图像数据视为 RGB

python - 如何确保使用OpenCV读取和处理所有帧

video - 应用过滤器前后的 ffmpeg 记录

opencv - 大多数 cv2 元组参数在 python 3.5 (windows 7) 中不起作用

python - 如何更改图像的像素值?

python - 提高 pytesseract 从图像中正确识别文本的能力