GStreamer开发笔记(九):gst-rtcp-server安装和部署实现简单的rtsp-server服务器推流Demo

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/149054288

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

FFmpeg、SDL和流媒体开发专栏


上一篇:《GStreamer开发笔记(八):gstreamer代码打开usb摄像头》
下一篇:敬请期待…


前言

  Gstreamer还有一个重要的功能就是充当rtsp流媒体服务器。


注意

  本ubuntu是虚拟机,对延迟可能影响较大,延迟可作为参考,物理机可能更快。


Demo

  在这里插入图片描述


RTP和RTSP支持

  GStreamer对RTP和RTSP都有很好的支持,其RTP/RTSP栈多年来已被广泛应用于各种关键任务和低延迟场景的生产中,从小型嵌入式设备到大型视频会议和指挥控制系统。

安装gst和gst-rtsp-server

安装gstreamer1.0环境

sudo apt-get update
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
sudo apt-get install libglib2.0-0

查看本地gst版本

  在这里插入图片描述

下载对应版本GStreamer-rtsp-server

  下载地址:https://gstreamer.freedesktop.org/src/gst-rtsp-server/
  在这里插入图片描述


Ubuntu编译gstreamer-rtsp-server

步骤一:下载解压

cd ~/work/src
tar xvf gst-rtsp-server-1.16.3.tar.xz

  在这里插入图片描述

步骤二:配置

cd gst-rtsp-server-1.16.3/
./autogen.sh

  在这里插入图片描述

步骤三:出现配置错误“gtk-doc >= 1…12”

  在这里插入图片描述

sudo apt-get install gtk-doc-tools

  继续:

./autogen.sh

  完成:
  在这里插入图片描述

步骤四:编译

make -j4
make

  在这里插入图片描述

  在这里插入图片描述

步骤五:安装部署

sudo make install

  在这里插入图片描述

  在这里插入图片描述

步骤六:测试gst-rtsp-server

./test-launch "( v4l2src device=/dev/video0 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! mpph264enc ! rtph264pay name=pay0 pt=96 )"

  在这里插入图片描述

./test-launch “( videotestsrc ! video/x-raw,width=640,height=480,framerate=30/1 ! timeoverlay ! tee name=vsrc vsrc. ! queue ! videoconvert ! ximagesink vsrc. ! queue ! x264enc tune=zerolatency ! rtph264pay name=pay0 pt=96 )

  在这里插入图片描述

  在这里插入图片描述

  关掉防火墙重启,再次连接:
  在这里插入图片描述

  检查摄像头支持的格式:
  在这里插入图片描述

  推送测试视频流:

./test-launch "( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )"  

  在这里插入图片描述

  继续测试摄像头,增加调试宏:
  在这里插入图片描述

  在这里插入图片描述

  整理如下:
  在这里插入图片描述

  将:

./test-launch "( v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480,framerate=30/1 ! queue ! x264enc ! rtph264pay name=pay0 pt=96 )"

  改为:

./test-launch "(  v4l2src device=/dev/video0 ! video/x-raw, format='YUY2', width=640, height=480, framerate=30/1  ! queue ! x264enc ! rtph264pay name=pay0 pt=96 )"

  继续,报错:
  在这里插入图片描述

  修改:

GST_DEBUG=1 ./test-launch "( v4l2src device=/dev/video0 ! video/x-raw, format=YUY2, width=640, height=480, framerate=30/1  ! queue ! x264enc ! rtph264pay name=pay0 pt=96 )"

  继续:
  在这里插入图片描述

  修改:

./test-launch "( v4l2src device=/dev/video0 ! video/x-raw,format=YUY2,width=640,height=480,framerate=30/1 ! queue ! videoconvert ! x264enc ! rtph264pay name=pay0 pt=96 )"

  继续,播放了,延迟4-5s左右:
  在这里插入图片描述

  优化参数:

./test-launch "( v4l2src device=/dev/video0 ! video/x-raw,format=YUY2,width=640,height=480,framerate=30/1 ! queue ! videoconvert ! x264enc tune=zerolatency speed-preset=ultrafast ! rtph264pay name=pay0 pt=96 )"

  继续,延迟还有1.4s左右:
  在这里插入图片描述

  继续优化:

./test-launch "( v4l2src device=/dev/video0 ! video/x-raw,format=YUY2,width=640,height=480,framerate=30/1 ! queue max-size-buffers=1 max-size-bytes=0 max-size-time=0 ! videoconvert ! x264enc tune=zerolatency speed-preset=ultrafast ! rtph264pay name=pay0 pt=96 )"

  还是1.4s左右:
  在这里插入图片描述

步骤七:使用image/jepg格式

./test-launch "( v4l2src device=/dev/video0 ! image/jpeg,width=640,height=480,framerate=30/1 ! queue max-size-buffers=1 max-size-bytes=0 max-size-time=0 ! videoconvert ! x264enc tune=zerolatency speed-preset=ultrafast ! rtph264pay name=pay0 pt=96 )"

  在这里插入图片描述

  修改为:

GST_DEBUG=1 ./test-launch "( v4l2src device=/dev/video0 ! image/jpeg,width=640,height=480,framerate=30/1 ! queue max-size-buffers=1 max-size-bytes=0 max-size-time=0 ! jpegdec ! videoconvert ! x264enc tune=zerolatency speed-preset=ultrafast ! rtph264pay name=pay0 pt=96 )"

  在这里插入图片描述


与live555直接在getNextFramed对比

  在这里插入图片描述

   在这里插入图片描述

  此方法需要2秒多,且用的是mpeg。


上一篇:《GStreamer开发笔记(八):gstreamer代码打开usb摄像头》
下一篇:敬请期待…


本文章博客地址:https://blog.csdn.net/qq21497936/article/details/149054288

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

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

相关文章

C++ namespace机制以及同时使用多个namespace可能存在的问题

在一个 .cpp 文件中使用了多个 using namespace 会怎么样? 核心答案是:可能会导致“命名冲突(Name Collision)”和“二义性(Ambiguity)”,从而引发编译错误。 当你使用 using namespace SomeNam…

基于R语言的分位数回归技术应用

回归是科研中最常见的统计学研究方法之一,在研究变量间关系方面有着极其广泛的应用。由于其基本假设的限制,包括线性回归及广义线性回归在内的各种常见的回归方法都有三个重大缺陷:(1)对于异常值非常敏感,极少量的异常值可能导致结…

网络I/O模型详解-一次了解全部(面试经常会问到相关知识)

前言 网络I/O模型的五种类型,其实在我们开发程序、设计程序、实现程序的方方面面都一直存在着,本文从实现原理、使用场景、优缺点、详细的流程图等方面进行深入的解释,帮助大家更好的理解常用的五种网络io模型,助力大家在工作、面…

面试150 合并K个升序链表

思路 对链表元素进行获取,然后进行sort()排序,最后通过空节点建立链表法重新建立一个有序的链表,返回头节点即可。 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val …

BitDistiller:通过自蒸馏释放 Sub-4-Bit 大语言模型的潜力

温馨提示: 本篇文章已同步至"AI专题精讲" BitDistiller:通过自蒸馏释放 Sub-4-Bit 大语言模型的潜力 摘要 大语言模型(LLMs)的规模不断扩大,在自然语言处理方面取得了令人瞩目的进展,但这也带来…

JavaScript 的 `querySelector` 方法详解

querySelector 是 JavaScript 中用于选择 DOM 元素的最强大方法之一,它允许你使用 CSS 选择器语法来查找元素。 基本语法 // 返回文档中第一个匹配指定 CSS 选择器的元素 element document.querySelector(selectors);// 从指定元素后代中查找 element parentEle…

第九讲:C++中的list与forward_list

目录 1、list的介绍及使用 1.1、构造及赋值重载 1.2、迭代器 1.3、空间 1.4、访问 1.5、修改 1.6、操作 2、迭代器失效 3、list的模拟实现 4、forward_list介绍与使用 4.1、构造及赋值重载 4.2、迭代器 4.3、容量 4.4、访问 4.5、修改 4.6、操作 5、迭代器的分…

华为云数据库 GaussDB的 nvarchar2隐式类型转换的坑

