Python读取和推送RTMP流

标签: 无 分类: 未分类 创建时间:2024-08-31 04:15:00 更新时间:2024-12-03 13:01:37

1.前言

上面几章实现了目标检测的环境搭建,视频和图像的检测,接下来还有就是实时视频或者是摄像头的直播推送。

2.读取推流地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import cv2

cap = cv2.VideoCapture('rtmp://localhost/live/livestream')

while(True):
# Capture frame-by-frame
ret, frame = cap.read()

# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
参考文章:
【1】.python opencv播放rtmp流 这里是 rtmp 的地址,和 m3u8 的差不多
【2】.Python读取推流地址Rtsp、Rtmp、Http 这里是 m3u8 的地址

3.视频推流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import cv2
import subprocess

rtsp = "rtsp://admin:a12345678@10.10.8.101:554/h264/ch1/main/av_stream"
rtmp = 'rtmp://localhost:1935/mylive/test'

# 读取视频并获取属性
cap = cv2.VideoCapture(rtsp)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
sizeStr = str(size[0]) + 'x' + str(size[1])

command = ['ffmpeg',
'-y', '-an',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', sizeStr,
'-r', '25',
'-g', '5'
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmp]

pipe = subprocess.Popen(command
, shell=False
, stdin=subprocess.PIPE
)

while cap.isOpened():
success,frame = cap.read()
if success:
'''
对frame进行识别处理
'''
if cv2.waitKey(1) & 0xFF == ord('q'):
break
pipe.stdin.write(frame.tostring())

cap.release()
pipe.terminate()
参考文章:
【1】.opencv读取rtsp图像处理后推流rtmp 这里安装了 nginx ,配置了rtmp模块,然后进行了推流
【2】.OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现) 首先要区分说明一下,人脸检测与人脸识别是不一样的。检测只是将图像中的人脸框出或作其他突出显示,人脸识别则需要预先将人脸录入,当图像、视频中出现人脸时,对人脸进行检测,再将得到数据与录入的进行匹配,识别判断,人脸考勤机是人脸识别最常见的应用。因此,人脸识别要比人脸检测更复杂一些。
【3】.【python】使用ffmpeg+opencv读取摄像头并推流到rtmp服务器 这里也用了 pipe.stdin.write(img.tobytes()) 推流
【4】.python rtsp图像处理后实现rtmp推流的代码 这里提到了一个 from pyrtmp import PyRTMP:1.从RTSP流获取视频帧;2.对视频帧进行图像处理;3.创建RTMP连接;4.推送处理后的视频帧到RTMP服务器。
【5】.使用python-ffmpeg推流 1.安装python-ffmpeg库;2.导入所需模块;3.创建一个ffmpeg实例;4.设置输入文件;5.设置输出文件;4.开始推流;
【6】.Python OpenCV 在视频上添加文字后保存视频 这里将视频添加上了文字,然后进行了播放。我采用了这个里面的代码,然后搞定了这个视频流从一个地方到另外一个地方的测试。

4.读取rtmp处理后输出rtmp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import cv2

videoUrl = "rtmp://xxx:10009/live/test"
rtmp = 'rtmp://xxx:10009/live/test2'
# 读取视频并获取属性
cap = cv2.VideoCapture(videoUrl)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
sizeStr = str(size[0]) + 'x' + str(size[1])

command = ['ffmpeg',
'-y', '-an',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', sizeStr,
'-r', '25',
'-i', '-',
'-tune', 'zerolatency',#零延迟
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmp]

pipe = subprocess.Popen(command
, shell=False
, stdin=subprocess.PIPE
)

#获取视频帧率
fps_video = cap.get(cv2.CAP_PROP_FPS)
#设置写入视频的编码格式
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
#获取视频宽度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
#获取视频高度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
####重要
videoWriter = cv2.VideoWriter(result_video, fourcc, fps_video, (frame_width, frame_height))

#####可以做其他更改
frame_id = 0
while (cap.isOpened()):
ret, frame = cap.read()
if ret == True:
# 处理视频帧,加入文字
frame_id += 1
left_x_up = int(frame_width / frame_id)
left_y_up = int(frame_height / frame_id)
right_x_down = int(left_x_up + frame_width / 10)
right_y_down = int(left_y_up + frame_height / 10)
#文字坐标
word_x = left_x_up + 5
word_y = left_y_up + 25
cv2.rectangle(image_np_with_detections, (left_x_up, left_y_up), (right_x_down, right_y_down), (55,255,155), 5)

# 输出rtmp
pipe.stdin.write(image_np_with_detections)
# 判断是否到达帧尾,如果是则重新设置
frame_counter += 1
if frame_counter == int(cap.get(cv2.CAP_PROP_FRAME_COUNT)):
frame_counter = 0
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
else:
videoWriter.release()
break
参考文章:
【1】.如何配置ffmpeg的推流参数来缩短推流间隔 1.设置推流时的帧率:-r 参数,可以设置为30、60等等,即每秒发送多少帧视频。2.设置推流码率:-b:v 参数,可以设置为较高的值,比如2000K,以提高视频传输速率。使用更低的分辨率:-s 参数,可以将分辨率设置为较低的值,比如640x360等等,以减少视频大小和传输时间。
【2】.ffmpeg推流制定码率帧率
【3】.ffmpeg实例,比特率码率(-b)、帧率(-r)和文件大小(-fs)相关操作 1.帧率(Frame rate)也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。2.码率也叫比特率(Bit rate)(也叫数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
【4】.通过opencv+ffmpeg摄像头推流
【5】.python ffmpeg 推流 python rtmp推流 1、直接调用ffmpeg命令。2、使用ffmpeg-python包。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。