热门标签 | 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
在这里插入图片描述


推荐阅读
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • LeetCode: 实现队列与栈的高级应用
    本文介绍如何使用队列和栈实现特定功能,包括动态维护队列元素并计算其平均值,以及栈操作中的优化技巧。 ... [详细]
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社区 版权所有