如何在Windows中使用FFMPEG获取笔记本电脑网络摄像头视频



我有一个小的python程序,可以很好地捕获Linux中的网络摄像头(至少适用于具有内置网络摄像头的笔记本电脑(的短视频,并使用ffmpeg的子过程。<<<<<<<<<<<<<<<<<<<<<<<<<</p>

现在,我正在尝试编写相同的程序来捕获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的文档,并试图搜索解决方案,但到目前为止我迷路了...

我知道"集成相机" S仅在某些笔记本电脑上可用,而不是其他笔记本电脑上可用,并且它不会捕获其他相机,但这对我的用例就足够了...但是,如果您想要挑战,我会也喜欢知道如何使用相机将其应用于任何Windows-PC,而不管它叫什么。

另外,仅使用Python工具(例如OpenCV(来做我在这里尝试的工作更容易或更建议吗?

预先感谢!编辑:如果有人根据@mulvya的评论感兴趣,我就通过部分解决方案回答了自己的问题,但是如果有人仍然可以向我解释有关OpenCV的部分,我仍然想听听...

在这里跟进问题:FFMPEG通过Python子进程未能找到相机

我做到了...根据@mulvya评论的内容,我能够使用代码列出所有摄像机并从它们中提取命令,我现在对此有一个不同的问题但是我会问另一个问题。同时,如果有人有兴趣通过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

变量"凸轮"现在保存cam的名称,因为它在Windows上的DirectShow

在这里跟进问题,如果有人想帮助编辑:也解决了

最新更新