协议-RK-Gstreamer

文档链接说明

  • 主要文档链接
    4. Gstreamer工具以及MPP插件 — 快速使用手册—基于LubanCat-RK356x系列板卡 文档

  • 常用命令
    GStreamer命令行工具gst-play-1.0的全面指南与用法-CSDN博客


是什么?

  • GStreamer是一个开源的多媒体框架,用于构建音频和视频处理应用程序
  • GStreamer 的核心是基于管道(pipeline)的架构
    • 通过将多媒体处理的各个步骤串联起来,实现复杂的媒体处理任务

为什么?

为什么有ffmpeg的前提下,还要使用GStreamer?

  • 在某些情况下,GStreamer 会比 FFmpeg 更适合特定的需求
    • FFmpeg 是一个功能强大的单体框架,主要专注于媒体的编解码、转码和流处理
    • GStreamer适合构建复杂的媒体处理管道,如视频会议、实时流媒体处理和视频编辑
功能FFmpegGStreamer
核心架构Monolithic模块化,基于管道线
易用性使用 CLI 更容易完成简单的媒体任务需要更多设置,但管道灵活
编解码器支持广泛的编解码器支持,几乎涵盖所有编解码器功能强大,但通常需要额外的插件
使用案例媒体转换、流媒体转码、实时流媒体、媒体应用
模块化模块化程度低,围绕特定命令构建模块化程度高,可定制组件
插件系统有限的插件系统,主要集中于编解码器广泛的插件系统,用于自定义处理
实时处理可以,但不直观专为实时流媒体和处理而设计
跨平台是(Linux、Windows、macOS 等)是(Linux、Windows、macOS 等)
复杂性对于简单的任务来说更简单对于复杂的自定义媒体工作流程来说更好
许可LGPL 或 GPL(取决于配置)LGPL
开发者社区庞大、活跃、被广泛采用活跃,但规模小于 FFmpeg

怎么做?

sudo add-apt-repository ppa:george-coolpi/multimedia
sudo apt updatesudo apt-get install gstreamer1.0-rockchip# 测试是否安装成功gst-inspect-1.0 mppvideodec

核心本质

本质就三个核心命令,两个名词

  • 命令
  • 插件
gst-launch-1.0
gst-play-1.0
gst-inspect-1.0

常用命令

gst-launch-1.0

  • gst-launch-1.0 构建数据流管道,以处理音频和视频数据,进行实时流处理、编码、解码、转码等操作
gst-launch-1.0 -v imxv4l2src device=/dev/video1 ! "video/x-raw, format=(string)YUY2, width=(int)1024, height=(int)768, framerate=(fraction)30/1" ! imxv4l2sink 

gst-play-1.0

  • gst-play-1.0 播放本地文件或流式媒体
# 播放test.mp4,并通过xvimagesink显⽰
gst-play-1.0 test.mp4 --videosink=xvimagesink 

gst-inspect-1.0

  • gst-inspect-1.0 用于查看 GStreamer 中可用的插件、元素和它们的属性
# 列出xvimagesink插件的所有信息
gst-inspect-1.0 xvimagesink 

常⽤插件

Source

  • Source插件用于生成和提供媒体数据流。
  • 它们可以从不同的数据源读取音频或视频,比如文件、网络、设备等。
  • 常见的Source插件包括文件源(如 filesrc)、网络源(如 tcpserversrc)、设备源(如 v4l2src)

filesrc videotestsrc v4l2src

#读取/tmp/test文件数据 到/tmp/test2
gst-launch-1.0 filesrc location=/tmp/test ! filesink location=/tmp/test2# 使⽤videotestsrc按照指定格式⽣成视频数据,并通过xvimagesink显⽰
gst-launch-1.0 videotestsrc ! "video/x-raw,width=1920,height=1080,format=(string)NV12" ! xvimagesink#从v4l2src获取摄像头视频数据,通过device属性指定摄像头,按照指定格式输出视频通过xvimagesink显⽰
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1920,height=1080,format=NV12 ! xvimagesink

