使用python读取网络视频流或者本地视频进行RTMP流的生成,并对视频源的每一帧做剪切处理
python读取网络视频流或者本地视频进行RTMP流的生成
想要获得RTMP推流的功能其实是可以用ffmpeg+ffserver通过命令行方式实现的,但是我为了对原视频流的帧做剪切处理,所以使用python调用ffmpeg来推流,这里只是生成推流,这是不够的,需要有一个代理服务器来接收推流并推向网络,关于代理服务器的配置请看文末的链接
以下是全部代码,需要注意以下几点:
- 主体是两个函数,通过两个线程调用,线程之间通过队列进行通信,读流线程将读取到的帧放入队列中,推流线程将队列中的帧取出来进行剪切处理并推流。
- 在处理帧的时候一定要注意将处理后的帧的fps设置为ffmpeg command中设置的width,height,不然推流会失败。 就是这一句代码:
image = cv2.resize(frame[int(left_x):int(right_x)][int(left_y):int(right_y)], (width, height))
- 不知道为什么在队列不为空的时候会出现队列中帧对象为NoneType的问题,所以在处理的时候我加了个判断条件。如果有大佬知道原因请在评论区留言,欢迎交流。
- 适应项目要求我剪切帧需要的参数是从文件中读取的,使用时可换成别的方式
import subprocess as sp
import cv2
import sys
import queue
import threadingframe_queue = queue.Queue()
rtmpUrl = "rtmp://IP地址/live/test"
camera_path = 'rtmp://58.200.131.2:1935/livetv/hunantv' #这是湖南台的实时直播流#获取摄像头参数
cap = cv2.VideoCapture(camera_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))#print(fps, width, height)# ffmpeg command
command = ['ffmpeg','-y','rawvideo','-vcodec', 'rawvideo','-pix_fmt', 'bgr24','-s', "{}x{}".format(width, height),'-r', str(fps),'-c:v', 'libx264','-pix_fmt', 'yuv420p','-preset', 'ultrafast','-f', 'flv','-g', '5',rtmpUrl]#读流函数
def Video():vid = cv2.VideoCapture(camera_path)if not vid.isOpened():raise IOError("could't open webcamera or video")while(vid.isOpened()):ret,frame = vid.read()#下面注释的代码是为了防止摄像头打不开而造成断流#if not ret:#vid = cv2.VideoCapture(camera_path)#if not vid.isOpened():#raise IOError("couldn't open webcamera or video")#continue frame_queue.put(frame)def push_stream(left_x,left_y,right_x,right_y):# 管道配置while True:if len(command)>0:p = sp.Popen(command, stdin=sp.PIPE)breakwhile True:if not frame_queue.empty():frame = frame_queue.get()if frame is not None:#我这里出现了frame为NoneType的情况,所以判断一下image = cv2.resize(frame[int(left_x):int(right_x)][int(left_y):int(right_y)], (width, height))p.stdin.write(image.tostring())def run(left_x,left_y,right_x,right_y):thread_video = threading.Thread(target=Video,)thread_push = threading.Thread(target=push_stream,args=(left_x,left_y,right_x,right_y,))thread_video.start()thread_push.start()if __name__ == "__main__":with open("zoomfile.txt", "r") as f: # 打开文件data = f.read() # 读取文件zoom = data.split("_")left_x = zoom[0]left_y = zoom[1]right_x = zoom[2]right_y = zoom[3]with open("zoomfile.txt","w") as f:f.write("0")run(left_x,left_y,right_x,right_y)
python代码参考了以下几篇博客:
python利用ffmpeg进行rtmp推流直播
Python 通过ffmpeg实现实时推流(ubuntu16+ffmpeg+nginx)
以下三篇博客是关于nginx服务器和RTMP配置的,都很有参考价值
Ubuntu安装nginx+rtmp
利用nginx搭建RTMP视频点播、直播、HLS服务器
使用 nginx 和 rtmp 插件搭建视频直播和点播服务器
使用python读取网络视频流或者本地视频进行RTMP流的生成,并对视频源的每一帧做剪切处理相关推荐
- Android 音视频深入 十七 FFmpeg 获取RTMP流保存为flv (附源码下载)
项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码我是从雷神那弄过来的,不愧是雷神,我就配个环境搞个界面就可以用代码了. 这一次说的是将RTMP流媒 ...
- 利用python读取tomcat中log文件提取出错误日志生成新的文件
人生苦短,我用python 废话不多说,直接上代码! #!/usr/bin/env python # coding=utf-8 import redef find_error_log(log_name ...
- python 读取excel一列的内容根据内容循环生成宏定义
可以使用 Python 中的 openpyxl 库来读取 Excel 文件. 下面是一个简单的例子,假设你有一个 Excel 文件 test.xlsx,其中第一列为内容,你想要读取第一列并根据内容生成 ...
- Python 读取excel数据并填入excel,批量生成模板
文章目录 一.问题-来源 二.问题-困难 三.问题-解决 总结 一.问题-来源 前几天,我姐遇见了一个难题:需要从excel表格中不断读取数据并生成个人信息模板 二.问题-困难 1.首先我想到了在wo ...
- python读取mat文件并画图_[宜配屋]听图阁
先给大家介绍下python读取并写入mat文件的方法 用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); sav ...
- python 读取mat文件,python读取并写入mat文件的方法
先给大家介绍下python读取并写入mat文件的方法 用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); sav ...
- FFmpeg混流:将两个视频放在一个画布并以rtmp流输出
1.将其中一个视频置于画布右下角(这种情况直播用的最多,这也是我用FFmpeg想要实现的效果) 命令如下: ./ffmpeg -i 飞驰人生HD国语中字.mkv -i 小丑BD中英双字.mp4 -fi ...
- 百度霸屏之视频被动引流实操总结
传统人的思维是怎么找客户,而互联网人的套路是怎么让客户主动加我们.确实,客源问题一直让很多做项目的朋友闹心,有时他们怎么也不明白,拥有好项目,又有团队,还具备很强的销售能力,可业绩就是做不起来. 虽然 ...
- python使用方法视频-python读取视频流提取视频帧的两种方法
本文实例为大家分享了python读取视频流提取视频帧的具体代码,供大家参考,具体内容如下 方法一:通过imageio库和skimage库 1. 安装环境: pip install imageio pi ...
最新文章
- 科研助力|计算机科学方向一对一科研项目
- asp自定义函数可以返回数组或者对象
- 河南经济管理学校2001级计算机,懂得取舍,习得自主——访管信2001级经英奖学金得主张瑞娟...
- 牛客网 【每日一题】5月11日题目精讲 Moovie Mooving
- 我好像明白了如何画序列图了
- 卡耐基梅隆计算机学院,卡内基梅隆计算机学院--计算机系简介
- gatk过滤_重测序2--看了不后悔的gatk-变异检测
- lnmp python _mysql web_Nginx+uWSGI+DJango+Python+ Mysql 搭建可靠的python web服务器
- MySQL四种事务隔离级的说明
- pdf格式文件转换成mobi
- 编程中怎么理解抽象的概念
- python日历代码_python日历代码
- IOS菜鸟初学第八篇:接入京东联盟sdk,可打开任意京东的链接
- Spring-IoC注解
- 免费图书的检索和获取途径
- Java各种学习资源(视频+文档)
- vue滑动窗口_vue-floating 浮窗组件、封装基于better-scroll的滑动组件、vue自定义手势指令...
- 【Eclipse下载与安装教程】
- 自己写的基金投资分析系统,这只基你们觉得怎么样?
- 雷神ZERO游戏本和ROG冰刃5Plus的 区别 选哪个