如何在 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 中
跟进问题如果有人想帮忙编辑:也解决了
我有一个小的 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 中跟进问题