【问题标题】:How to grab laptop webcam video with ffmpeg in windows如何在 Windows 中使用 ffmpeg 抓取笔记本电脑网络摄像头视频
【发布时间】:2017-11-04 23:46:02
【问题描述】:

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

现在我正在尝试编写相同的程序来捕获 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

【问题讨论】:

  • 在 Windows 上,您必须使用 dshowgdigrab 输入设备。
  • 试过了,但找不到“集成相机”,我认为将它与 libx264 编码混合也有问题,但也许我错了。你能举一个适用于任何网络摄像头的命令的例子吗?或者至少是大多数集成的?
  • 没有通用命令。阅读链接文档中的examples。首先,您必须检查可用设备列表,然后选择一个并捕获它。使用 x264 编码没有问题。添加-preset ultrafast -tune zerolatency
  • 我根据您的评论添加了自己的问题答案...非常感谢!

标签: python opencv ffmpeg directshow


【解决方案1】:

我做到了...根据@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”现在保存 cam 的名称,就像它在 Windows 上的 DirectShow 中一样

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多