如何将一个程序(ffmpeg)的输出传递到python脚本?

如何将一个程序(ffmpeg)的输出传递到python脚本?,python,ffmpeg,ipc,Python,Ffmpeg,Ipc,我想做的是: ffmpeg -i udp://224.10.10.10:15004 -qscale:v 2 sttest%04d.jpg 然后将其输出图像路径传递给python脚本,该脚本在运行ffmpeg时单独接收图像并对其进行操作(最终我将使用ffmpy调用ffmpeg,而不是使用命令行工具,但出于测试目的,我从这里开始) 我认为这样做的一种方法是每次处理图像时都查看ffmpeg输出的目录,看看是否有新图像,然后将其加载到python(使用OpenCV)——如果没有新图像要处理,则等待一定

我想做的是:

ffmpeg -i udp://224.10.10.10:15004 -qscale:v 2 sttest%04d.jpg
然后将其输出图像路径传递给python脚本,该脚本在运行
ffmpeg
时单独接收图像并对其进行操作(最终我将使用
ffmpy
调用
ffmpeg
,而不是使用命令行工具,但出于测试目的,我从这里开始)

我认为这样做的一种方法是每次处理图像时都查看ffmpeg输出的目录,看看是否有新图像,然后将其加载到python(使用OpenCV)——如果没有新图像要处理,则等待一定的时间间隔


但是有没有更好的方法可以做到这一点,比如直接将图像路径发送到某种队列,然后python脚本可以逐个处理这些队列?

由于FFmpeg没有流式输出“我生成的文件名”,您唯一的选择是使用您拥有的文件系统

根据您的操作系统,可能有一种方法可以在目录中碰到新文件时获得通知。我不知道这是否适用于linux、windows、OSX,但值得研究一下

事实上,这看起来很简单,您不必通过外部调用ffmpeg来完成。ffmpeg基本上是
libavcodec
的用户前端,这是一个用于对视频、音频等进行解码和编码的库

因此,您可能只想在应用程序中使用
libavcodec
。我实际上认为,如果使用实际的媒体流体系结构,您尝试做的事情会容易得多。GStreamer可能是您选择的工具,您可以直接从python使用它,但我没有这方面的经验

您的目标应该是直接在python程序中获取帧,而不必绕道将它们写入磁盘


如果您不想使用
libav*
gstreamer
的话,一个简单的MJPEG(运动JPEG)转换器,简单地通过管道输入程序的
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
如您所见,我只是将每五帧放入一个
帧队列中。其核心是这三条线:

cap = cv2.VideoCapture("video.mpg")
while cap.grab():
    success, frame = cap.read()
第一行打开捕获,while子句使用
cap.grab()
(如果有下一帧,则返回
True
),然后我使用
cap.read()
将该帧读入
numpy
数组<代码>成功
是一个布尔值,指示操作是否成功。后来,我在
帧中添加了一个alpha通道,并将其放入
帧中

然后,程序的另一个线程
从该
队列中获取
s帧。这样,我根本不需要处理文件系统——就像Marcus说的,我直接把它们放到程序中

注意:对于
cv2.VideoCapture()
来说,要使用
opencv\u ffmpeg.dll
需要位于系统路径中,或者位于您正在使用的
Python
安装的根目录中。您可能需要将其重命名为
opencv_ffmpegXYZ.dll
,其中XYZ是
opencv
版本号减去小数点。所以对我来说,它是
opencv\u ffmpeg330.dll
,因为我的版本是
3.3.0
。它也可以在x64系统上被称为
opencv\u ffmpeg330\u 64.dll

opencv\u ffmpeg.dll的位置取决于您如何安装
opencv
,我只需在
opencv
目录中搜索
opencv\u ffmpeg
并查看它的位置。在将它复制到
Python
目录之前,请确保检查它是否已经存在。它可能是,这取决于您如何安装
OpenCV