思路:

opencv读取视频 —> 将视频分割为帧 —> 将每一帧进行需求加工后 —> 将此帧写入pipe管道 —> 利用ffmpeg进行推流直播

pipe管道:

啥是pipe管道? 粗略的理解就是一个放共享文件的地方(理解不是很深刻。。。)
利用这个特点, 把处理后的图片放入管道, 让ffmpeg读取处理后的图像帧并进行rtmp推流即可

代码
import subprocess as sprtmpUrl = ""
camera_path = ""
cap = cv.VideoCapture(camera_path)# Get video information
fps = 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 command
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', rtmpUrl]# 管道配置
p = sp.Popen(command, stdin=sp.PIPE)# read webcamera
while(cap.isOpened()):ret, frame = cap.read()if not ret:print("Opening camera is failed")break# process frame# your code# process frame# write to pipep.stdin.write(frame.tostring())
代码说明:
  1. rtmpUrl就是要接收视频的服务器了, 我做实验时是在自己机子上配置了一个nginx服务器接收视频流(ubuntu 不要通过apt安装哦, 请从源码安装, 因为apt安装的版本没有rtmp协议, 需要下载nginx源码然后配合nginx-rtmp-module这个东西安装 推荐一篇nginx安装教程)
  2. camera_path就是要进行直播的视频地址了
  3. 重点的代码其实就这几句:
import subprocess as sp# ffmpeg command
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', rtmpUrl]# 管道配置
p = sp.Popen(command, stdin=sp.PIPE)# write to pipe
p.stdin.write(frame.tostring())
  1. 我读取的视频是rtsp网络摄像头的视频流, 但是一旦运行没多久就会出现 pipe broke 的报错(1080p视频), 不知道是什么原因, 若有大神还请指点指点
WriteN, RTMP send error 104 (129 bytes)

更新: 我改1080p为720p 暂时没出现这个问题

  1. 我在读取视频时候还遇到这个报错
error while decoding xxx


经过一方百度, 是“FFMPEG Lib对在rtsp协议中的H264 vidos不支持”的问题, 解决方法: 程序开启两个线程, 一个线程读取摄像头的帧, 另一个线程处理这帧图片, 这里还推荐一个大佬用队列处理视频的方法 ,大家可以套用一下啊 飞机票 多线程处理的版本

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应该替换为:# cap = cv.VideoCapture(self.camera_path)# 因为我这俩天遇到的项目里出现断流的毛病# 特别是拉取rtmp流的时候!!!!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, stdin=sp.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(target=Live.read_frame, args=(self,)),threading.Thread(target=Live.push_frame, args=(self,))][thread.setDaemon(True) for thread in threads][thread.start() for thread in threads]
  1. 感谢这篇博文提供了新的知识

博主忙着做项目ing 能力也不是很高 欢迎和大家一起讨论 但是有的是真不会呀 还请见谅