rtspsrc rtspclientsink

  • rtspsrc:它可以从RTSP服务器拉取RTSP音视频流,并将其传递给管道的下游元素进行处理
  • rtspclientsink:用于将处理后的音视频流发送到RTSP服务器
#安装插件
sudo apt install gstreamer1.0-rtsp

Sink

  • GStreamer的Sink插件用于接收和处理媒体数据流
  • 通常用于输出到不同的目标,例如文件、音频设备、视频显示等。
  • 常见的Sink插件包括文件接收器(如filesink)、音频输出(如 alsasink)、视频显示(如 ximagesink)

filesink fakesink

#读取/tmp/test文件数据到/tmp/test2
gst-launch-1.0 filesrc location=/tmp/test ! filesink location=/tmp/test2#将收到的/tmp/test数据全部丢弃
gst-launch-1.0 filesrc location=/tmp/test ! fakesink

xvimagesink kmssink waylandsink rkximagesink

#接收videotestsrc视频并通过xvimagesink显⽰,使⽤X11接口实现
gst-launch-1.0 videotestsrc ! xvimagesink
# 使⽤kms接口实现
gst-launch-1.0 videotestsrc ! kmssink
# 使⽤wayland接口实现
gst-launch-1.0 videotestsrc ! waylandsink
# 使⽤drm接口实现零拷⻉
gst-launch-1.0 videotestsrc ! rkximagesink

fpsdisplaysink

  • 播放 test.mp4 文件
  • 视频使用 xvimagesink 渲染并显示帧率
  • 音频使用第二个声卡输出,且视频播放不与音频同步
gst-play-1.0 --flags=3 --videosink="fpsdisplaysink video-sink=xvimagesink signal-fps-measurements=true text-overlay=false sync=false" --audiosink="alsasink device=hw:1,0" test.mp4
  • --flags=3: 表示同时启用视频和音频播放,关闭字幕

  • --videosink="fpsdisplaysink video-sink=xvimagesink signal-fps-measurements=true text-overlay=false sync=false": 这个参数指定了视频输出的处理方式:

    • fpsdisplaysink:这是一个特殊的视频接收器,用于显示帧率(FPS)
    • video-sink=xvimagesink:指定使用 xvimagesink 作为视频渲染的后端
    • signal-fps-measurements=true:启用帧率测量信号,这允许 fpsdisplaysink 显示当前的帧率。
    • text-overlay=false:禁用文本覆盖,即不在视频上显示帧率文本。
    • sync=false:设置为 false 表示视频播放不与音频同步。
  • --audiosink="alsasink device=hw:1,0": 这个参数指定了音频输出的处理方式:

    • alsasink:指定使用 ALSA(Advanced Linux Sound Architecture)作为音频输出后端。
    • device=hw:1,0:指定使用特定的 ALSA 设备。hw:1,0 表示使用第二个声卡的第一个子设备。
  • test.mp4: 这是要播放的视频文件的名称。


Rockchip MPP插件

  • 基于Gstreamer原有GstVideoDecoder类和GstVideoEncoder类开发
  • 默认系统已经安装mpp插件
#查看mpp插件
gst-inspect-1.0 | grep mpp#信息输出如下
rockchipmpp:  mpph264enc: Rockchip Mpp H264 Encoder
rockchipmpp:  mpph265enc: Rockchip Mpp H265 Encoder
rockchipmpp:  mppvp8enc: Rockchip Mpp VP8 Encoder
rockchipmpp:  mppjpegenc: Rockchip Mpp JPEG Encoder
rockchipmpp:  mppvideodec: Rockchip's MPP video decoder
rockchipmpp:  mppjpegdec: Rockchip's MPP JPEG image decoder

gstmppdec 命令

  • 包含插件mppvideodec,mppjpegdec

gstmppenc 命令

  • 包含插件mpph264enc,mppvp8enc,mppjpegenc等

