2017-06-03 37 views
1

我有一个小型的python程序,能够非常好地从fcmpeg中使用子过程在linux中捕获网络摄像机中的短视频(至少对于内置网络摄像头的笔记本电脑) 。如何在windows中使用ffmpeg抓取笔记本电脑的网络摄像头视频

现在我试图编写相同的程序来捕获Windows中的网络摄像头,我知道我不能使用在Linux中工作得很好的通用“/ dev/video0”,但我认为像命名它“集成摄像头”应该足够了,但是失败了。

这里是我的Linux代码(即工作):

import sys 
    from subprocess import call 
    from datetime import datetime 
    def record_webcam(seconds): 
     cam = '/dev/video0' 
     timestamp = datetime.now().strftime('%Y%m%d-%H%M%S') 
     filename = timestamp + 'something.mkv' #generated with more complexity in the actual code, but that isn't important 
     ffmpeg_cmd = 'ffmpeg -t {} -an -i {} -c:v libx264 -preset veryslow -crf 25 {}'.format(seconds, cam, filename).split() 
     p = call(ffmpeg_cmd) 
     return filename if p == 0 else False 

    if __name__ == '__main__': 
     record_webcam(sys.argv[1]) 

我已经看过了ffmpeg的文档,并试图寻找解决方案,但到目前为止,我迷路了......

我知道“集成相机”仅适用于某些笔记本电脑,而不适用于其他笔记本电脑,并且不会捕获其他连接的相机,但对于我的使用情况来说已足够了......但如果您想要挑战我也想知道如何不管它叫什么,都可以用相机将它应用到任何windows-pc上。

此外,是更容易或更建议做我在这里只用python工具,像OpenCV一样尝试?

在此先感谢! 编辑:如果有人有兴趣根据@Mulvya的评论回答我自己的问题,但如果任何人仍然可以向我解释关于OpenCV的部分,我仍然希望听到它...

跟进的问题在这里:ffmpeg through python subprocess fails to find camera

+0

在Windows上,你将不得不使用要么[DSHOW](https://ffmpeg.org/ffmpeg- devices.html#dshow)或[gdigrab](https://ffmpeg.org/ffmpeg-devices.html#gdigrab)输入设备。 – Mulvya

+0

尝试过,但它没有找到“集成相机”,我认为它也有一个与libx264编码混合的问题,但也许我错了。你能举出一个适用于任何摄像头的命令吗?或者至少*大多数*集成的? –

+2

没有通用命令。阅读链接文档中的[示例](https://ffmpeg.org/ffmpeg-devices.html#Examples-2)。首先,您必须检查可用设备的列表,然后选择一个并捕获。使用x264编码没有问题。加入'-preset ultrafast -tune zerolatency'。 – Mulvya

回答

1

我做到了......基于什么@Mulvya评论,我能列出所有相机withing代码和提取他们的命令,我现在有关于一个不同的问题,但我会问另一个问题。在此期间,如果有人有兴趣通过Python和ffmpeg的Windows会自动选择第一个可用的相机,我的解决办法是这样的:

import re 
    from subprocess import Popen, PIPE 
    list_cmd = 'ffmpeg -list_devices true -f dshow -i dummy'.split() 
    p = Popen(list_cmd, stderr=PIPE) 
    for line in iter(p.stderr.readline,''): 
     if flagcam: 
      cam = re.search('".*"',line.decode(encoding='UTF-8')).group(0) 
      cam = 'video=' + cam if cam else '' 
      flagcam = False 
     elif 'DirectShow video devices'.encode(encoding='UTF-8') in line: 
      flagcam = True 
     elif 'Immediate exit requested'.encode(encoding='UTF-8') in line: 
      break 

变量“凸轮”现在持有的凸轮的名字,因为它是在DirectShow的在Windows

跟进问题here如果有人想帮助编辑:也解决

相关问题