繁体   English   中英

Python网络摄像头记录

[英]Python webcam record

我想创建一个记录网络摄像头流的网络摄像头流应用程序,比如大约 30 秒,并将其保存为myFile.wmv 现在要获得实时摄像头馈送,我知道此代码:-

import cv2
import numpy as np
c = cv2.VideoCapture(0)

while(1):
    _,f = c.read()
    cv2.imshow('e2',f)
    if cv2.waitKey(5)==27:
        break
cv2.destroyAllWindows()

但我不知道如何记录给定的秒数并将其保存为当前目录中的文件,

请有人指出我正确的方向

谢谢

关于时间

为什么不使用python时间函数 特别是time.time()看看这个关于 python 时间的答案

NB OpenCV 应该有(或有)自己的计时器,但我不能确定它是否适用于当前版本。

关于录音/保存

看看这个另一个答案

OpenCV 允许您录制视频,但不能录制音频。 我从 JRodrigoF 遇到了这个脚本,它使用 openCV 录制视频,使用 pyaudio 录制音频。 我在一个类似的项目中使用了一段时间; 但是,我注意到有时线程会挂起并导致程序崩溃。 另一个问题是 openCV 无法以可靠的速率捕获视频帧,并且 ffmpeg 在重新编码时会使视频失真。

https://github.com/JRodrigoF/AVrecordeR

我想出了一个新的解决方案,它的记录更可靠,质量更高。 它目前仅适用于 Windows,因为它使用pywinauto和内置的 Windows 相机应用程序。 脚本的最后一点会进行一些错误检查,通过检查视频名称的时间戳来确认视频已成功录制。

https://gist.github.com/mjdargen/956cc968864f38bfc4e20c9798c7d670

import pywinauto
import time
import subprocess
import os
import datetime

def win_record(duration):
    subprocess.run('start microsoft.windows.camera:', shell=True)  # open camera app

    # focus window by getting handle using title and class name
    # subprocess call opens camera and gets focus, but this provides alternate way
    # t, c = 'Camera', 'ApplicationFrameWindow'
    # handle = pywinauto.findwindows.find_windows(title=t, class_name=c)[0]
    # # get app and window
    # app = pywinauto.application.Application().connect(handle=handle)
    # window = app.window(handle=handle)
    # window.set_focus()  # set focus
    time.sleep(2)  # have to sleep

    # take control of camera window to take video
    desktop = pywinauto.Desktop(backend="uia")
    cam = desktop['Camera']
    # cam.print_control_identifiers()
    # make sure in video mode
    if cam.child_window(title="Switch to Video mode", auto_id="CaptureButton_1", control_type="Button").exists():
        cam.child_window(title="Switch to Video mode", auto_id="CaptureButton_1", control_type="Button").click()
    time.sleep(1)
    # start then stop video
    cam.child_window(title="Take Video", auto_id="CaptureButton_1", control_type="Button").click()
    time.sleep(duration+2)
    cam.child_window(title="Stop taking Video", auto_id="CaptureButton_1", control_type="Button").click()

    # retrieve vids from camera roll and sort
    dir = 'C:/Users/michael.dargenio/Pictures/Camera Roll'
    all_contents = list(os.listdir(dir))
    vids = [f for f in all_contents if "_Pro.mp4" in f]
    vids.sort()
    vid = vids[-1]
    # compute time difference
    vid_time = vid.replace('WIN_', '').replace('_Pro.mp4', '')
    vid_time = datetime.datetime.strptime(vid_time, '%Y%m%d_%H_%M_%S')
    now = datetime.datetime.now()
    diff = now - vid_time
    # time different greater than 2 minutes, assume something wrong & quit
    if diff.seconds > 120:
        quit()
    
    subprocess.run('Taskkill /IM WindowsCamera.exe /F', shell=True)  # close camera app
    print('Recorded successfully!')


win_record(2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM