当前位置: 首页 > news >正文

FFmpeg在python里推流被处理过的视频流

链式算法处理视频流

 视频源是本地摄像头

# coding=gbk
# 本地摄像头直接推流到 RTMP 服务器
import cv2
import mediapipe as mp
import subprocess as sp# 初始化 Mediapipe
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_holistic = mp.solutions.holisticholistic = mp_holistic.Holistic(min_detection_confidence=0.7,min_tracking_confidence=0.7
)# AI 算法处理帧
def frame_handler(image):image.flags.writeable = Falseimage_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)results = holistic.process(image_rgb)if results.pose_world_landmarks is not None:image.flags.writeable = Truemp_drawing.draw_landmarks(image,results.pose_landmarks,mp_holistic.POSE_CONNECTIONS,landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())return image# 设置摄像头
camera_index = 0
cap = cv2.VideoCapture(camera_index)
if not cap.isOpened():raise IOError("无法打开本地摄像头")# 设置分辨率和帧率
width, height = 640, 360  # 分辨率
fps = 15                 # 帧率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
cap.set(cv2.CAP_PROP_FPS, fps)# FFmpeg 推流地址
dst = "rtmp://localhost:1935/live/dest-local"# FFmpeg 推流命令
command = ['ffmpeg','-y',                  # 覆盖输出文件'-f', 'rawvideo',      # 输入原始视频流格式'-vcodec', 'rawvideo','-pix_fmt', 'bgr24',   # 像素格式'-s', f"{width}x{height}",  # 分辨率'-r', str(fps),        # 帧率'-i', '-',             # 从标准输入读取视频流'-c:v', 'libx264',     # 视频编码格式'-preset', 'ultrafast',  # 超快编码模式'-tune', 'zerolatency',  # 优化零延迟'-bufsize', '64k',       # 缓冲区设置较小'-maxrate', '1M',        # 最大码率控制'-g', '15',              # GOP(关键帧间隔,降低到 15 帧)'-f', 'flv',            # 输出格式dst
]# 启动 FFmpeg 子进程
pipe = sp.Popen(command, stdin=sp.PIPE)# 视频处理和推流
try:while True:ret, frame = cap.read()if not ret:print("无法读取摄像头数据,程序退出")break# 使用 Mediapipe 算法处理帧processed_frame = frame_handler(frame)# 将帧写入 FFmpeg 输入管道pipe.stdin.write(processed_frame.tobytes())# 显示处理结果cv2.imshow('Video', processed_frame)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break
finally:# 释放资源cap.release()cv2.destroyAllWindows()pipe.stdin.close()pipe.wait()print("程序结束")

视频流是网络流 :

# coding=gbk
# 网络摄像头直接推流到 RTMP 服务器
import subprocess as spimport cv2
import mediapipe as mp# 初始化 Mediapipe
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_holistic = mp.solutions.holisticholistic = mp_holistic.Holistic(min_detection_confidence=0.7,min_tracking_confidence=0.7
)# AI 算法处理帧
def frame_handler(image):image.flags.writeable = Falseimage_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)results = holistic.process(image_rgb)if results.pose_world_landmarks is not None:image.flags.writeable = Truemp_drawing.draw_landmarks(image,results.pose_landmarks,mp_holistic.POSE_CONNECTIONS,landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())return image# 设置网络摄像头地址
camera_index = "rtsp://admin:@xxzx@192.168.1.64:554/Streaming/Channels/101"  # 替换为你的网络摄像头地址
cap = cv2.VideoCapture(camera_index)
if not cap.isOpened():raise IOError(f"无法打开网络摄像头流:{camera_index}")# 设置分辨率和帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 自动获取分辨率宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 自动获取分辨率高度
fps = int(cap.get(cv2.CAP_PROP_FPS))  # 自动获取帧率# 如果获取失败,设置默认值
if fps == 0:fps = 15
if width == 0 or height == 0:width, height = 640, 360  # 设置默认分辨率# RTMP 推流地址
dst = "rtmp://localhost:1935/live/dest-net"# FFmpeg 推流命令
command = ['ffmpeg','-y',  # 覆盖输出文件'-f', 'rawvideo',  # 输入原始视频流格式'-vcodec', 'rawvideo','-pix_fmt', 'bgr24',  # 像素格式'-s', f"{width}x{height}",  # 分辨率'-r', str(fps),  # 帧率'-i', '-',  # 从标准输入读取视频流'-c:v', 'libx264',  # 视频编码格式'-preset', 'ultrafast',  # 超快编码模式'-tune', 'zerolatency',  # 优化零延迟'-bufsize', '64k',  # 缓冲区设置较小'-maxrate', '1M',  # 最大码率控制'-g', '15',  # GOP(关键帧间隔,降低到 15 帧)'-f', 'flv',  # 输出格式dst
]# 启动 FFmpeg 子进程
pipe = sp.Popen(command, stdin=sp.PIPE)# 视频处理和推流
try:while True:ret, frame = cap.read()if not ret:print("无法读取网络摄像头流,程序退出")break# 使用 Mediapipe 算法处理帧processed_frame = frame_handler(frame)# 将帧写入 FFmpeg 输入管道pipe.stdin.write(processed_frame.tobytes())# 显示处理结果cv2.imshow('Video', processed_frame)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break
finally:# 释放资源cap.release()cv2.destroyAllWindows()pipe.stdin.close()pipe.wait()print("程序结束")

相关文章:

FFmpeg在python里推流被处理过的视频流

