使用 MediaMTX 和 FFmpeg 推拉 RTSP 流媒体

2024-05-03 17:20

本文主要是介绍使用 MediaMTX 和 FFmpeg 推拉 RTSP 流媒体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实时流传输协议 RTSP(Real-Time Streaming Protocol)是 TCP/IP 协议体系中的一个应用层协议,由哥伦比亚大学、网景和 RealNetworks 公司提交的 IETF RFC 标准。该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP 在体系结构上位于 RTP 和 RTCP 之上,它使用 TCP 或 UDP 完成数据传输。

一、RTSP 适用场景:

  1. 视频监控和安防系统:RTSP 在视频监控领域具有广泛的应用。它可以实现监控视频的实时传输、回放、点播和存储等功能,适用于大规模的视频监控系统,如城市安防、企事业单位、交通监控等场景。
  2. 直播服务:RTSP 在直播服务中也发挥着重要作用。它可以实现音视频数据的实时传输和控制,确保直播的流畅性和稳定性。同时,RTSP 还支持多种媒体格式和编码方式,适应不同平台和设备的播放需求。
  3. 点播服务:除了直播外,RTSP 还适用于点播服务。用户可以通过 RTSP 协议向服务器请求特定的音视频资源,进行播放和观看。这种方式适用于视频库、在线教育、远程会议等场景。
  4. 视频会议和远程教育:RTSP 在视频会议和远程教育领域也具有一定的应用价值。它可以实现音视频数据的实时传输和控制,确保会议的顺利进行和远程教育的有效性。
  5. 流媒体服务器与媒体播放器之间的通信:RTSP 协议是流媒体服务器与媒体播放器之间的主要通信协议,用于建立和控制媒体会话。通过 RTSP 协议,媒体播放器可以向流媒体服务器请求媒体数据,实现音视频内容的播放。

二、FFmpeg 操作 RTSP 的参数:

FFmpeg 是一个非常强大的开源工具,可以用来处理音频和视频,也可以进行 RTSP 视频流的推拉。

要使用 FFmpeg 进行 RTSP 视频流的推拉,需要首先确保系统已经安装了 FFmpeg。在大多数 Linux 发行版中,可以通过包管理器(如 apt 或 yum)来安装。在 Windows 或 Mac 上,需要从 FFmpeg 的官方网站下载并安装。

安装完成后,可以通过下面的命令,来查询 FFmpeg 操作 RTSP 的参数:

        ffmpeg -h demuxer=RTSP

RTSP demuxer AVOptions:-initial_pause     <boolean>    .D......... do not start playing the stream immediately (default false)-rtsp_transport    <flags>      ED......... set RTSP transport protocols (default 0)udp                          ED......... UDPtcp                          ED......... TCPudp_multicast                .D......... UDP multicasthttp                         .D......... HTTP tunnelinghttps                        .D......... HTTPS tunneling-rtsp_flags        <flags>      .D......... set RTSP flags (default 0)filter_src                   .D......... only receive packets from the negotiated peer IPlisten                       .D......... wait for incoming connectionsprefer_tcp                   ED......... try RTP via TCP first, if availablesatip_raw                    .D......... export raw MPEG-TS stream instead of demuxing-allowed_media_types <flags>      .D......... set media types to accept from the server (default video+audio+data+subtitle)video                        .D......... Videoaudio                        .D......... Audiodata                         .D......... Datasubtitle                     .D......... Subtitle-min_port          <int>        ED......... set minimum local UDP port (from 0 to 65535) (default 5000)-max_port          <int>        ED......... set maximum local UDP port (from 0 to 65535) (default 65000)-listen_timeout    <int>        .D......... set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (from INT_MIN to INT_MAX) (default -1)-timeout           <int64>      .D......... set timeout (in microseconds) of socket I/O operations (from INT_MIN to I64_MAX) (default 0)-reorder_queue_size <int>        .D......... set number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) (default -1)-buffer_size       <int>        ED......... Underlying protocol send/receive buffer size (from -1 to INT_MAX) (default -1)-user_agent        <string>     .D......... override User-Agent header (default "Lavf60.3.100")

也可以参考《 FFmpeg 从入门到精通 》书里的内容:

三、安装 MediaMTX

MediaMTX(原名 rtsp-simple-server)是一个开源的实时媒体服务器和媒体代理,它允许用户发布、读取、代理、录制和播放视频和音频流。MediaMTX 是一个即用型、零依赖的工具,旨在简化媒体流的路由和管理。它通常被用作一个 “媒体路由器”,能够将媒体流从一个端点路由到另一个端点。通过使用 MediaMTX,开发者可以轻松地构建各种实时媒体应用,如视频直播、视频点播、视频会议等。

