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
如果您有解决此类问题的经验,请分享一下?
这里有奇怪的问题,我使用此命令通过 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
如果您有解决此类问题的经验,请分享一下?