更多命令(Rockchip MPP插件)

  • 会用到mppvideodec ,mpph264enc

多路视频播放 render-rectangle

render-rectangle

# 使⽤xvimagesink的render-rectangle指定不同的渲染位置
gst-launch-1.0 filesrc location=/home/cat/test.mp4 ! parsebin ! mppvideodec ! \
xvimagesink render-rectangle='<0,0,400,400>' &
gst-launch-1.0 filesrc location=/home/cat/test.mp4 ! parsebin ! mppvideodec ! \
xvimagesink render-rectangle='<0,500,400,400>' &
  • parsebin:这个元素自动解析和构建管道的其余部分,根据文件类型和可用的解码器。
  • mppvideodec:这是一个视频解码器元素,用于解码视频流
  • render-rectangle='<0,0,400,400>':这个属性指定视频渲染的位置和大小。在这个例子中,视频将被渲染到屏幕的左上角,起始坐标为 (0,0),大小为 400x400 像素。

编码预览 tee

使⽤tee插件,将摄像头采集的数据拷⻉为两路

  • ⼀路送⾄mpph264enc进⾏编码,而后送⾄filesink保存⽂件
  • ⼀路送⾄autovideosink显⽰
gst-launch-1.0 v4l2src ! 'video/x-raw,width=1920,height=1080,format=NV12' ! tee name=tv ! queue ! mpph264enc ! 'video/x-h264' ! h264parse ! 'video/x-h264' ! filesink location=/home/cat/out.h264 tv. ! queue ! autovideosink
  • tee name=tv
    • tee 元素用于将视频流复制到多个路径。
    • name=tv 为 tee 元素指定了一个名称,以便后续可以通过这个名称引用它。
  • queue
    • queue 元素用于在元素之间缓冲数据流,防止数据流的阻塞。
  • filesink location=/home/cat/out.h264
    • filesink 元素用于将视频流写入文件。这里指定了文件的保存位置为 /home/cat/out.h264
  • tv. ! queue ! autovideosink
    • 这部分将 tee 元素的输出(tv.)连接到另一个 queue 元素,然后连接到 autovideosink 元素
    • autovideosink 元素用于自动选择合适的视频渲染器(如 xvimagesinkglimagesink)来在屏幕上显示视频。

拆分码流 qtdemux

qtdemux

  • 将qtdemux命名为qt
    • qt.audio_0就是第⼀个⾳频流
    • qt.video_0就是第⼀个视频流
gst-launch-1.0 filesrc location=test.mp4 ! qtdemux name=qt qt.audio_0 ! queue ! \
filesink location=audio.bin qt.video_0 ! queue ! filesink location=video.bin

这条命令实现了以下功能:

  • 读取一个 MP4 文件(test.mp4)。
  • 使用 qtdemux 元素将文件分解为音频和视频流。
  • 将音频流保存到 audio.bin 文件中。
  • 将视频流保存到 video.bin 文件中。

AFBC(ARM Frame Buffer Compression)

  • AFBC全称ARM Frame Buffer Compression,是⼀种压缩格式,⽤于节省带宽。
  • ⽬前mppvideodec插件⽀持AFBC的编码格式有:H264,H265,VP9
  • ⽀持的⾊彩格式有NV12,NV12 10bit,NV16

效果对比

  • 没有开启AFBC时,帧率在45-50帧
  • 开启AFBC时测试 帧率在69-75帧
# 开启全局AFBC,适⽤于使⽤gst-play-1.0等⽆法直接操作mppvideodec的情况
export GST_MPP_VIDEODEC_DEFAULT_ARM_AFBC=1# 单独开启AFBC
gst-launch-1.0 filesrc location=test.mp4 ! parsebin ! mppvideodec arm-afbc=true \
! waylandsink
#通过fpsdisplaysink获取帧率
GST_DEBUG=fpsdisplaysink:7 gst-play-1.0 --flags=3 --videosink="fpsdisplaysink \
video-sink=xvimagesink signal-fps-measurements=true text-overlay=false  \
sync=false" test.mp4
  • GST_DEBUG=fpsdisplaysink:7
    • fpsdisplaysink:7 级别 7 表示最高级别的调试信息,会输出大量的调试数据。

