我有一个以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 。
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句