Python进行ffmpeg推流和拉流rtsp、rtmp + AI模型推理

这篇具有很好参考价值的文章主要介绍了Python进行ffmpeg推流和拉流rtsp、rtmp + AI模型推理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

流媒体协议,英文学名Streaming Protocol,用一句人话来解释:流媒体协议是一种用于通过 Web 传递多媒体的协议。传统视频流协议:RTMP和RTSP,其中 RTMP 是基于 TCP 开发的,那么 RTSP 使用到了 UDP

1.RTMP(Real Time Messaging Protocol,实时消息协议)

  • 底层协议:TCP
  • 视频编解码器:H.264
  • 音频编解码器:AAC
  • 延迟:3 - 30 秒

RTMP 的最大优点是可以在服务器和客户端服务器之间保持稳定的连接,无论用户的互联网连接质量如何,它都可以无缝低延迟进行流媒体传输。这个技术主要通过将数据流分成相等的小部分(音频数据默认为 64 字节,视频数据默认为 128 字节)并将它们顺序传输到接收设备,然后将它们重新组合成视频流来实现的。

RTMP 工作原理 ⭐

  1. 摄像头捕获视频
  2. 通过编码器视频流传输到视频平台服务器
  3. 视频平台处理视频流
  4. 通过CDN分发到离用户最近的服务器
  5. 最后视频流就能成功的到达用户设备

那么这个环节中RTMP就起到了非常重要的作用,在视频从摄像头到服务器的过程中,RTMP将大量数据分割成小块并跨多个虚拟通道传输,在视频源和 RTMP 服务器之间提供了稳定和流畅的视频流。

2.RTSP(Real Time Streaming Protocol,实时流协议)

  • 底层协议:TCP 和 UDP
  • 视频编解码器:H.265
  • 音频编解码器:AAC
  • 延迟:2 秒

RTSP 工作原理 ⭐

  1. 用户设备向视频流平台发送 RTSP 请求
  2. 视频流平台返回可以操作的请求列表,比如播放、暂停等
  3. 用户设备向视频流平台发送具体的请求,比如播放
  4. 视频流平台解析请求并调用指定机制启动视频流处理

由于 RTSP 依赖于专用服务器,并且依赖于 RTP,因此该协议不支持加密视频内容或重传丢失的数据包。

推流,指的是把采集阶段封包好的内容传输到服务器的过程。
拉流,这个指的是用户端从服务器拉取语音视频流到客户端播放。
Python进行ffmpeg推流和拉流rtsp、rtmp + AI模型推理

更详细内容见:手撕RTSP协议系列

3.FFmpeg

FFmpeg 是一款用于多媒体处理的自由软件工具,基于 GPL 许可证发布。FFmpeg 提供的最核心的命令行工具是 “ffmpeg”,“ffmpeg” 命令行工具的主要特征是输出过程快、输出品质高、输出文件小。“FFmpeg” 中 “FF” 表示 “Fast Forward”,“mpeg” 表示 “Moving Pictures Experts Group”。

FFmpeg 提供如下四个命令行工具:

  • ffmpeg 音视频编码器/解码器
  • ffplay 媒体播放器
  • ffprobe 显示媒体文件信息
  • ffserver 多媒体流广播服务器,使用 HTTP 和 RTSP 协议。FFmpeg 4.1 版本已经删除 ffserver,新的替代者还未添加进来。

命令行实现:(和VLC工具等效)

ffmpeg推流rtsp

ffmpeg -re -i 1.mp4 -vcodec copy -codec copy -f rtsp rtsp://127.0.0.1:554/stream

推摄像头视频

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport udp -f rtsp rtsp://127.0.0.1/stream

ffplay拉流播放

ffplay rtsp://127.0.0.1:554/stream

测试使用的几个rtmp:

美国1: rtmp://ns8.indexforce.com/home/mystream
美国2: rtmp://media3.scctv.net/live/scctv_800
韩国GoodTV: rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp

4.python实现ffmpge的rtsp和rtmp推流拉流(待更)