与RTSP融合

本地推流/拉流

  • 测试USB摄像头,摄像头接口为device=/dev/video9
  • 需要先运行接收端命令,然后再运行服务端(注意如果是ssh需要指定export DISPLAY=:0环境变量)
#板卡接收端
gst-launch-1.0 udpsrc port=1234 ! "application/x-rtp, payload=96" ! rtph264depay ! decodebin ! autovideosink sync=false
  • 接收端,命令通过udpsrc从指定的端口(1234)接收RTP数据流,使用rtph264depay解封装RTP数据,接着通过decodebin解码视频流,最后将解码后的视频输出到自动选择的视频窗口(autovideosink)
#板卡服务端测试1
gst-launch-1.0 v4l2src device=/dev/video9  !  video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! video/x-raw,format=UYVY !  mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
  • 服务端测试1:使用v4l2src直接捕获原始视频流,输出为YUYV格式,并进行H.264编码,然后通过rtph264pay封装成RTP数据包,最后使用udpsink将数据推送到指定的地址(127.0.0.1:1234)
#板卡服务端测试2
gst-launch-1.0 v4l2src device=/dev/video9  ! image/jpeg !  mppjpegdec ! videoconvert ! video/x-raw,height=1080,width=1920,frame=30/1,format=NV12 !  mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
  • 服务端测试2:同样使用v4l2src,但输入的是JPEG格式的图像,通过解码后再转换成NV12格式,并进行H.264编码,然后通过rtph264pay封装成RTP数据包,最后使用udpsink将数据推送到指定的地址(127.0.0.1:1234)。

RTSP推流/拉流

  • 推流前需要启动RTSP服务器,需要运行mediamtx
  • 访问: mediamtx,下载mediamtx_vx.x.x_linux_arm64v8.tar.gz
  • 将mediamtx_v1.9.1_linux_arm64v8.tar.gz传到板卡解压并运行
#运行mediamtx
sudo ./mediamtx &
  • 将视频流发送到RTSP服务器,简单⽰例
gst-launch-1.0 v4l2src device=/dev/video9  ! image/jpeg !  mppjpegdec ! videoconvert ! video/x-raw,height=1080,width=1920,frame=30/1,format=NV12 ! tee name=t \
t. ! queue ! videoconvert ! autovideosink \
t. ! videoconvert ! mpph264enc ! queue ! h264parse  ! rtspclientsink location=rtsp://127.0.0.1:8554/live
  • 从RTSP服务器中获取视频流
#指定为实际推流板卡ip
gst-launch-1.0 rtspsrc location=rtsp://192.168.103.101:8554/live ! rtph264depay ! h264parse ! mppvideodec ! xvimagesink

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

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

相关文章

npm安装electron安装报错

npm安装electron巨慢&#xff0c;报错&#xff0c;换了镜像源也不好使&#xff0c;一般都是网络超时导致的。 cmd窗口执行&#xff1a;&#xff08;打开npm的配置文件&#xff09; npm config edit在配置文件中粘贴&#xff0c;并保存&#xff1a; registryhttps://regis…

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…

项目顺利交付,几个关键阶段

年前离放假还有10天的时候&#xff0c;来了一个应急项目&#xff0c; 需要在放假前一天完成一个演示版本的项目&#xff0c;过年期间给甲方领导看。 本想的最后几天摸摸鱼&#xff0c;这么一来&#xff0c;非但摸鱼不了&#xff0c;还得加班。 还在虽然累&#xff0c;但也是…

昇思打卡营第五期(MindNLP特辑)番外:硅基流动 x 华为云DeepSeek V3 API推理MindTinyRAG

