录制mp4

目录

单线程保存mp4

[多线程保存mp4 rtsp](#多线程保存mp4 rtsp)

ffmpeg录制mp4


单线程保存mp4

python 复制代码
import cv2
import 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 =30
index = 0
count = 0
strat_record = False
while (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

python 复制代码
import cv2
import threading
import queue
import time

# 参数设置
url = "rtsp://admin:aa123456@192.168.1.64/h264/ch1/main/av_stream"
fps = 30
segment_time = 10  # 每段录制 10 秒
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

# 用于保存帧的队列
frame_queue = queue.Queue()
recording = False
stop_signal = False
video_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 = True
thread.join()
cv2.destroyAllWindows()

ffmpeg录制mp4

python 复制代码
import subprocess
import threading
import queue
import time
import cv2
import numpy as np

# === 参数设置 ===
rtsp_url = "rtsp://admin:aa123456@192.168.1.64/h264/ch1/main/av_stream"
width, height = 1280, 720
fps = 25
segment_time = 10  # 每段录制时间(秒)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

recording = False
stop_signal = False
video_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 = True
thread.join()
pipe.terminate()
cv2.destroyAllWindows()
相关推荐
彭祥.4 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
烛阴5 小时前
简单入门Python装饰器
前端·python
超龄超能程序猿5 小时前
(三)PS识别:基于噪声分析PS识别的技术实现
图像处理·人工智能·计算机视觉
好开心啊没烦恼5 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开5 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
Tony沈哲5 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
2301_805054566 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
万千思绪7 小时前
【PyCharm 2025.1.2配置debug】
ide·python·pycharm
Chef_Chen7 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
微风粼粼8 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo