ffmpeg通过python子进程找不到相机 [英] ffmpeg through python subprocess fails to find camera

查看:505
本文介绍了ffmpeg通过python子进程找不到相机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里有个奇怪的问题,我使用这个命令通过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代码:

 从子进程导入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]可以在视频类型的源设备中找不到名为[Lenovo EasyCamera]的视频设备。 
video =Lenovo EasyCamera:I / O错误

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



提前感谢!



PS 此问题是对此的追踪,如果这是相关的:如何在Windows中使用ffmpeg抓住笔记本电脑摄像头视频

解决方案

问题是,在命令行中, video =Lenovo EasyCamera您可以使用测试的python文件查看这个空格:

  import sys 
print(sys.argv [1:])





 > python print_argv.py video =Lenovo EasyCamera
['video = Lenovo EasyCamera']
> python print_argv.pyvideo = Lenovo EasyCamera
['video = Lenovo EasyCamera']
> python
>>>从子进程导入Popen
>>> cmd = ['python','print_argv.py','video =Lenovo EasyCamera']
>>> p = Popen(cmd)
['video =Lenovo EasyCamera'

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

$ b $的设备b

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

 从子进程导入Popen 
cmd = [...,'-i','video = Lenovo EasyCamera',... ]
p = Popen(cmd)


Weird problem here, i use this command to capture my webcam through ffmpeg (through cmd on windows):

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

and everything works fine. But when i try the very same command through python as a subprocess it fails. Here's the python code:

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)

Outputs the following error and freezes:

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

Can anyone figure this out and tell me what i'm doing wrong? Or is it some known bug in python or the subprocess module (using python 3.6.1, but not attached to the specific version if it will help me solve this problem)?

Thanks in advance!

P.S. This question is a follow up to this one, if that's relevant: How to grab laptop webcam video with ffmpeg in windows

解决方案

The problem is that, in the commandline, video="Lenovo EasyCamera" uses the quotes to make sure the space doesn't make it another argument.

You can see this with a test python file:

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 thinks you're looking for a device called "Lenovo EasyCamera" instead of Lenovo EasyCamera

So, you need to change your command so that it is not in quotes, as Popen will not split it on spaces.

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

这篇关于ffmpeg通过python子进程找不到相机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