下载并安装 MediaMTX ,目前最新的 Windows 版本是: mediamtx_v1.8.0_windows_amd64.zip 。

四、使用 FFmpeg 发送 RTSP 流媒体

假设有一个视频文件(例如 input.mp4)并希望将其作为 RTSP 流发送,可以使用以下命令:

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f rtsp rtsp://your_rtsp_server/live/stream

命令参数:

    -re:以原始帧率读取输入(用于模拟实时流)。
    -i input.mp4:指定输入文件。
    -c:v libx264:使用 H.264 视频编码器。
    -preset veryfast:设置 x264 编码器的预设,这里选择了较快的预设以获得更快的编码速度。
    -maxrate-bufsize:设置比特率和缓冲区大小。
    -pix_fmt yuv420p:设置像素格式,这对于某些 RTSP 服务器是必需的。
    -g 50:设置关键帧间隔(GOP大小)。
    -c:a aac:使用 AAC 音频编码器。
    -b:a 160k:设置音频比特率。
    -ac 2:设置音频通道数为 2(立体声)。
    -ar 44100:设置音频采样率为 44100 Hz。
    -f rtsp:设置输出格式为 RTSP。
    rtsp://your_rtsp_server/live/stream:指定 RTSP 服务器的 URL 和流路径。

如:ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/videoFile_test

五、使用 FFplay 播放 RTSP 流媒体

ffplay 可以直接播放 RTSP 流。命令如下:

ffplay -i rtsp://your_rtsp_server/live/stream

ffplay -i rtsp://127.0.0.1:8554/videoFile_test

、使用 FFmpeg 录制 RTSP 流媒体

要录制 RTSP 流,可以使用以下命令:

ffmpeg -rtsp_transport tcp -i rtsp://your_rtsp_server/live/stream -c copy -f mp4 output.mp4

这个命令将 RTSP 流转码为 MP4 格式并保存在本地 output.mp4,采用 TCP 传输方式,可以避免缺省 UDP 传输模式可能丢包导致的花屏、绿屏、灰屏、马赛克等问题。

七、使用 FFmpeg 推送、拉取 RTSP 流媒体(摄像头作为源)

要使用 FFmpeg 发送和播放 RTSP 流媒体,并且以摄像头采集的视频作为源,需要按照以下步骤操作:

首先,需要确保摄像头已经被系统识别,可以通过一些命令方式(如 v4l2-ctl ffmpeg -list_devices true -f dshow -i dummy,对于Windows)来列出和选择。

然后,可以使用以下 FFmpeg 命令将摄像头采集的视频作为源,并发送到 RTSP 服务器:

ffmpeg -re -f v4l2 -input_format h264 -i /dev/video0 -c:v copy -an -f rtsp rtsp://your_rtsp_server/live/stream

命令参数:

    -f v4l2 指定输入格式为 Video4Linux2(Linux上常用的摄像头输入格式)。
    -input_format h264(如果摄像头直接输出 H.264 格式的话)。但通常摄像头输出的是原始格式(如 YUV),可能需要使用 -c:v libx264 来重新编码。
    /dev/video0 是摄像头在 Linux 上的常见设备路径,具体取决于摄像头和系统配置。在 Windows 上,可能需要使用如 dshow 这样的输入选项和设备名。
    -c:v copy 试图直接复制视频流(如果源是编码的格式),但如果源是原始格式,则需要用编码器(如 -c:v libx264)。
    -an 表示不包含音频流(因为摄像头通常不输出音频)。
    -f rtsp 指定输出格式为 RTSP。
    rtsp://your_rtsp_server/live/stream 是 RTSP 服务器的 URL 和流路径。

以摄像头为源,推送 RTSP 流媒体:

ffmpeg -f dshow -i video="HP Wide Vision HD Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/camera_test

 以摄像头为源,拉取 RTSP 流媒体:

ffplay -i rtsp://127.0.0.1:8554/camera_test

 拉取视频显示:

注意事项:

    如果摄像头输出的是原始格式而不是 H.264 编码的视频,需要使用视频编码器(如 -c:v libx264 )来重新编码视频流。
    可能需要根据摄像头和 RTSP 服务器的具体配置来调整 FFmpeg 命令中的参数。
    确保网络防火墙和安全设置允许 RTSP 流的传输。
    如果 RTSP 服务器需要身份验证或其他安全设置,需要在 URL 中包含这些信息,如 rtsp://username:password@your_rtsp_server/live/stream。

                                                                                         老徐,2024/5/2

这篇关于使用 MediaMTX 和 FFmpeg 推拉 RTSP 流媒体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957252

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没