详细介绍:录制mp4

news/2025/10/8 17:38:16/文章来源:https://www.cnblogs.com/lxjshuju/p/19129893

目录

单线程保存mp4

多线程保存mp4 rtsp

ffmpeg录制mp4


单线程保存mp4

import cv2import imageio cv2.namedWindow('photo', 0)  # 0窗口大小可以任意拖动,1自适应cv2.resizeWindow('photo', 1280, 720)url ="rtsp://admin:aa123456@192.168.1.64/h264/ch1/main/av_stream"cap = cv2.VideoCapture(1)ret = cap.isOpened()imgs = []fps =30index = 0count = 0strat_record = Falsewhile (ret):    ret, img = cap.read()    if not ret: break    cv2.imshow('photo', img)    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)    if strat_record:        imgs.append(img)    index +=1    if index %300 == 299 and strat_record:        count+=1        save_video_path = f'lanqiu_{count}.mp4'        imageio.mimsave(save_video_path, imgs, fps=fps, macro_block_size=None)        imgs=[]     key = cv2.waitKey(1) & 0xFF    if key == ord('q'):        break    elif key == ord('s'):        strat_record = True        print("start_record", strat_record)    elif key == ord('e'):        strat_record = False        print("end_record", strat_record)cap.release()save_video_path = f'lanqiu_{count}.mp4'imageio.mimsave(save_video_path, imgs, fps=fps, macro_block_size=None)

多线程保存mp4 rtsp

import cv2import threadingimport queueimport time # 参数设置url = "rtsp://admin:aa123456@192.168.1.64/h264/ch1/main/av_stream"fps = 30segment_time = 10  # 每段录制 10 秒fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 用于保存帧的队列frame_queue = queue.Queue()recording = Falsestop_signal = Falsevideo_count = 0 # 保存线程函数def save_video_worker():    global video_count    while True:        if stop_signal and frame_queue.empty():            break         frames = []        start_time = time.time()        while time.time() - start_time < segment_time:            try:                frame = frame_queue.get(timeout=1)                frames.append(frame)            except queue.Empty:                continue         if frames:            h, w = frames[0].shape[:2]            video_count += 1            save_path = f'lanqiu_{video_count}.mp4'            out = cv2.VideoWriter(save_path, fourcc, fps, (w, h))            for f in frames:                out.write(f)            out.release()            print(f"[保存完成] {save_path}") # 启动摄像头cap = cv2.VideoCapture(url)ret = cap.isOpened() cv2.namedWindow('photo', 0)cv2.resizeWindow('photo', 1280, 720) # 开启保存线程(一直运行,直到设置 stop_signal)thread = threading.Thread(target=save_video_worker)thread.start() while ret:    ret, frame = cap.read()    if not ret:        break     cv2.imshow('photo', frame)     key = cv2.waitKey(1) & 0xFF    if key == ord('q'):        break     elif key == ord('s') and not recording:        recording = True        print("[开始录制]")     elif key == ord('e') and recording:        recording = False        print("[停止录制]")     if recording:        frame_queue.put(frame.copy())  # 用 copy 避免线程间冲突 cap.release()stop_signal = Truethread.join()cv2.destroyAllWindows()

ffmpeg录制mp4

import subprocessimport threadingimport queueimport timeimport cv2import numpy as np # === 参数设置 ===rtsp_url = "rtsp://admin:aa123456@192.168.1.64/h264/ch1/main/av_stream"width, height = 1280, 720fps = 25segment_time = 10  # 每段录制时间(秒)fourcc = cv2.VideoWriter_fourcc(*'mp4v') recording = Falsestop_signal = Falsevideo_count = 0 frame_queue = queue.Queue() # === 保存线程函数 ===def save_video_worker():    global video_count    while not stop_signal or not frame_queue.empty():        frames = []        start_time = time.time()        while time.time() - start_time < segment_time:            try:                frame = frame_queue.get(timeout=1)                frames.append(frame)            except queue.Empty:                continue         if frames:            video_count += 1            out = cv2.VideoWriter(f'video_segment_{video_count}.mp4', fourcc, fps, (width, height))            for f in frames:                out.write(f)            out.release()            print(f"[保存完成] video_segment_{video_count}.mp4") # === 启动 FFmpeg 读取 RTSP ===ffmpeg_cmd = [    r'E:\soft\ffmpeg-7.1.1-full_build\ffmpeg-7.1.1-full_build\bin\ffmpeg.exe',    '-rtsp_transport', 'tcp',    '-i', rtsp_url,    '-f', 'rawvideo',    '-pix_fmt', 'bgr24',    '-vf', f'scale={width}:{height}',    '-'] pipe = subprocess.Popen(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, bufsize=10**8) # === 启动保存线程 ===thread = threading.Thread(target=save_video_worker)thread.start() # === 实时显示和按键控制 ===cv2.namedWindow("photo", 0)cv2.resizeWindow("photo", width, height) try:    while True:        raw_frame = pipe.stdout.read(width * height * 3)        if not raw_frame:            print("视频读取失败,退出")            break         frame = np.frombuffer(raw_frame, np.uint8).reshape((height, width, 3))        cv2.imshow("photo", frame)         key = cv2.waitKey(1) & 0xFF        if key == ord('q'):            break        elif key == ord('s') and not recording:            recording = True            print("[开始录制]")        elif key == ord('e') and recording:            recording = False            print("[停止录制]")         if recording:            frame_queue.put(frame.copy()) except KeyboardInterrupt:    print("中断退出") # === 清理资源 ===stop_signal = Truethread.join()pipe.terminate()cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站联盟如何实现深圳定制网站公司

