我知道,如果我们想读取视频文件或USB摄像机或rtsp流,则可以使用cv2.VideoCapture
。
但是由于某种原因,我想使用ffmpeg来做事情,并使用opencv处理获得的图像。因此伪代码为:
import cv2
import ffmpeg
videoFile = 'XXX.mp4'
video = ffmpeg.XXX(videoFile)
while True:
frame = video.read() # this read() function is made up by me
frameCV = ffmpeg2cv(frame) # this ffmpeg2cv() function is made up by me
cv2.imshow('frame', frameCV)
我搜索了类似https://github.com/kkroening/ffmpeg-python的内容。但是我仍然不知道该怎么做。我认为ffmpeg太难了,很少有在线文档不像opencv。所以请帮忙。
答案 0 :(得分:0)
这是我在以下主题中发现的: https://www.bugcodemaster.com/article/extract-images-frame-frame-video-file-using-ffmpeg 他们提出一个呼叫,每秒提取一张图像,称为:fps = 1 他们在下面建议如何提取每个帧,例如:-vf select = eq(pict_type \,I)
因此,我建议使用子流程并尝试如下操作:
import subprocess
time = 200 # of your movie
frame_rate = 50
pathToFfmpeg = "SOME\\PATH"
pathToInput = "ANOTHER\\PATH"
pathToOuput = "YET\\ANOTHER\\PATH"
proc = subprocess.run([pathToFfmeg + "\\ffmpeg.exe",
"-framerate", str(frame_rate),
"-loglevel", "panic", # Suppress Log
"-i", pathToInput + "\\SomeName.avi",
# Now copying their code
"-vf", "select=eq(pict_type\,I)",
"-vsync", "vfr", pathToOuput + "\\Name.jpg",
"-hide_banner"]) # Specify Output
然后您可以使用opencv读取输出图像。
注意:您需要所有“”作为子流程
选择包含计数器/迭代器的输出名称。