【问题标题】:is there a way to record videos in kivy?有没有办法在kivy中录制视频?
【发布时间】:2020-09-15 17:13:48
【问题描述】:

我在 Kivy 中显示摄像机视频,但找不到录制视频的方法,我尝试使用 OpenCV Videowriter 但由于更新(Clock.schedule_interval(self.update, 1.0/33.0))它一直在覆盖,所以它保存的视频是一个图像,有没有人有另一种方法。

【问题讨论】:

    标签: python user-interface video kivy video-recording


    【解决方案1】:

    请查看以下可能有助于您的代码。主要代码取自链接:https://www.codingforentrepreneurs.com/blog/how-to-record-video-in-opencv-python。我只适应了kivy框架(因为问题是kivy解决方案)并调整了frame_per_second使其与查看和写入速度一致。

    from kivy.app import App
    from kivy.uix.widget import Widget
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.image import Image
    from kivy.clock import Clock
    from kivy.graphics.texture import Texture
    from kivy.properties import StringProperty, NumericProperty
    
    import cv2
    import os
    
    # Standard Video Dimensions Sizes
    STD_DIMENSIONS =  {
        "480p": (640, 480),
        "720p": (1280, 720),
        "1080p": (1920, 1080),
        "4k": (3840, 2160),
    }
    
    # Video Encoding, might require additional installs
    # Types of Codes: http://www.fourcc.org/codecs.php
    VIDEO_TYPE = {
        'avi': cv2.VideoWriter_fourcc(*'XVID'),
        #'mp4': cv2.VideoWriter_fourcc(*'H264'),
        'mp4': cv2.VideoWriter_fourcc(*'XVID'),
    }
    
    class KivyCamera(BoxLayout):
        filename = StringProperty('video.avi')
        frames_per_second = NumericProperty(30.0)
        video_resolution = StringProperty('720p')
    
        def __init__(self, **kwargs):
            super(KivyCamera, self).__init__(**kwargs)
            self.img1=Image()
            self.add_widget(self.img1)
            self.capture = cv2.VideoCapture(0)
            self.out = cv2.VideoWriter(self.filename, self.get_video_type(self.filename), self.frames_per_second, self.get_dims(self.capture, self.video_resolution))
            Clock.schedule_interval(self.update, 1 / self.frames_per_second)
    
        def update(self, *args):
            ret, frame = self.capture.read()
            self.out.write(frame)
            buf = cv2.flip(frame, 0).tostring()
            texture = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt="bgr")
            texture.blit_buffer(buf, colorfmt="bgr", bufferfmt="ubyte")
            self.img1.texture = texture
    
        # Set resolution for the video capture
        # Function adapted from https://kirr.co/0l6qmh
        def change_resolution(self, cap, width, height):
            self.capture.set(3, width)
            self.capture.set(4, height)
    
        # grab resolution dimensions and set video capture to it.
        def get_dims(self, cap, video_resolution='1080p'):
            width, height = STD_DIMENSIONS["480p"]
            if self.video_resolution in STD_DIMENSIONS:
                width, height = STD_DIMENSIONS[self.video_resolution]
            ## change the current caputre device
            ## to the resulting resolution
            self.change_resolution(cap, width, height)
            return width, height
    
        def get_video_type(self, filename):
            filename, ext = os.path.splitext(filename)
            if ext in VIDEO_TYPE:
              return  VIDEO_TYPE[ext]
            return VIDEO_TYPE['avi']
    
    class CamApp(App):
        def build(self):
            return KivyCamera()
    
    if __name__ == '__main__':
        CamApp().run()
    

    【讨论】:

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