调用FFmpeg建立了子进程(管道一个放共享文件的地方),并将RTSP流转化为RTMP流。然后我们对每一帧图像进行处理(使用AI算法)。最后推流代码将处理后的视频帧传递给FFmpeg子进程,从而实现推流。

# coding=gbk
# 本地摄像头推流
import cv2
import mediapipe as mp
import numpy as np
import subprocess as sp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_holistic = mp.solutions.holistic
mp_pose = mp.solutions.pose

# 调用ai算法进行帧处理并返回(这里使用Mediapipe骨骼点检测算法,读者可自行更改)
def frame_handler(image):
    with mp_holistic.Holistic(
            min_detection_confidence=0.5,
            min_tracking_confidence=0.5) as holistic:
        image.flags.writeable = False
        image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        results = holistic.process(image_rgb)
        if results.pose_world_landmarks is not None:
            # 判断是否捕获到人体
            coords = np.array(results.pose_world_landmarks.landmark)
            # 汇总所有点的XYZ坐标
            def get_x(each):
                return each.x
            def get_y(each):
                return each.y
            def get_z(each):
                return each.z
            # 分别获取关键点XYZ坐标
            points_x = np.array(list(map(get_x, coords)))
            points_y = np.array(list(map(get_y, coords)))
            points_z = np.array(list(map(get_z, coords)))
            # 将三个方向坐标合并
            points = np.vstack((points_x, points_y, points_z)).T
            # 画图
            image.flags.writeable = True
            # 在关节点渲染
            mp_drawing.draw_landmarks(
                image,
                results.pose_landmarks,
                mp_holistic.POSE_CONNECTIONS,
                landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
            image = cv2.flip(image, 1)
    return image

# 请读者自行修改url
# RTSP源地址src, 指定从哪里拉取视频流,测试时可以用VLC工具进行rtsp推流
src = "rtsp://:8554/"
# RTMP推流地址dst, 指定 用opencv把各种处理后的流(视频帧)推到哪里
dst = "rtmp://192.168.0.1:1935/live/test"
# 打开RTSP流,也可以用0,调用本地视频流,并取出视频流的帧率、帧宽、帧高
cap = cv2.VideoCapture(src)
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))

# 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',
           dst]

# 获取视频流的基本信息
fps = int(cap.get(cv2.CAP_PROP_FPS))
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))


# 建立子进程(配置管道)
pipe = sp.Popen(command, stdin=sp.PIPE)
# 循环读取视频流
while True:
    ret, frame = cap.read()  # 从视频流中获取一帧
    if not ret:
        raise IOError("could't open webcamera or video")
    # 处理代码(使用AI算法)
    frame_handler(frame)
    cv2.imshow('Video', frame)  # 显示处理结果

    # 推流代码
    # pipe.stdin.write(frame.tostring())

    # 按下q键退出
    if cv2.waitKey(1) == ord('q'):
        break

# 释放视频流
cap.release()
# 关闭窗口
cv2.destroyAllWindows()
# 关闭进程
pipe.stdin.close()
pipe.wait()

VLC推流 Python拉流处理后 显示效果:
Python进行ffmpeg推流和拉流rtsp、rtmp + AI模型推理
细节解析:

