热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ffmpeg与opencv实现rtsp推流(基于ZLMediaKit实现)

文章目录前言代码总结前言之前记录过,GStreamer与opencv实现rtsp推流实现,这次通过ffmpeg与opencv并且搭配ZLMediaKi


文章目录

  • 前言
  • 代码
  • 总结




前言

之前记录过,GStreamer与opencv实现rtsp推流实现,这次通过ffmpeg与opencv并且搭配ZLMediaKit实现rtsp推流。




代码

import cv2
import time
import subprocess as sp
import multiprocessingclass stream_pusher(object):def __init__(self, rtmp_url=None, raw_frame_q=None): # 类实例化的时候传入rtmp地址和帧传入队列self.rtmp_url = rtmp_urlself.raw_frame_q = raw_frame_qfps = 20 # 设置帧速率# 设置分辨率width = 1920 # 宽height = 1080 # 高# 设置FFmpeg命令文本self.command = ['ffmpeg','-y','-f', 'rawvideo','-vcodec', 'rawvideo','-pix_fmt', 'bgr24','-s', "{}x{}".format(width, height),'-r', str(fps),'-i', '-','-c:v', 'libx264','-pix_fmt', 'yuv420p','-preset', 'ultrafast','-f', 'flv',self.rtmp_url]# 向服务器推送def push_frame(self):# 配置向os传递命令的管道p = sp.Popen(self.command, stdin=sp.PIPE)while True:if not self.raw_frame_q.empty(): # 如果输入管道不为空# 把帧和相关信息从输入队列中取出frame = self.raw_frame_q.get()# 把内容放入管道,放入后有os自己去执行p.stdin.write(frame.tostring())else:time.sleep(0.01)# 启动运行def run(self):# 定义一个子进程push_frame_p = multiprocessing.Process(target=self.push_frame, args=())push_frame_p.daemon = True # 把子进程设置为daemon方式push_frame_p.start() # 运行子进程if __name__ == '__main__':cap = cv2.VideoCapture("rtsp://admin:admin110@192.168.2.64:554/main")rtmpUrl = "rtmp://192.168.2.8/live/test666" # 用vcl等直播软件播放时,也用这个地址raw_q = multiprocessing.Queue() # 定义一个向推流对象传入帧及其他信息的队列my_pusher = stream_pusher(rtmp_url=rtmpUrl, raw_frame_q=raw_q) # 实例化一个对象my_pusher.run() # 让这个对象在后台推送视频流while True:_, raw_frame = cap.read()if not raw_q.full(): # 如果队列没满raw_q.put(raw_frame) # 送入队列cv2.waitKey(1)cap.release()print('finish')

效果如下:
在这里插入图片描述




总结

工作中总会遇到各种问题,解决一个记录一个,向着更优秀的程序员迈进!!!继续加油喽!!!
如果阅读本文对你有用,欢迎一键三连呀!!!
2021年8月31日20:38:34
在这里插入图片描述


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本文介绍了如何在 DB2 环境中创建和删除数据库编目。创建编目是连接新数据库的必要步骤,涉及获取数据库连接信息、使用命令行工具进行配置,并验证连接的有效性。删除编目则用于移除不再需要的数据库连接。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
author-avatar
mobiledu2502892717
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有