我想做的是:
ffmpeg -i udp://224.10.10.10:15004 -qscale:v 2 sttest%04d.jpg
,然后将其传递到Python脚本,该脚本单独使用图像并操纵它们,因为ffmpeg
正在运行(最终我将使用ffmpy
来调用ffmpeg
,而不是使用命令行工具,但对于使用命令行工具,但对于现在测试目的,我从这里开始)。
我想这样做的一种方法是,每次处理图像时,查看FFMPEG输出的目录如果没有新的图像进行处理,请等待特定时间间隔。
但是,是否有更好的方法来执行此操作,例如将图像的路径直接发送到Python脚本然后可以一一处理的队列?
,因为ffmpeg没有输出"我生成的文件名"的输出,您唯一的选项是使用您拥有的文件系统。
根据您的操作系统,当目录中触摸新文件时,可能会有一种通知的方法。我不知道这是否适用于Linux,Windows,OS X,但值得研究。
实际上,这看起来很简单,以至于您不会通过外部调用ffmpeg来做到这一点。FFMPEG基本上是libavcodec
的用户前端,是用于删除和编码视频,音频等的库。
因此,您可能只想在应用程序内使用libavcodec
即可。我实际上认为,如果使用实际的媒体流式体系结构,您要做的事情会容易得多。GSTREAMER可能是您选择的工具,您可以直接从Python那里使用它,但是我没有关于这有多容易的经验。
您的目标应该是直接在您的Python程序中获取框架,而无需将其写入磁盘。
一个简单的MJPEG(Motion JPEG)转换器,如果您不想使用libav*
或gstreamer
,则只需将管道输送到程序的stdin
中。
对于任何好奇的人来说,这是我的解决方案。它正在使用OpenCV
。当时我没有意识到这个问题,但是OpenCV
具有某些在幕后使用ffmpeg
的功能。而且,由于我的程序已经使用了OpenCV
,我只在传递问题中提到的(我认为这是不重要的),因此使用内置到OpenCV
中的功能来完成我想要的事情并不难。这是代码:
cap = cv2.VideoCapture("video.mpg")
count = 0
frame_q = queue.Queue()
while cap.grab():
success, frame = cap.read()
if count % 5 == 0 and success:
frame_alpha = np.insert(frame, 3, 255, axis=2)
frame_q.put(frame_alpha)
count += 1
您可以看到,我只是将每个第五帧放入Queue
框架中。这是这三行的核心:
cap = cv2.VideoCapture("video.mpg")
while cap.grab():
success, frame = cap.read()
第一行打开捕获,While子句检查是否使用cap.grab()
有更多帧(如果有下一个帧,请返回True
),然后我将该帧读为使用cap.read()
的numpy
数组。success
是指示操作是否成功的布尔值。稍后,我在frame
中添加一个alpha通道,然后将其放入frame_q
。
然后,该程序get
s框架的另一个线程从该Queue
中删除。这样,我不必处理所有文件系统 - 像Marcus说,我将它们直接纳入程序。
注意:对于cv2.VideoCapture()
工作,opencv_ffmpeg.dll
需要在系统路径或您使用的Python
安装的根目录中。您可能必须将其重命名为opencv_ffmpegXYZ.dll
,其中XYZ是OpenCV
版本编号减去小数点。因此,对我来说,这是opencv_ffmpeg330.dll
,因为我有3.3.0
版本。它也可能在X64系统上称为opencv_ffmpeg330_64.dll
。
opencv_ffmpeg.dll
的位置取决于您安装OpenCV
的方式,我只需在OpenCV
目录中搜索opencv_ffmpeg
的目录,然后查看它的出现。在将其复制到Python
目录中之前,请确保检查它是否已经存在。可能是,取决于您如何安装OpenCV
。