Python 是否有任何方法可以降低cv2.VideoWriter的比特率,通过摄像机实时录制视频?

Python 是否有任何方法可以降低cv2.VideoWriter的比特率,通过摄像机实时录制视频?,python,django,cv2,ip-camera,bitrate,Python,Django,Cv2,Ip Camera,Bitrate,我有一个python项目,它从ip_摄像头读取帧并将其写入.avi视频中,但是它的大小太大了,例如一个1分钟的记录的大小约为200 MB。我想降低视频比特率,以便在写入视频的同时减小大小。我尝试了很多方法,但都没有成功。这是我的密码: import os from threading import Thread import cv2 class VideoCamera(object): def __init__(self, src=''): self.capture

我有一个python项目,它从ip_摄像头读取帧并将其写入
.avi
视频中,但是它的大小太大了,例如一个1分钟的记录的大小约为200 MB。我想降低视频比特率,以便在写入视频的同时减小大小。我尝试了很多方法,但都没有成功。这是我的密码:

import os
from threading import Thread
import cv2


class VideoCamera(object):
    def __init__(self, src=''):
        self.capture = cv2.VideoCapture(src)
        self.status = False
        self.frame = self.capture.read()
        self.frame_width = int(self.capture.get(3))
        self.frame_height = int(self.capture.get(4))
        self.codec = cv2.VideoWriter_fourcc(*'MJPG')
        self.video_name = "video.avi"
        self.output_video = cv2.VideoWriter(
            self.video_name,
            self.codec, 5,
            (self.frame_width, self.frame_height))
        self.stream_thread = Thread(target=self.update, args=())
        self.record_thread = Thread(target=self.record, args=())
        self.stream_thread.daemon = True
        self.stream_thread.start()

    def update(self):
        while True:
            if self.capture.isOpened():
                (self.status, self.frame) = self.capture.read()

    def record(self):
        print('schedule')
        while True:
            print('stop recording')
            self.capture.release()
            self.output_video.release()
            cv2.destroyAllWindows()
            break
            try:
                if self.status:
                    self.output_video.write(self.frame)
            except AttributeError:
                pass


    def start_recording(self):
        self.record_thread.start()


if __name__ == '__main__':
    cam = VideoCamera('rtsp://<username>:<password>@<camera_ip>:<camera_port>')
    cam.start_recording()
导入操作系统
从线程导入线程
进口cv2
类摄像机(对象):
定义初始化(self,src=''):
self.capture=cv2.VideoCapture(src)
self.status=False
self.frame=self.capture.read()
self.frame_width=int(self.capture.get(3))
self.frame_height=int(self.capture.get(4))
self.codec=cv2.VideoWriter_fourcc(*'MJPG'))
self.video\u name=“video.avi”
self.output_video=cv2.VideoWriter(
self.video_名称,
self.codec,5,
(自框宽度、自框高度)
self.stream_thread=thread(target=self.update,args=())
self.record_thread=thread(target=self.record,args=())
self.stream\u thread.daemon=True
self.stream_thread.start()
def更新(自我):
尽管如此:
如果self.capture.isOpened():
(self.status,self.frame)=self.capture.read()
def记录(自我):
打印(“明细表”)
尽管如此:
打印('停止录制')
self.capture.release()
self.output_video.release()
cv2.destroyAllWindows()
打破
尝试:
如果是自我状态:
self.output\u video.write(self.frame)
除属性错误外:
通过
def start_记录(自):
self.record_thread.start()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
cam=摄像机('rtsp://:@:')
cam.start_录制()

每帧少于700k字节。你需要现实一点。另外,使用MJPG不会影响比特率。MJPG不过是一系列JPEG图像。如果您的相机大部分时间都显示静态图像,那么您应该切换到MPEG4或H264,这会进行帧间压缩。您可以尝试使用
self.output\u video.set(…)
来设置一些参数,但仅限于我在
C/C++
version的文档中找到的有关参数的信息。TimRoberts的医生谢谢你,你帮了我很多。我已经找了三天这个问题了,我刚刚把fourcc编解码器改成了
*'MP4V'
,它解决了我的问题。再次感谢。