command 这个参数列表是用于在Python脚本中控制FFmpeg进程的一些参数。具体来说,这里我们使用FFmpeg进程来将视频流从本地相机或者RTSP流中读取出来并推流到RTMP服务器,这些参数的作用可以分为以下几个部分:
音频和视频格式
-y 表示覆盖输出文件。在这里,我们没有使用输出文件,所以这个参数的作用是防止在执行过程中出现询问是否覆盖的问题。
rawvideo 表示输出文件格式为raw video,即无压缩的视频数据。
-vcodec 表示视频编码器,这里我们使用的是raw video编码器。
-pix_fmt 表示视频像素格式,这里我们使用bgr24格式,即每个像素由三个字节组成,分别表示蓝、绿、红三个颜色通道的亮度值。
视频尺寸、帧率和编码
-s 表示视频尺寸,这里使用字符串格式化将 width 和 height 代入到尺寸参数中。
-r 表示视频帧率,即每秒钟显示的帧数。
-c:v 表示视频编码器类型,这里我们使用的是libx264编码器。
-pix_fmt 表示视频像素格式。由于使用了libx264编码器,这里我们使用yuv420p格式,即420 Planar格式,每个像素需要包含YUV三个颜色通道的信息。
-preset 表示编码速度的快慢,这里我们使用的是ultrafast模式。ultrafast模式下编码速度最快,但是视频质量也最差;如果需要更高的视频质量,则可以使用更高级别的preset模式,但是编码速度也会相应降低。
推流协议和参数
-f 表示输出文件格式,这里我们使用的是flv格式。
-g 表示I帧间隔数,即每隔多少帧产生一个I帧。这里我们使用的是5,表示每隔5个帧产生一个I帧,可以提高视频帧率和压缩比。
RTMP服务器地址
最后一个参数 dst 是需要推送到的RTMP服务器地址。
这些参数的原理和作用可以互相配合着理解,主要是控制FFmpeg进程进行视频录制或推流操作的各种参数。通过设置不同的参数,可以实现不同的录制或推流效果,同时也可以控制视频质量、编码速度、带宽占用率等方面的性能指标,以便满足不同应用场景的需求。

pipe = sp.Popen(command, stdin=sp.PIPE)使用了Python的subprocess模块中的Popen函数来创建一个子进程,并建立了一个管道。具体来说,它执行了以下操作:
通过调用subprocess.Popen()函数创建了一个子进程,该函数的第一个参数是一个命令字符串或一个包含命令及其参数的列表,表示要在子进程中执行的命令。(本文传入的是包含ffmpeg命令的参数列表)
通过指定stdin参数为sp.PIPE,将子进程的标准输入(stdin)与管道连接起来,这样就可以向子进程发送数据。
返回一个Popen对象,该对象代表了创建的子进程,并可以用它来与子进程进行交互。
总的来说,这段代码的作用是创建一个子进程,并建立了一个管道,使得主进程可以使用管道的stdin向子进程发送数据。这在很多场景下都是非常有用的,比如在父子进程之间进行通信、在主进程中启动一个后台进程等。

pipe.stdin.write(frame.tostring()) 是通过管道向子进程输入视频帧数据的方法。具体来说,该操作会将当前视频帧的二进制数据转换为字符串,然后通过管道将该字符串写入到FFmpeg子进程的标准输入(stdin)中。把处理后的图片放入管道, 让ffmpeg读取处理后的图像帧并进行rtmp推流即可。
在FFmpeg子进程启动后,会通过管道从标准输入(stdin)中读取数据并进行处理。在这个过程中,FFmpeg会根据指定的参数对视频进行编码压缩,最终生成一个压缩后的视频流;然后将该视频流通过网络协议推送到指定的RTMP服务器上。
因此,pipe.stdin.write(frame.tostring()) 的原理就是通过管道将视频帧数据传递给FFmpeg进程,并将其转化为RTMP格式进行推流。这是一种常见的视频流推流技术,可以用于实现视频直播等应用场景。文章来源地址https://www.toymoban.com/news/detail-463065.html