1.前言 前脚&#xff0c;DeepSeek面临的巨头企业官宣加入vs多国政府下场质疑的冰火两重天局势尚未平静&#xff08;DeepSeek在美两重天&#xff1a;五大巨头接入&#xff0c;政府诚惶诚恐&#xff09;&#xff1b;后脚&#xff0c;OpenAI被逼急&#xff0c;凌晨亮出全新推理…

MYSQL索引与视图

一、新建数据库 mysql> create database mydb15_indexstu; mysql> use mydb15_indexstu; 二、新建表 &#xff08;1&#xff09;学生表Student mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-…

使用java代码操作rabbitMQ收发消息

SpringAMQP 将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也…

介绍10个比较优秀好用的Qt相关的开源库

记录下比较好用的一些开源库 1. Qt中的日志库“log4qt” log4qt 是一个基于 Apache Log4j 设计理念的 Qt 日志记录库&#xff0c;它为 Qt 应用程序提供了强大而灵活的日志记录功能。Log4j 是 Java 领域广泛使用的日志框架&#xff0c;log4qt 借鉴了其优秀的设计思想&#xff…

【远程控制】安装虚拟显示器

todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是&#xff1a;支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…

嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload&#xff0c;不能被override&#xff0c;声明为虚函数也没有什么意思…

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们&#xff01;好久不见&#xff01; 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章&#xff1a; 周易六十四卦 掐指一算——小六壬 更多优质文章&#xff1a;个人主页 JAVA系列&#xff1a;JAVA 大佬们互三哦~互三必回&#xff01;&#xf…

UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK

UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK Neurips23 推荐指数&#xff1a;#paper/⭐⭐⭐#​&#xff08;工作量不小) 动机 在大多数分子表征学习方法中&#xff0c;分子被视为 1D 顺序标记或2D 拓扑图&#xff0c;这限制了它们为下游任务整合…

【DeepSeek论文精读】3. DeepSeekMoE:迈向混合专家语言模型的终极专业化

欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html&#xff09;原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】2. DeepSeek LLM&#xff1a;以长期主义扩展开源语言模型 【DeepSeek论文精读】3. DeepS…

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取 其实对做自媒体的人而言,整理素材其实是一件非常耗时的事情,今天我们来看一下如何使用Cursor来帮我们解决这些问题,首先我们要建一个单独的项目,因为这个项目不涉及任何代码操作,只是文字相关的事情,还有就是这个项目需…

【Android开发AI实战】基于CNN混合YOLOV实现多车牌颜色区分且针对车牌进行矫正识别(含源码)

文章目录 引言单层卷积神经网络&#xff08;Single-layer CNN&#xff09;&#x1f4cc; 单层 CNN 的基本结构&#x1f4cc; 单层 CNN 计算流程图像 透视变换矫正车牌c实现&#x1fa84;关键代码实现&#xff1a;&#x1fa84;crnn结构图 使用jni实现高级Android开发&#x1f3…

LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)

代码下载&#xff1a;LSSVM最小二乘支持向量机多变量多步光伏功率预测&#xff08;Matlab&#xff09; LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重&#xff0c;可再生能源的开发利用成为了世界各国…

设计模式Python版 代理模式

文章目录 前言一、代理模式二、代理模式示例三、远程代理四、虚拟代理五、虚拟代理示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型…

自动化测试(selenium篇)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 自动化测试通俗一些来讲&#xff0c;就是相当于将人工测试手段进行转换&#xff0c;让代码去自动执行。 自动化测试主要分为&#xff1a;单元…

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…

RK3568平台开发系列讲解(ConfigFS篇)ConfigFS核心数据结构

🚀返回专栏总目录 文章目录 一、数据结构二、结构体关系三、案例3.1、configfs_subsystem 实例3.2、config_group 实例化四、属性和方法五、config_item实例化沉淀、分享、成长,让自己和他人都能有所收获!😄 理解 ConfigFS 的核心数据结构对于深入使用和定制 ConfigFS 非…

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块&#xff0c;它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南&#xff0c;涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …