我有一个 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 视频?
最佳答案
对于 FFmpeg 中的 webM 选项,阅读:https://trac.ffmpeg.org/wiki/Encode/VP9 .
如果转换帧速率,请勿使用
编解码器复制
选项。
可能的解决方案(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/