使用 MediaMTX 和 FFmpeg 推拉 RTSP 流媒体

news2024/10/7 2:27:29

实时流传输协议 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......... UDP
     tcp                          ED......... TCP
     udp_multicast                .D......... UDP multicast
     http                         .D......... HTTP tunneling
     https                        .D......... HTTPS tunneling
  -rtsp_flags        <flags>      .D......... set RTSP flags (default 0)
     filter_src                   .D......... only receive packets from the negotiated peer IP
     listen                       .D......... wait for incoming connections
     prefer_tcp                   ED......... try RTP via TCP first, if available
     satip_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......... Video
     audio                        .D......... Audio
     data                         .D......... Data
     subtitle                     .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 流媒体

要播放 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 和流路径。

如:
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

注意事项:

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

                                                                                         老徐,2024/5/2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea常用知识点随记

idea常用知识点随记 1. 打开idea隐藏的commit窗口2. idea中拉取Git分支代码3. idea提示代码报错&#xff0c;项目编译没有报错4. idea中实体类自动生成序列号5. idea隐藏当前分支未commit代码6. idea拉取新建分支的方法 1. 打开idea隐藏的commit窗口 idea左上角File→Settings…

Linux的软件包管理器-yum

文章目录 软件包的概念yum源的配置的原因yum的使用查看软件包安装软件卸载软件 软件包的概念 软件包(SoftWare Package)是指具有特定的功能&#xff0c;用来完成特定任务的一个程序或一组程序。可分为应用软件包和系统软件包两大类 在Linux系统中&#xff0c;下载安装软件的方式…

设计模式: 模板模式

目录 一&#xff0c;模板模式 二&#xff0c;特点 三&#xff0c;组成部分 四&#xff0c;实现步骤 五&#xff0c;案例 一&#xff0c;模板模式 模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它在超类中定义了一个算法的骨架&#…

React Native支持Tailwind CSS 语法

React Native支持Tailwind CSS 语法 一、前沿背景 回想下我们平时按照官方的规范进行书写样式是什么样&#xff1f; 是像下面这样&#xff1a; const MyComponent () > {return (<View><Text style{{ fontSize: 20 }}>开发者演示专用</Text></View…

每日一题(力扣213):打家劫舍2--dp+分治

与打家劫舍1不同的是它最后一个和第一个会相邻&#xff0c;事实上&#xff0c;从结果思考&#xff0c;最后只会有三种&#xff1a;1 第一家不被抢 最后一家被抢 2 第一家被抢 最后一家不被抢 3 第一和最后一家都不被抢 。那么&#xff0c;根据打家劫舍1中的算法 我们能算出在i…

【linux】进程间通信(匿名管道)

对于本篇文章我们采取三段论&#xff1a;是什么 为什么 怎么办。 目录 进程间为什么要通信&#xff1f;进程间如何通信&#xff1f;进程间怎么通信&#xff1f;匿名管道&#xff1a;匿名管道原理&#xff1a;代码示例&#xff1a;匿名管道的情况与特征&#xff1a; 进程间为什…

Debian 12 tomcat 9 catalina 日志信息 中文显示乱码

目录 问题现象 解决办法&#xff1a; 1、设定Debian locale 2、设定catalina.sh utf8字符集 问题现象 Debian 12 linux操作系统中&#xff0c;tomcat 9 catalina 启动日志输出 中文乱码 解决办法&#xff1a; 1、设定Debian locale 先确保系统本身就支持中文的 Debian …

【数据结构】算法的效率(时间复杂度和空间复杂度)

目录 一.算法的效率 二.时间复杂度 1.概念 2.大O的渐进表示法 3.常见时间复杂度计算举例 三.空间复杂度 四.常见复杂度对比 五. 复杂度的oj练习 1.消失的数字 2.轮转数字&#xff1a; 一.算法的效率 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空…

uniapp 异步加载级联选择器(Cascader,data-picke)

目录 Props 事件方法 inputChange事件回调参数说明&#xff1a; completeChange事件回调参数说明&#xff1a; temList 属性Object参数说明 defaultItemList 属性Object参数说明 在template中使用 由于uniapp uni-ui的data-picke 不支持异步作者自己写了一个 插件市场下…

Deep Learning Part Seven基于RNN生成文本--24.5.2

不存在什么完美的文章&#xff0c;就好像没有完美的绝望。 ——村上春树《且听风吟》 本章所学的内容 0.引子 本章主要利用LSTM实现几个有趣的应用&#xff1a; 先剧透一下&#xff1a;是AI聊天软件&#xff08;现在做的ChatGPT&#xff08;聊天神器&#xff0c;水论文高手…

Latex小技巧:将图索引、表索引加到目录;调整公式段前段后间距

LaTex将图索引、表索引加到目录中 LaTex中通过\listoffigures命令生成图索引&#xff1b;通过listoftables命令生成表索引。但是图索引和表索引默认不出现在目录中。 为了将图索引、表索引加到目录中&#xff0c;使用\addcontentsline{}{}{}命令&#xff1a; \tableofconten…

【STM32+HAL】SDIO+DMA模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片&#xff1a; STM32F407ZGT6 2、IDE&#xff1a; MDK-Keil软件 3、库文件&#xff1a;STM32F4xxHAL库 三、实现功能 实现用SDIODMA读写S…

实现优先队列——C++

目录 1.优先队列的类模板 2.仿函数的讲解 3.成员变量 4.构造函数 5。判空&#xff0c;返回size&#xff0c;返回队头 6.插入 7.删除 1.优先队列的类模板 我们先通过模板来进行初步了解 由上图可知&#xff0c;我们的模板里有三个参数&#xff0c;第一个参数自然就是你要存储的数…

WPF之可翻转面板

1&#xff0c;创建翻转面板的资源字典&#xff1a;FlippPanel.xaml。 无外观控件同样必须给样式指定类型&#xff08; <ControlTemplate TargetType"ss:FlipPanel">&#xff09;&#xff0c;相关详情参考&#xff1a;WPF之创建无外观控件-CSDN博客&#xff09…

Codeforces Round 943 (Div. 3) (A-G1) C++题解

目录 比赛链接 : A. Maximize? B. Prefiquence C. Assembly via Remainders D. Permutation Game E. Cells Arrangement F. Equal XOR Segments G1. Division LCP (easy version) G2. Division LCP (hard version) 比赛链接 : Dashboard - Codeforces Round 943 (…

【Spring】Spring中AOP的简介和基本使用,SpringBoot使用AOP

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、AOP简介 二、AOP个人浅谈 三、AOP中几个核心的方法注解 四、AOP中几个核心的属性 1.切入点&#xff08;PointCut&#xff09; 五、代码演示 1.SpringBoot引入依赖 2.定义一个AOP&#xff0c;也就是切面…

【数据库主从架构】

【数据库主从架构】 1. 什么是数据库的主从架构1.1 主从复制1.1.1 MySQL的主从主从复制技术三级目录 1. 什么是数据库的主从架构 随着公司业务线的增多&#xff0c;各种数据都在迅速增加&#xff0c;并且数据的读取流量也大大增加&#xff0c;就面临着数据安全问题&#xff0c;…

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1 1、 Dev.step(4)2、 Dev.step(-4) Dev.step(8)3、 Dev.turnLeft() Dev.step(4)4、 Dev.step(3) Dev.turnLeft() Dev.step(-1) Dev.step(4)5、 Dev.step(-1) Dev.step(3) Dev.step(-2) Dev.turnLeft() Dev.step(…

Servlet(一些实战小示例)

文章目录 一、实操注意点1.1 代码修改重启问题1.2 Smart Tomcat的日志1.3 如何处理错误 一. 抓自己的包二、构造一个重定向的响应&#xff0c;让页面重定向到百度主页三、让服务器返回一个html数据四、表白墙4.1 约定前后端数据4.2 前端代码4.3 后端代码4.4 保存在数据库的版本…

超强动画制作软件blender

blender中文手册&#xff1a;Blender 4.1 Manual Blender 是一款集3D建模、渲染、动画、视频编辑、音频处理、游戏设计等多功能于一体的软件。由于其开源性质&#xff0c;它拥有庞大的用户群体和活跃的开发者社区&#xff0c;这使得Blender的功能和性能得到了不断的提升和优化…