在python中使用vid.stab将ffmpeg的输出文件捕获到一个变量中

Posted

技术标签:

【中文标题】在python中使用vid.stab将ffmpeg的输出文件捕获到一个变量中【英文标题】:Capturing output file of ffmpeg with vid.stab in python into a variable 【发布时间】:2019-03-24 12:36:04 【问题描述】:

我正在尝试编写一个 python 脚本来使用 ffmpeg 和 vid.stab 库来稳定视频。 我的问题是输出文件似乎没有通过标准输出,所以使用 subprocess.Popen() 返回一个空变量。

cmd1=["ffmpeg", "-i","./input.MOV", "-vf", "vidstabdetect=stepsize=6:shakiness=10:accuracy=15", "-f","null","pipe:1"]
p = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
vectors, err = p.communicate()

问题在于 vibstabdetect 采用名为 result 的过滤器,并将文件输出到那里指定的任何内容,而 stdout 保持为空。 (如果没有指定结果,则默认为 transforms.trf。)

有没有办法获取结果文件的内容? 使用上面的代码运行脚本时,它会正常执行,但文件是使用默认名称创建的,并且变量保持为空。

【问题讨论】:

不能直接用ffmpeg将数据输出为实际文件,然后用python读入吗? 这就是我目前的做法,但我想知道是否有办法避免这种情况。 -f fmt (input/output): Force input or output file format. The format is normally auto detected for input files and guessed from the file extension for output files, so this option is not needed in most cases. 也许你必须设置 -f 参数,因为你没有显式生成输出文件 这是哪个操作系统? @user3469811 已经有一个明确的输出 - 在这种情况下它是 pipe:1 。但是那个输出是空的,生成的来自结果过滤器。 -f null 用于指定没有文件扩展名,因为 stdout 为空,所以没有生成任何文件。 【参考方案1】:

您需要为过滤器记录数据指定标准输出,而不是 ffmpeg 的转码输出,这是您当前的 -f null pipe:1 所做的。

但是,与大多数其他使用内部 avio_open 的过滤器不同,vidstabdetect 过滤器使用 POSIX fopen 打开转换数据的目标。对于 fopen,pipe:1 是不可接受的。对于 Windows,CON,对于 linux,/dev/stdout,正如您所确认的,是必需的。

【讨论】:

以上是关于在python中使用vid.stab将ffmpeg的输出文件捕获到一个变量中的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 和 python 将视频中的所有音频流提取到单独的音频文件中

使用python将opencv图像通过管道传输到ffmpeg

如何通过传递文件对象(而不是磁盘上文件的位置)将 ffmpeg 与 Python 一起使用

将ffmpeg与python一起使用,在找到END元素之前输入缓冲区已耗尽

能够使用 ffmpeg 和 python 读取当前音频帧

python 使用ffmpeg-python将numpy数组转换为视频帧