LeetCode 118 生成杨辉三角&#xff08;Pascal’s Triangle&#xff09; 小白渣翻译 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 例子 这里是小白理解 那么这种题目一上来看&#xf…

【OpenGL ES】光栅化插值原理和射线拾取原理

1 前言 ​ 最近在推导光栅化插值公式和射线拾取公式,发现计算过程中有很多共同点,因此将它们放在一篇文章里介绍。具体共同点如下。都引入了四面体模型 都以四面体的三条边作为基向量构建坐标系(非直角坐标系) …

网站移动端推广佛山网站建设熊掌号

只针对不正常的情况才使用异常 异常只应该被用于不正常的条件&#xff0c;它们永远不应该被用于正常的控制流。《阿里手册》中&#xff1a;【强制】Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理&#xff0c;比如&#xff1a;Nu…

网站建设职业描述郑州网站免费制作

概述&#xff1a; el-switch 表示两种相互对立的状态间的切换&#xff0c;多用于触发「开/关」。 常见用法&#xff1a; 1、绑定v-model到一个Boolean类型的变量。可以使用active-color属性与inactive-color属性来设置开关的背景色。 2、使用active-text属性与inactive-tex…

塑料机械怎么做网站网站建设协议 模板

尽管 Hexo 支持 MarkDown&#xff0c;但是我们却不能像写单独的 MarkDown 文档时那样肆无忌惮。由于我们所写的文档是需要被解析为静态网页文件的&#xff0c;所以我们必须严格遵从 Hexo 的规范&#xff0c;这样才能解析出条理清晰的静态网页文件。新建文档 假设我们的文章名为…

HTML 速查列表 - 教程

HTML 速查列表 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

Exp1

Experiment 1 实验任务1 1.1 #include <stdio.h> int main() {printf(" O \n");printf("<H>\n");printf("I I\n");printf(" O \n");printf("<H>\n&qu…

20_uv_wsl_installation

windows11 #wsl 在Windows 11 WSL上安装uv的完整指南 概述 uv是由Astral公司开发的现代化Python包管理器和项目管理工具,用Rust编写,提供极快的速度和统一的工具链,可替代pip、pip-tools和virtualenv。 安装方法 方…

学习问题日记-4

在学习Docker时候,安装完所有配置了,配置源使用的是阿里云的,然后在测试安装是否成功时候,执行了一下以下命令: docker run hello-world 结果遇到了以下报错: docker: Error response from daemon: Get "ht…

Codeforces Round 1042 (CF2131) 补题笔记(A-E)

A. Lever 预计难度:红。 考察:语法。 对于所有满足 \(a_i>b_i\) 的下标 \(i\),累计 \(a_i-b_i\) 再加上 \(1\) 就是结果。因为忽略操作 \(1\) 时还迭代了一次所以要加 \(1\)。点击查看代码 #include <bits/st…

在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名AI编程助手框架需求探索

本文深入分析了一个专注于提升AI编程助手体验的开源项目,探讨其核心功能定位、应用场景和使用方式,并基于大量用户反馈识别出潜在的创新需求方向,为AI编程工具的未来发展提供参考。内容描述 核心功能定位 该项目是一…

表格数据自动机器学习技术解析

本文介绍了AutoGluon Tabular开源库,这是一个面向表格数据的自动机器学习工具。通过该工具,开发者仅需编写少量代码即可利用深度学习技术构建应用程序,涵盖自动机器学习技术在图像、文本和表格数据集上的应用。Auto…

网站开发 工作量公司网站开发步骤

前面博主写了一篇文章去介绍opentsdb的http接口的使用方法,但是某一些接口的使用还是比较复杂&#xff0c;这篇文章会通过example来详细讲述opentsdb的一些特性。 本文的举的例子有这些&#xff1a; 基本的写入和查询数据的注释和说明子查询查询中的filters使用查询数据的rat…

外链提高网站权重沈阳男科私立医院

普源示波器是一种常用的电子测试设备&#xff0c;它可以测量电路中的电压和电流波形。其中&#xff0c;测量相位差是示波器的一个重要功能&#xff0c;它可以用于分析信号的时间延迟、相位差、频率响应等信息。本文将介绍普源示波器测量相位差的原理和方法&#xff0c;并通过实…

广州定制网站建设毕业设计做网站 答辩会问什么问题

1、添加记录(INSERT)使用SQL语句的INSERT命令可以向数据库中插入记录&#xff0c;INSERT命令的基本形式为&#xff1a;INSERT INTO 表名 [(字段名1,字段名2…)] VALUES (值1,值2,…)若在输入记录时&#xff0c;每个字段均有内容&#xff0c;可省略表名后的字段名。该SQL语句用于…

10/8

Java方法与递归学习实践总结 在Java方法章节的学习中,我最大的收获并非仅仅掌握了语法规则,而是体会到“结构化编程”背后的思维逻辑——用“方法”将复杂问题拆解、复用,用巧劲替代重复的蛮力,这与课件中“懒人造…

2025.10.8

file:///C:/Users/lenovo/Desktop/Java%20%E6%A0%B8%E5%BF%83%E5%9F%BA%E7%A1%80%E5%AE%9E%E9%AA%8C%E6%96%87%E6%A1%A310.8.docx

【QT】QString 与QString区别 - 教程

【QT】QString& 与QString区别 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

[Python/地图] 基于Python绘制地图

0 概述:基于Python绘制地图 1 基于 PyEcharts 绘制地图 PyEchart库pyecharts 是一个基于 百度开源的 Apache ECharts 的 Python 数据可视化库。ECharts 是一个使用 JavaScript 实现的开源可视化库,而 Pyecharts 则是…