bigint 与 nvarchar2比较时发生隐式类型转换的坑 1. 案例分析 假设: table1有下面两个字段:id:bigint, source_id nvarchar2(50)数据库中id 的值一定大于 int4 的最大值,例如存在一条单据: id1947854462980792321&…

spring boot 集成netty,及其一些基本概念

一、基本概念 1、channel:通道,入站或者出站数据的载体 2、ChannelHandler:通道处理器,业务逻辑写在这里面,netty 5版本将入战和出站合并成了ChannelHandler 3、ChannelPipeline:通道里的管道,是一个或者多…

7月23日华为机考真题第一题100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 bishipass.com 01. 创业投资收益优化 问题描述 K小姐刚刚大学毕业,手头有 m m m 元资金想要进行创业投资。她发现了 k k

HTML5 跨文档通信机制:postMessage API 详解与应用

postMessage 是 HTML5 规范中定义的跨文档通信(Cross-Document Messaging)API,其设计目的是解决不同源(协议、域名、端口任一存在差异)的窗口(如 iframe 嵌入的文档、window.open 创建的新窗口)…

Kafka——Kafka中的位移提交

引言:为什么位移提交至关重要?在Kafka的分布式消息系统中,消费者组(Consumer Group)通过分区分配机制实现负载均衡和容错,但如何准确记录每个消费者的消费进度,是保证消息不丢失、不重复的关键。…

java设计模式 -【装饰器模式】

装饰器模式的定义 装饰器模式(Decorator Pattern)是一种结构型设计模式,允许向一个现有对象动态添加新功能,同时不改变其结构。它通过创建包装对象(装饰器)来包裹原始对象,并在保持原始对象方法…

手写字体生成器:一键模拟真实笔迹

软件介绍 在自媒体创作领域,手写体文案因其独特的艺术感而备受青睐。然而,真实的手写往往效率低下且效果难以保证。今天为大家推荐一款专业的手写模拟软件,能够一键生成逼真的手写字体效果,完美解决创作效率与质量的双重需求。…

【Android】用 ViewPager2 + Fragment + TabLayout 实现标签页切换

文章目录【Android】用 ViewPager2 Fragment TabLayout 实现标签页切换一、引入:什么是 ViewPager2 ?二、ViewPager2 的基础使用1. 在布局文件 (activity_main.xml)中添加 ViewPager22. 制作一个 Fragment2.1 创建一个布局文件2.2 创建一个 Fragment 类…

嵌入式学习-土堆目标检测(4)-day28

Pytorch中加载自定义数据集 - VOC其中需要pip install xmltodict#voc_dataset.pyimport os import torch import xmltodict from PIL import Image from torch.utils.data import Dataset import torchvision.transforms as transformsclass VOCDataset(Dataset): def __init_…

Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?

文章目录一、双容器架构:MVC容器与根容器的关系二、启动全流程解析1. 启动流程全景图2. 初始化根容器(Root WebApplicationContext)2.1 Tomcat 中启动入口源码解析2.2 Spring 根上下文启动源码解析3. 初始化 MVC 容器(DispatcherS…

【iOS】编译和链接、动静态库及dyld的简单学习

文章目录编译和链接1️⃣核心结论:一句话区分2️⃣编译过程:从源代码到目标文件(.o)2.1 预处理(Preprocessing):“替换变量复制粘贴”2.2 编译(Compilation):…

金山办公WPS项目产品总监陈智新受邀为第十四届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会珠海金山办公软件有限公司WPS项目产品总监 陈智新先生 受邀为“PMO评论”主办的2025第十四届中国PMO大会演讲嘉宾,演讲议题为:中小团队PMO的成长之路,敬请关注!议题简要:在竞争激烈、需求多变的…

web安全 | docker复杂环境下的内网打点

本文作者:Track-syst1m一.前言本文涉及的相关漏洞均已修复、本文中技术和方法仅用于教育目的;文中讨论的所有案例和技术均旨在帮助读者更好地理解相关安全问题,并采取适当的防护措施来保护自身系统免受攻击。二.大概流程1. 外网打点• 漏洞利…