链式算法处理视频流 视频源是本地摄像头 # codinggbk # 本地摄像头直接推流到 RTMP 服务器 import cv2 import mediapipe as mp import subprocess as sp# 初始化 Mediapipe mp_drawing mp.solutions.drawing_utils mp_drawing_styles mp.solutions.drawing_styles mp_holis…...

为什么推荐使用构造函数注入而非@Autowired注解进行字段注入

在 Spring 框架中,推荐使用构造函数注入而非Autowired注解进行字段注入,主要有以下几个原因: 1. 依赖不可变和空指针安全 构造函数注入:使用构造函数注入时,依赖在对象创建时就必须提供,一旦对象创建完成&…...

如何卸载和升级 Angular-CLI ?

Angular-CLI 是开发人员使用 Angular 的必备工具。然而,随着频繁的更新和新版本的出现,了解如何有效地卸载和升级 Angular-CLI 对开发人员来说至关重要。本指南提供了一个全面的、循序渐进的方法来帮助您顺利过渡到最新版本。 必备条件 确保您的系统上…...

在线excel编辑(luckysheet)

项目地址:Luckysheet: 🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 可以下载项目使用npm安装运行,也可以用cdn 加载excel文件(使用luckyexcel): …...

【ES6复习笔记】Symbol 类型及其应用(9)

一、Symbol 简介 Symbol 是 JavaScript 中的一种基本数据类型,它表示唯一的标识符。Symbol 的主要目的是防止属性名冲突,尤其是在多个代码库或模块中共享对象时。Symbol 值可以用作对象的属性名,这样可以确保属性名是唯一的,不会…...

[原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…...

【ES6复习笔记】Class类(15)

介绍 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,…...

【Golang 面试题】每日 3 题(六)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

openEuler安装OpenGauss5.0

OpenGauss5.0 Linux服务器 极简版 服务器安装 单节点安装 极简版安装 安装准备 获取安装包 下载地址:https://opengauss.org/zh/download/archive/版本选择:5.0.0 (LTS)系统架构:uname -m操作系统:cat /etc/os-release完整性校…...

20241230 机器学习ML -(1)线性回归(scikitlearn)

机器学习ML入门。 线性回归 ScikitLearnLRRidgeLassoElasticNetL2:解决共线性问题 (Colinearity Problem) L1:特征选择(AI的解释) W=XtX XtY (Xw=Y >> XtXw= XtY) 当 COND(Xtx) ~ infinit, 导致inv(XtX)无解 举例: 12 23 46 XtX=[14,28] [28,56] eigVal=det…...

MacOS下TestHubo安装配置指南

TestHubo是一款开源免费的测试管理工具, 下面介绍MacOS私有部署的安装与配置。TestHubo 私有部署版本更适合有严格数据安全要求的企业,支持在本地或专属服务器上运行,以实现对数据和系统的完全控制。 1、Mac 服务端安装 Mac安装包下载地址&a…...

mysql性能问题排查

生产环境 Mysql执行性能分析 问题排查思路通过 performance_schema 分析performance_schema 说明查询 performance_schema 所有表信息performance_schema 相关表 主要相关介绍events_statements_history 分析慢查询 和查询当时状态字段说明 问题排查思路 查询慢SQL日志查询SQL…...

centos单机部署seata

文章目录 场景分析下载seata包启动 场景 centos7.9 jdk17 安装部署seata 分析 jdk和seata的版本对应关系如图 JDK版本 推荐 Seata 版本 理由 JDK 8 任何 Seata 版本 JDK 8 是 Seata 长期支持的版本,兼容性最好。 JDK 11 Seata 1.2.0 适合需要长期支持且性能较高的应…...

YOLOv9-0.1部分代码阅读笔记-lion.py

lion.py utils\lion.py 目录 lion.py 1.所需的库和模块 2.class Lion(Optimizer): 1.所需的库和模块 # Lion优化器是一种新型的神经网络优化算法,由Google Brain团队通过遗传算法发现,全称为EvoLved SIgn MOmeNtum,意为“进化的符号动…...

运行Zr.Admin项目(前端)

1.确认环境信息 我这里装的是node16.17版本的 官网16版本的最新为v16.20.2,下载链接https://nodejs.org/dist/v16.20.2/node-v16.20.2-x64.msi 2.去掉ssl 进入到Zr.Admin项目根目录,进入到ZR.vue 打开package.json 文件,删除启动命令配置中…...

HarmonyOS NEXT 实战之元服务:静态多案例效果(一)

背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1代码案例如下: import { authentication } from…...

go下载依赖提示连接失败

1、现象 Go下载模块提示连接失败 dial tcp 142.251.42.241:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.…...

JS 异步 ( 二、Promise 的用法、手写模拟 Promise )

文章目录 一、Promise 基础Promise 作用Promise 语法Promise 内部状态值 和 链式调用Promise 是否为异步执行Promise 常用函数或属性 二、模拟 Promise,加深理解 一、Promise 基础 Promise 作用 1. 回调地狱 想知道 Promise 的作用, 需要先了解一个概念叫…...

五分钟学会如何在GitHub上自动化部署个人博客(hugo框架 + stack主题)

上一篇文章: 10分钟学会免费搭建个人博客(Hugo框架 stack主题) 前言 首先,想要实现这个功能的小伙伴需要完成几个前置条件: 有一个GitHub账号安装了git,并可以通过git推送commit到GitHub上完成第一篇文章…...

【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点

etcd 是一个高可用的分布式键值存储,广泛应用于存储服务发现、配置管理等场景。为了确保集群的稳定性和可扩展性,管理成员节点的添加、删除和更新变得尤为重要。本文将指导您如何在etcd集群中处理成员管理,帮助您高效地维护集群节点。 目录 …...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...