如何在windows

时间:2017-06-03 19:51:34

标签: python opencv ffmpeg directshow

我有一个小的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

1 个答案:

答案 0 :(得分: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”现在保存了在Windows上的DirectShow中的凸轮名称

跟进问题here是否有人想要帮助编辑:也解决了