如何在 windows 中使用 ffmpeg 抓取笔记本电脑网络摄像头视频

How to grab laptop webcam video with ffmpeg in windows

我有一个小的 python 程序,它可以很好地使用 ffmpeg 的子进程从 linux 中的网络摄像头捕获短视频(至少对于具有内置网络摄像头的笔记本电脑而言) .

现在我正在尝试编写相同的程序来捕获 windows 中的网络摄像头,而且我知道我不能使用在 [=38] 中运行良好的通用“/dev/video0” =],但我认为将其命名为 "Integrated Camera" 应该就足够了,但它失败了。

这是我的 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 的文档并尝试寻找解决方案,但到目前为止我迷路了...

我知道 "Integrated Camera"s 仅在某些笔记本电脑上可用,而在其他笔记本电脑上不可用,并且它不会捕获连接的其他相机,但这对我的用例来说已经足够了......但是如果你想要一个挑战 我还想知道如何将它应用到任何带摄像头的 windows-pc,不管它叫什么。

此外,仅使用 python 工具(如 OpenCV)来完成我在这里尝试的操作是否更容易或更值得推荐?

提前致谢! 编辑:如果有人根据@Mulvya 的评论感兴趣,我用部分解决方案回答了我自己的问题,但如果有人仍然可以向我解释有关 OpenCV 的部分,我仍然想听听......

在此处跟进问题:

我做到了...根据@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 中

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