如何将一个程序的输出(FFMPEG)传递给Python脚本



我想做的是:

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

最新更新