建网站公建网站公司,长春做网络推广的公司,抓取式网站建设,大连网络推广网站优化找哪家好一、引言
在本文中#xff0c;我们将详细介绍如何使用 Python 进行视频的推流操作。我们将通过两个不同的实现方式#xff0c;即单线程推流和多线程推流#xff0c;来展示如何利用 cv2#xff08;OpenCV#xff09;和 subprocess 等库将视频帧推送到指定的 RTMP 地址。这…一、引言
在本文中我们将详细介绍如何使用 Python 进行视频的推流操作。我们将通过两个不同的实现方式即单线程推流和多线程推流来展示如何利用 cv2OpenCV和 subprocess 等库将视频帧推送到指定的 RTMP 地址。这两种方式都涉及到从摄像头读取视频帧以及使用 ffmpeg 命令行工具将视频帧进行编码和推流的过程。
二、单线程推流
以下是单线程推流的代码
import cv2 as cv
import subprocess as spdef push_stream():# 视频读取对象cap cv.VideoCapture(0) fps int(cap.get(cv.CAP_PROP_FPS))w int(cap.get(cv.CAP_PROP_FRAME_WIDTH))h int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))ret, frame cap.read()# 推流地址rtmpUrl rtmp://192.168.3.33:1935/live/# 推流参数command [ffmpeg,-y,-f, rawvideo,-vcodec,rawvideo,-pix_fmt, bgr24,-s, {}x{}.format(w, h),-r, str(fps),-i, -,-c:v, libx264,-pix_fmt, yuv420p,-preset, ultrafast,-f, flv, rtmpUrl]# 创建、管理子进程pipe sp.Popen(command, stdinsp.PIPE, bufsize10 ** 8)# 循环读取while cap.isOpened():# 读取一帧ret, frame cap.read()if frame is None:print(read frame err!)continue# 显示一帧cv.imshow(frame, frame)# 按键退出if cv.waitKey(1) 0xFF ord(q):break# 读取尺寸、推流# imgcv.resize(frame,size)pipe.stdin.write(frame) # 关闭窗口cv.destroyAllWindows()# 停止读取cap.release()在这个单线程的实现中我们执行以下步骤
初始化视频读取对象 使用 cv2.VideoCapture(0) 来打开默认的摄像头设备。获取摄像头的帧率 fps、宽度 w 和高度 h 等参数。 设置推流地址和参数 定义 rtmpUrl 作为推流的目标地址。构造 ffmpeg 的命令列表 command该列表包含了一系列的参数如 -y 表示覆盖输出文件、-f rawvideo 表示输入格式为原始视频等。使用 sp.Popen 创建一个子进程将 ffmpeg 命令作为子进程运行并且将其输入管道 stdin 连接到我们的程序。 循环读取和推流 在一个 while 循环中不断读取摄像头的帧。若读取失败打印错误信息并继续。使用 cv2.imshow 显示当前帧同时监听 q 键按下 q 键时退出程序。将读取到的帧通过管道发送给 ffmpeg 进行推流。
三、多线程推流
以下是多线程推流的代码
import queue
import threading
import cv2 as cv
import subprocess as spclass Live(object):def __init__(self):self.frame_queue queue.Queue()self.command # 自行设置self.rtmpUrl self.camera_path def read_frame(self):print(开启推流)cap cv.VideoCapture(self.camera_path)# Get video informationfps int(cap.get(cv.CAP_PROP_FPS))width int(cap.get(cv.CAP_PROP_FRAME_WIDTH))height int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))# ffmpeg commandself.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.rtmpUrl]# read webcamerawhile(cap.isOpened()):ret, frame cap.read()if not ret:print(Opening camera is failed)break# put frame into queueself.frame_queue.put(frame)def push_frame(self):# 防止多线程时 command 未被设置while True:if len(self.command) 0:# 管道配置p sp.Popen(self.command, stdinsp.PIPE)breakwhile True:if self.frame_queue.empty()! True:frame self.frame_queue.get()# process frame# 你处理图片的代码# write to pipep.stdin.write(frame.tostring())def run(self):threads [threading.Thread(targetLive.read_frame, args(self,)),threading.Thread(targetLive.push_frame, args(self,))][thread.setDaemon(True) for thread in threads][thread.start() for thread in threads]在这个多线程的实现中我们使用了 threading 和 queue 库
类的初始化 创建一个 Live 类在 __init__ 方法中初始化帧队列 frame_queue、command、rtmpUrl 和 camera_path 等变量。 读取帧的线程方法 read_frame 方法中使用 cv2.VideoCapture(self.camera_path) 打开摄像头。获取摄像头的参数并构造 ffmpeg 命令。不断从摄像头读取帧并将帧放入队列 frame_queue 中。 推流的线程方法 push_frame 方法中等待 command 被设置然后使用 sp.Popen 启动 ffmpeg 子进程。从帧队列中取出帧并将其写入 ffmpeg 的输入管道进行推流。 启动线程 run 方法创建并启动两个线程一个用于读取帧一个用于推流并且将它们设置为守护线程。
四、代码解释和注意事项
单线程推流
这种方式相对简单适合初学者理解。但由于是单线程操作在处理复杂任务时可能会导致性能瓶颈特别是在同时进行视频显示、读取和推流的情况下可能会出现卡顿现象。
多线程推流
利用多线程可以将不同的任务分配给不同的线程提高性能。frame_queue 是一个线程安全的队列用于在两个线程之间传递帧数据避免了数据竞争问题。setDaemon(True) 使得线程在主线程结束时自动终止防止程序无法正常退出。
五、总结
通过上述代码和解释我们可以看到如何使用 Python 进行单线程和多线程的视频推流操作。单线程代码简单明了但性能可能受限多线程代码可以更好地处理高负载但也需要注意线程安全和资源管理等问题。在实际应用中我们可以根据具体的需求和硬件性能来选择合适的推流方式。同时我们可以进一步优化代码例如添加异常处理、优化帧处理逻辑等以提高程序的稳定性和性能。 文章转载自: http://www.morning.mnmrx.cn.gov.cn.mnmrx.cn http://www.morning.tmrjb.cn.gov.cn.tmrjb.cn http://www.morning.kxsnp.cn.gov.cn.kxsnp.cn http://www.morning.zdzgf.cn.gov.cn.zdzgf.cn http://www.morning.gctgc.cn.gov.cn.gctgc.cn http://www.morning.mjgxl.cn.gov.cn.mjgxl.cn http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn http://www.morning.swsrb.cn.gov.cn.swsrb.cn http://www.morning.yqrgq.cn.gov.cn.yqrgq.cn http://www.morning.zlnmm.cn.gov.cn.zlnmm.cn http://www.morning.fxygn.cn.gov.cn.fxygn.cn http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn http://www.morning.jbxfm.cn.gov.cn.jbxfm.cn http://www.morning.ghryk.cn.gov.cn.ghryk.cn http://www.morning.ssrjt.cn.gov.cn.ssrjt.cn http://www.morning.knlgk.cn.gov.cn.knlgk.cn http://www.morning.grpfj.cn.gov.cn.grpfj.cn http://www.morning.wbfg.cn.gov.cn.wbfg.cn http://www.morning.ydgzj.cn.gov.cn.ydgzj.cn http://www.morning.jyyw.cn.gov.cn.jyyw.cn http://www.morning.kqxng.cn.gov.cn.kqxng.cn http://www.morning.xhftj.cn.gov.cn.xhftj.cn http://www.morning.jcfdk.cn.gov.cn.jcfdk.cn http://www.morning.lxmmx.cn.gov.cn.lxmmx.cn http://www.morning.zwzwn.cn.gov.cn.zwzwn.cn http://www.morning.deanzhu.com.gov.cn.deanzhu.com http://www.morning.bzfwn.cn.gov.cn.bzfwn.cn http://www.morning.kgxrq.cn.gov.cn.kgxrq.cn http://www.morning.mtmph.cn.gov.cn.mtmph.cn http://www.morning.wqpm.cn.gov.cn.wqpm.cn http://www.morning.ywpcs.cn.gov.cn.ywpcs.cn http://www.morning.nzhzt.cn.gov.cn.nzhzt.cn http://www.morning.gyzfp.cn.gov.cn.gyzfp.cn http://www.morning.nkjjp.cn.gov.cn.nkjjp.cn http://www.morning.bhxzx.cn.gov.cn.bhxzx.cn http://www.morning.zpxwg.cn.gov.cn.zpxwg.cn http://www.morning.krjyq.cn.gov.cn.krjyq.cn http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn http://www.morning.hkswt.cn.gov.cn.hkswt.cn http://www.morning.youngbase.cn.gov.cn.youngbase.cn http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn http://www.morning.plfrk.cn.gov.cn.plfrk.cn http://www.morning.gcjhh.cn.gov.cn.gcjhh.cn http://www.morning.yntsr.cn.gov.cn.yntsr.cn http://www.morning.dbcw.cn.gov.cn.dbcw.cn http://www.morning.zcqbx.cn.gov.cn.zcqbx.cn http://www.morning.ngcsh.cn.gov.cn.ngcsh.cn http://www.morning.ftwlay.cn.gov.cn.ftwlay.cn http://www.morning.kpbgvaf.cn.gov.cn.kpbgvaf.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.lczxm.cn.gov.cn.lczxm.cn http://www.morning.bpttm.cn.gov.cn.bpttm.cn http://www.morning.fcftj.cn.gov.cn.fcftj.cn http://www.morning.wnxqf.cn.gov.cn.wnxqf.cn http://www.morning.bkxnp.cn.gov.cn.bkxnp.cn http://www.morning.xqgfy.cn.gov.cn.xqgfy.cn http://www.morning.gqtw.cn.gov.cn.gqtw.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.xxiobql.cn.gov.cn.xxiobql.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.zqsnj.cn.gov.cn.zqsnj.cn http://www.morning.hrkth.cn.gov.cn.hrkth.cn http://www.morning.nhbhc.cn.gov.cn.nhbhc.cn http://www.morning.yppln.cn.gov.cn.yppln.cn http://www.morning.mlnbd.cn.gov.cn.mlnbd.cn http://www.morning.fnkcg.cn.gov.cn.fnkcg.cn http://www.morning.xyyplp.cn.gov.cn.xyyplp.cn http://www.morning.zpqlf.cn.gov.cn.zpqlf.cn http://www.morning.rfhwc.cn.gov.cn.rfhwc.cn http://www.morning.pmysp.cn.gov.cn.pmysp.cn http://www.morning.xskbr.cn.gov.cn.xskbr.cn http://www.morning.dighk.com.gov.cn.dighk.com http://www.morning.zcqtr.cn.gov.cn.zcqtr.cn http://www.morning.fcwb.cn.gov.cn.fcwb.cn http://www.morning.wpmqq.cn.gov.cn.wpmqq.cn http://www.morning.lsyk.cn.gov.cn.lsyk.cn http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn http://www.morning.kkysz.cn.gov.cn.kkysz.cn http://www.morning.mpgfk.cn.gov.cn.mpgfk.cn http://www.morning.srmpc.cn.gov.cn.srmpc.cn