python利用ffmpeg进行rtmp推流直播相关推荐

  1. 利用ffmpeg实现rtmp推流直播

    我们这次利用ffmpeg实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123) 1.首先下载ffmpeg和ffplay 官方下载链接为:FFmpeg 下载后 ...

  2. 利用ffmpeg实现rtmp推流

    https://www.jianshu.com/p/c141fc7881e7 ffmpeg 常见命令功能: 查看电脑设备:     ffmpeg -list_devices true -f dshow ...

  3. 心得:大疆无人机RTMP推流直播(Windows版本已成功)

    大疆无人机rtmp推流直播到电脑(Windows版本已成功) 一.所需资源 二.安装 三.ffmpeg推流 四.无人机rtmp推流 五.Python获取无人机实时视频 一.所需资源 1.nginx的G ...

  4. 无法找到CCTV直播MP4地址?七十行代码,简单使用FFplay直接观看还是下载CCTV栏目都轻松搞定(Python利用FLVCD硕鼠解析CCTV直播,FFplay播放并下载视频)

    我们在每天使用新闻的时候大都会以CCTV发布的新闻为准,我们的每天新闻收视率最高的还是我们的总台,大家闲来无事可能也会看一下央视网提供视频直播吧,看看还可以,但是我们可以发现我们完全解析不了,大家看一 ...

  5. 干货:H.265编码RTMP推流直播摄像头

    了解直播行业的同仁们都知道,前端采集的摄像机码率越小,整个直播链路成本就越小,而且给客户的直播体验更好,因为码率越小,占用的上行带宽越少,服务器存储成本越小,客户端播放的视频就越流畅. 叁陆伍视讯,成 ...

  6. java 直播rtmp推流_如何设置rtmp推流直播(斗鱼,腾讯云,yy等直播)?

    如何设置rtmp推流直播(斗鱼,腾讯云,yy,虎牙,花椒等直播)? 一:打开软件-->开启任意通道, 打开源后,运行,预览窗口可以看到画面.有信号转播推流. 二:左下角主菜单-->系统配置 ...

  7. RTMP推流直播流媒体平台LiveQing鉴权直播拉转直播开放直播支持推送总流量和播放总流量统计

    RTMP推流直播流媒体平台LiveQing鉴权直播拉转直播开放直播支持推送总流量和播放总流量统计 1.鉴权直播中的相关统计 2.拉转直播中的相关统计 3.RTMP推流视频直播和点播流媒体服务 1.鉴权 ...

  8. LiveQing视频点播RTMP推流直播服务支持H5无插件WebRTC超低延时视频直播

    LiveQing视频点播RTMP推流直播服务支持H5无插件WebRTC超低延时视频直播 1.WebRTC超低延时视频直播 2.WebRTC延时对比 3.LiveQing播放WebRTC流 4.分屏页面 ...

  9. ffmpeg rtmp 封装发送函数_基于FFmpeg进行RTMP推流(一)

    简介 开发环境 FFmpeg sdk下载 项目配置 代码流程 开发环境 vs 2017 FFmpeg sdk下载 下载地址 这里下载3.3.3 - 32bit - share和Dev 8.png Sh ...

最新文章

  1. 2022-2028年中国碘矿行业竞争格局分析及市场需求前景报告
  2. 什么情况下应不建或少建索引
  3. [css] 用css画出一把刻度尺
  4. http代理的脚本http_proxy.py
  5. 容器编排技术 -- Kubernetes 组件
  6. MyBatis复习(三):MyBatis核心对象SqlSessionFactory和SqlSession
  7. activiti报错ProcessEngines.getDefaultProcessEngine()为null
  8. Python之线程(二)
  9. 远程桌面和云主机,可以听到云主机内部的声音
  10. c++ createtoolhelp32snapshot取进程路径_理解进程和线程
  11. python里的collections模块
  12. 最新PS2022下载含安装操作步骤
  13. xmanager 出现Initialize Flexnet Service failed / Error code: 50003
  14. 高职高专院校人才培养工作水平评估工作感想
  15. codeforces920 C. Swap Adjacent Elements【连通块 + 前缀和】
  16. 第3关:球的表面积和体积
  17. 1.Btn、Div特效---利用border
  18. 抗疫逆行者网页作业 感动人物HTML网页代码成品 网页作业带JS下拉菜单 最美逆行者网页模板 致敬疫情感动人物网页设计制作
  19. 【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤
  20. 无人驾驶学习---第一课

热门文章

  1. Xmanager Enterprise 5破解版
  2. 商业银行管理(ROSE) 思维导图
  3. Python-Tkinter组件-Text简介
  4. ​2019胡润百富榜公布:中国互联网上演: 龙虎斗 , 阿里暂时领跑 , 企鹅紧随其后 , 李彦宏,雷军掉队...
  5. Volley,Glide,Swiperefreshlayout 简单使用
  6. android wifi无法连接手机号码,安卓手机无法使用WiFi连接ApowerMirror解决方法
  7. 『译』计算机体系结构发展史(四)
  8. [MOOC]物联网技术笔记-2.物联网的概念和特征
  9. c语言课程设计之简易计算器,简易计算器课程设计 帮忙写简单计算器课程设计...
  10. 计算机二级word邀请函制作步骤,利用邮件合并制作邀请函(2)