• python实现视频录制功能


    需要安装的第三方库有pillow、opencv-python、numpy、pynput

    以下为实现代码:

    import time,threading
    from datetime import datetime
    from PIL import ImageGrab
    import cv2
    import numpy as np
    from pynput import keyboard
    def video_record():   # 录入视频
      global name
      name = datetime.now().strftime('%Y-%m-%d %H-%M-%S') # 当前的时间(当文件名)
      screen = ImageGrab.grab() # 获取当前屏幕
      width, high = screen.size # 获取当前屏幕的大小
      fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # MPEG-4编码,文件后缀可为.avi .asf .mov等
      video = cv2.VideoWriter('%s.avi' % name, fourcc, 15, (width, high)) # (文件名,编码器,帧率,视频宽高)
      #print('3秒后开始录制----')  # 可选
      #time.sleep(3)
      print('开始录制!')
      global start_time
      start_time = time.time()
      while True:
        if flag:
          print("录制结束!")
          global final_time
          final_time = time.time()
          video.release() #释放
          break
        im = ImageGrab.grab()  # 图片为RGB模式
        imm = cv2.cvtColor(np.array(im),cv2.COLOR_RGB2BGR) # 转为opencv的BGR模式
        video.write(imm)  #写入
    def on_press(key):   # 监听按键
      global flag
      if key == keyboard.Key.home: #键盘上的Home键
        flag = True # 改变
        return False # 返回False,键盘监听结束!
    def video_info():   # 视频信息
      video = cv2.VideoCapture('%s.avi' % name)  # 记得文件名加格式不要错!
      fps = video.get(cv2.CAP_PROP_FPS)
      Count = video.get(cv2.CAP_PROP_FRAME_COUNT)
      size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
      print('帧率=%.1f'%fps)
      print('帧数=%.1f'%Count)
      print('分辨率',size)
      print('视频时间=%.3f秒'%(int(Count)/fps))
      print('录制时间=%.3f秒'%(final_time-start_time))
      print('推荐帧率=%.2f'%(fps*((int(Count)/fps)/(final_time-start_time))))
    if __name__ == '__main__':
      flag = False
      th = threading.Thread(target=video_record)
      th.start()
      with keyboard.Listener(on_press=on_press) as listener:
        listener.join()
      time.sleep(1)  # 等待视频释放过后
      video_info()

    转载:https://www.jb51.net/article/181757.htm(经过优化)

  • 相关阅读:
    MySQL中redo日志
    MySQL中事务的分类
    MySQL中事务的概述ACID了解
    MySQL中UNSIGNED和ZEROFILL的介绍
    MySQL中死锁
    谈谈当前火热的“车联网”
    线性代数回顾:矩阵运算
    Spark作业调度阶段分析
    Spark——共享变量
    Spark编译与打包
  • 原文地址:https://www.cnblogs.com/Frank-guo/p/15211252.html
Copyright © 2020-2023  润新知