python利用ffmpeg进行rtmp推流直播
思路:
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())
代码说明:
- rtmpUrl就是要接收视频的服务器了, 我做实验时是在自己机子上配置了一个nginx服务器接收视频流(ubuntu 不要通过apt安装哦, 请从源码安装, 因为apt安装的版本没有rtmp协议, 需要下载nginx源码然后配合nginx-rtmp-module这个东西安装 推荐一篇nginx安装教程)
- camera_path就是要进行直播的视频地址了
- 重点的代码其实就这几句:
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())
- 我读取的视频是rtsp网络摄像头的视频流, 但是一旦运行没多久就会出现 pipe broke 的报错(1080p视频), 不知道是什么原因, 若有大神还请指点指点
WriteN, RTMP send error 104 (129 bytes)
更新: 我改1080p为720p 暂时没出现这个问题
- 我在读取视频时候还遇到这个报错
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]
博主忙着做项目ing 能力也不是很高 欢迎和大家一起讨论 但是有的是真不会呀 还请见谅
python利用ffmpeg进行rtmp推流直播相关推荐
- 利用ffmpeg实现rtmp推流直播
我们这次利用ffmpeg实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123) 1.首先下载ffmpeg和ffplay 官方下载链接为:FFmpeg 下载后 ...
- 利用ffmpeg实现rtmp推流
https://www.jianshu.com/p/c141fc7881e7 ffmpeg 常见命令功能: 查看电脑设备: ffmpeg -list_devices true -f dshow ...
- 心得:大疆无人机RTMP推流直播(Windows版本已成功)
大疆无人机rtmp推流直播到电脑(Windows版本已成功) 一.所需资源 二.安装 三.ffmpeg推流 四.无人机rtmp推流 五.Python获取无人机实时视频 一.所需资源 1.nginx的G ...
- 无法找到CCTV直播MP4地址?七十行代码,简单使用FFplay直接观看还是下载CCTV栏目都轻松搞定(Python利用FLVCD硕鼠解析CCTV直播,FFplay播放并下载视频)
我们在每天使用新闻的时候大都会以CCTV发布的新闻为准,我们的每天新闻收视率最高的还是我们的总台,大家闲来无事可能也会看一下央视网提供视频直播吧,看看还可以,但是我们可以发现我们完全解析不了,大家看一 ...
- 干货:H.265编码RTMP推流直播摄像头
了解直播行业的同仁们都知道,前端采集的摄像机码率越小,整个直播链路成本就越小,而且给客户的直播体验更好,因为码率越小,占用的上行带宽越少,服务器存储成本越小,客户端播放的视频就越流畅. 叁陆伍视讯,成 ...
- java 直播rtmp推流_如何设置rtmp推流直播(斗鱼,腾讯云,yy等直播)?
如何设置rtmp推流直播(斗鱼,腾讯云,yy,虎牙,花椒等直播)? 一:打开软件-->开启任意通道, 打开源后,运行,预览窗口可以看到画面.有信号转播推流. 二:左下角主菜单-->系统配置 ...
- RTMP推流直播流媒体平台LiveQing鉴权直播拉转直播开放直播支持推送总流量和播放总流量统计
RTMP推流直播流媒体平台LiveQing鉴权直播拉转直播开放直播支持推送总流量和播放总流量统计 1.鉴权直播中的相关统计 2.拉转直播中的相关统计 3.RTMP推流视频直播和点播流媒体服务 1.鉴权 ...
- LiveQing视频点播RTMP推流直播服务支持H5无插件WebRTC超低延时视频直播
LiveQing视频点播RTMP推流直播服务支持H5无插件WebRTC超低延时视频直播 1.WebRTC超低延时视频直播 2.WebRTC延时对比 3.LiveQing播放WebRTC流 4.分屏页面 ...
- ffmpeg rtmp 封装发送函数_基于FFmpeg进行RTMP推流(一)
简介 开发环境 FFmpeg sdk下载 项目配置 代码流程 开发环境 vs 2017 FFmpeg sdk下载 下载地址 这里下载3.3.3 - 32bit - share和Dev 8.png Sh ...
最新文章
- 2022-2028年中国碘矿行业竞争格局分析及市场需求前景报告
- 什么情况下应不建或少建索引
- [css] 用css画出一把刻度尺
- http代理的脚本http_proxy.py
- 容器编排技术 -- Kubernetes 组件
- MyBatis复习(三):MyBatis核心对象SqlSessionFactory和SqlSession
- activiti报错ProcessEngines.getDefaultProcessEngine()为null
- Python之线程(二)
- 远程桌面和云主机,可以听到云主机内部的声音
- c++ createtoolhelp32snapshot取进程路径_理解进程和线程
- python里的collections模块
- 最新PS2022下载含安装操作步骤
- xmanager 出现Initialize Flexnet Service failed / Error code: 50003
- 高职高专院校人才培养工作水平评估工作感想
- codeforces920 C. Swap Adjacent Elements【连通块 + 前缀和】
- 第3关:球的表面积和体积
- 1.Btn、Div特效---利用border
- 抗疫逆行者网页作业 感动人物HTML网页代码成品 网页作业带JS下拉菜单 最美逆行者网页模板 致敬疫情感动人物网页设计制作
- 【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤
- 无人驾驶学习---第一课
热门文章
- Xmanager Enterprise 5破解版
- 商业银行管理(ROSE) 思维导图
- Python-Tkinter组件-Text简介
- ​2019胡润百富榜公布:中国互联网上演: 龙虎斗 , 阿里暂时领跑 , 企鹅紧随其后 , 李彦宏,雷军掉队...
- Volley,Glide,Swiperefreshlayout 简单使用
- android wifi无法连接手机号码,安卓手机无法使用WiFi连接ApowerMirror解决方法
- 『译』计算机体系结构发展史(四)
- [MOOC]物联网技术笔记-2.物联网的概念和特征
- c语言课程设计之简易计算器,简易计算器课程设计 帮忙写简单计算器课程设计...
- 计算机二级word邀请函制作步骤,利用邮件合并制作邀请函(2)