到了这里,关于Python进行ffmpeg推流和拉流rtsp、rtmp + AI模型推理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于开源的Micro-RTSP,使用VLC和ffmpeg拉流播放RTSP视频流,本例使用安信可ESP32 CAM进行推流。

    基于开源的Micro-RTSP,使用VLC和ffmpeg拉流播放RTSP视频流,本例使用安信可ESP32 CAM进行推流。 vlc播放命令为:rtsp://192.168.43.128:8554/mjpeg/1。 ffmpeg播放命令为:ffplay rtsp://192.168.43.128:8554/mjpeg/1。 使用ESP-IDF5.0编译成功。esp-idf-v4.4.2编译不成功,有成功的小伙伴可以分享一下。 git cl

    2024年02月01日
    浏览(47)
  • 利用FFmpeg实现windows和linux(federo系统)在局域网环境中的usb摄像头RTSP推流与拉流(在同一局域网下任意PC设备都可以进行拉流操作)

    FFmpeg 是一个免费、开源的跨平台视频和音频流处理工具。 首先,打开终端(在 Windows 中是命令提示符,在 Windows 搜索栏中输入“cmd”,然后打开命令提示符),然后运行以下命令以检查您的系统上是否已安装 FFmpeg: 转到 FFmpeg 官方网站,然后下载最新版本的 Windows 安装包。

    2024年02月02日
    浏览(51)
  • Qt/C++监控推流设备推流/延迟极低/实时性极高/rtsp/rtmp推流/hls/flv/webrtc拉流/调整分辨率降低带宽

    算下来这个推流的项目作品写了有四年多了,最初第一个版本只有文件点播的功能,用的纯QTcpSocket通信实现,属于比较简单的功能。由于文件点播只支持文件形式的推流,不支持网络流或者本地设备采集,所以迫切需要打破这个瓶颈,而后加入核心的网络推流功能,这也是本

    2024年04月13日
    浏览(40)
  • RTSP 和 RTMP通过ffmpeg实现将本地摄像头推流到RTSP服务器

    一、流媒体:RTSP 和RTMP 1、RTSP 和 RTMP的工作原理 1)RTSP工作原理 用户设备向视频流平台发送 RTSP 请求 视频流平台返回可以操作的请求列表,比如播放、暂停等 用户设备向视频流平台发送具体的请求,比如播放 视频流平台解析请求并调用指定机制启动视频流处理 由于 RTSP 依

    2024年02月05日
    浏览(54)
  • RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器

    0、参考资料 秒懂流媒体协议 RTMP 与 RTSP 什么是RTMP 和 RTSP?它们之间有什么区别? RTSP和RTMP的区别是什么? 1、RTSP 和 RTMP的工作原理 1)RTSP工作原理 用户设备向视频流平台发送 RTSP 请求 视频流平台返回可以操作的请求列表,比如 播放、暂停 等 用户设备向视频流平台发送具

    2024年02月08日
    浏览(65)
  • 用EasyAVFilter(ffmpeg.dll)实现RTSP流转RTMP推流的demo示例Linux版

    ffmpeg.exe做拉流转推流不靠谱,不能产品化;avcodec、avfilter做拉流转推流门槛又太高;用EasyAVFilter将ffmpeg.c改成ffmpeg.dll,用起来刚刚好,直接上示例代码: Demo下载地址:https://www.easydarwin.org/tools/153.html

    2024年02月21日
    浏览(53)
  • QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(四)

    QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954626 QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(二) https://xiaolong.blog.csdn.net/article/details/126958188 QT软件开发-基于FFMPEG设计录屏与rt

    2023年04月19日
    浏览(57)
  • 什么是视频推流和视频拉流?

    随着互联网的迅猛发展,视频成为了人们日常生活中不可或缺的一部分。而在视频的传输过程中,视频推流和视频拉流技术扮演了重要的角色。本文将详细介绍视频推流和视频拉流的概念、原理、应用领域以及涉及的技术。 概念 视频推流是指将实时的视频数据从一个源端发

    2024年02月09日
    浏览(35)
  • windows环境下实现ffmpeg本地视频进行rtsp推流

    摘要:有时候服务端(如linux)或者边缘端(jetson盒子)需要接受摄像头的视频流输入,而摄像头的输入视频流一般为rtsp,测试时需要搭建摄像头环境,很不方便,因此需要对本地视频进行rtsp推流,模拟摄像头的rtsp输入。 本地使用windows10, 64位 rtsp下载地址:https://github.com

    2024年04月13日
    浏览(37)
  • 视频推流测试——使用ffmpeg进行推流生成rtsp视频流

    在我们完成开发工作之后,需要通过推流的形式来验证能否正确接收视频流,并送入视频检测程序。笔者在这里使用的是业内最为常用的ffmpeg。具体方法如下。 访问ffmpeg的官网,地址为https://ffmpeg.org/download.html,按照如下途中来选择下载。 下载完成后,会得到一个zip格式的压

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包