ffmpeg 通过 python 子进程找不到相机

ffmpeg through python subprocess fails to find camera

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

ffmpeg -y -t 300 -rtbufsize 1024M -f dshow -i video="Lenovo EasyCamera" -c:v libx264 -preset veryslow -crf 25 Desktop.mkv

一切正常。但是当我通过 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)

输出以下错误并冻结:

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

谁能解决这个问题并告诉我我做错了什么?还是 python 或 subprocess 模块中的一些已知错误(使用 python 3.6.1,但如果它能帮助我解决此问题,则不附加到特定版本)?

提前致谢!

P.S. 这个问题是这个问题的后续问题,如果相关的话:

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

您可以通过测试 python 文件看到这一点:

import sys
print(sys.argv[1:])
> 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"']

ffmpeg 认为您正在寻找名为 "Lenovo EasyCamera" 而不是 Lenovo EasyCamera

的设备

因此,您需要更改命令,使其不在引号中,因为 Popen 不会在 spaces 上拆分它。

from subprocess import Popen
cmd = [..., '-i', 'video=Lenovo EasyCamera', ...]
p = Popen(cmd)

我遇到了同样的错误:

Input #0, dshow, from 'video=Webcam C170':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 30 fps, 30 tbr, 10000k tbn, 10000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> mjpeg (native))
Press [q] to stop, [?] for help
video=Webcam C170: I/O error
[swscaler @ 0000024a6b9a03c0] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'target.jpg' 

看来不是pythin调用问题引起的。我尝试将 os.system(cmd) or subprocess.call(cmd) or os.Popen(cmd)cmd = 'ffmpeg -f dshow -i video="Webcam C170" -frames 1 target.jpg' or cmd = ['ffmpeg', '-f', 'dshow', '-i', 'video=Webcam C170', '-frames', '1', target] 一起使用时都出现错误 - video=Webcam C170: I/O error

即使我使用 os.system("get_image.bat") 调用内容为 ffmpeg -f dshow -i video="Webcam C170" -frames 1 target.jpg 的 dos 批处理脚本,它仍然失败并出现相同的错误 video=Webcam C170: I/O error

只有当我在 dos window 中输入此脚本时才能成功,脚本如下: ffmpeg -f dshow -i video="Webcam C170" -frames 1 target.jpg

如果您有解决此类问题的经验,请分享一下?