ffmpeg通过python子进程无法找到摄像头

Ofe*_*dan 3 python subprocess directshow ffmpeg

奇怪的问题,我使用此命令通过ffmpeg(通过Windows上的cmd)捕获我的网络摄像头:

ffmpeg -y -t 300 -rtbufsize 1024M -f dshow -i video="Lenovo EasyCamera" -c:v libx264 -preset veryslow -crf 25 Desktop.mkv
Run Code Online (Sandbox Code Playgroud)

一切正常.但是当我通过python作为子进程尝试相同的命令时,它失败了.这是python代码:

from subprocess import Popen
cmd = ['ffmpeg', '-y', '-t', '300', '-rtbufsize', '1024M', '-f', 'dshow', '-i', 'video="Lenovo EasyCamera"', '-c:v', 'libx264', '-preset', 'veryslow', '-crf', '25', 'Desktop.mkv']
p = Popen(cmd)
Run Code Online (Sandbox Code Playgroud)

输出以下错误并冻结:

[dshow @ 00000000023a2cc0] Could not find video device with name ["Lenovo EasyCamera"] among source devices of type video.
video="Lenovo EasyCamera": I/O error
Run Code Online (Sandbox Code Playgroud)

任何人都可以解决这个问题并告诉我我做错了什么?或者它是python或子进程模块中的一些已知错误(使用python 3.6.1,但没有附加到特定版本,如果它将帮助我解决这个问题)?

提前致谢!

PS这个问题是对这个问题的一个跟进,如果这是相关的:如何在Windows中使用ffmpeg抓取笔记本电脑摄像头视频

Art*_*yer 5

问题是,在命令行中,video="Lenovo EasyCamera"使用引号来确保空格不会成为另一个参数.

你可以用test python文件看到这个:

import sys
print(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)
> python print_argv.py video="Lenovo EasyCamera"
['video=Lenovo EasyCamera']
> python print_argv.py "video=Lenovo EasyCamera"
['video=Lenovo EasyCamera']
> python
>>> from subprocess import Popen
>>> cmd = ['python', 'print_argv.py', 'video="Lenovo EasyCamera"']
>>> p = Popen(cmd)
['video="Lenovo EasyCamera"']
Run Code Online (Sandbox Code Playgroud)

ffmpeg认为你正在寻找一种叫做"Lenovo EasyCamera"代替的设备Lenovo EasyCamera

因此,您需要更改命令,使其不在引号中,因为Popen不会将其拆分为空格.

from subprocess import Popen
cmd = [..., '-i', 'video=Lenovo EasyCamera', ...]
p = Popen(cmd)
Run Code Online (Sandbox Code Playgroud)