当前位置: 首页 > article >正文

GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo

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

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

FFmpeg、SDL和流媒体开发专栏


上一篇:《GStreamer开发笔记(三):测试gstreamer/v4l2+sdl2/v4l2+QtOpengl打摄像头延迟和内存》
下一篇:敬请期待…


前言

  本篇开始gstreamer的编程学习,先搭建基础的环境,跑通一个基础的Demo对GStreamer编程有个初步的了解。


Demo

  在这里插入图片描述

  在这里插入图片描述


GStreamer

  GStreamer是一个灵活、快速、多平台的多媒体框架,此框架非常强大和通用,用于创建流媒体应用程序。GStreamer框架的许多优点来自其模块化,GStreamer可以无缝地整合新的插件模块。但是,由于模块化和强大的功能往往以更高的复杂性为代价,编写新的应用程序并不总是那么容易。

结构

  教程分为几个部分,围绕一个共同的主题:

  • 基础教程:描述理解GStreamer中其余教程所需的一般主题。
  • 播放教程:解释使用GStreamer制作媒体播放应用程序所需知道的一切。
  • Android教程:涉及您需要知道的几个Android特定主题的教程。
  • iOS教程:涉及您需要知道的几个iOS特定主题的教程。
      基础教程——理解其余教程所需的一般主题

搭建基础开发环境

步骤一:安装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

步骤二:创建C工程

  使用QtCreator新建空的C工程:
  在这里插入图片描述

步骤三:添加gstreamer开发环境

  然后查找gst.h头文件:

sudo find / -name "gst.h"

  在这里插入图片描述

  查找库:

sudo find / -name "gstreamer-1.0*

  在这里插入图片描述

  查找依赖的头文件:

sudo find / -name "glib.h"

  在这里插入图片描述

sudo find / -name “glibconfig”

  在这里插入图片描述

  将头文件路径和库添加进pri:
  在这里插入图片描述

# gstreamer头文件和库文件
INCLUDEPATH += /usr/include/gstreamer-1.0
LIBS += -lgstreamer-1.0
#LIBS += -lgobject-2.0 -lgstreamer-1.0 -lgstvideo-1.0# glibc头文件和库文件
INCLUDEPATH += /usr/include/glib-2.0
INCLUDEPATH += /usr/lib/x86_64-linux-gnu/glib-2.0/include
LIBS += -lglib-2.0

第一个GStreamer程序

步骤一:初始化gst

  这是每个程序都要做的。
  在这里插入图片描述

步骤二:定义管道

  在这里插入图片描述

步骤三:设置管道状态

  在这里插入图片描述

步骤四:获取管道的总线bus

  在这里插入图片描述

步骤五:从总线bus中阻塞获取指定的信息

  在这里插入图片描述

  在这里插入图片描述

步骤六:消息处理

  在这里插入图片描述

步骤七:释放资源

  在这里插入图片描述


关键函数

gst_init()

  初始化所有内部结构,检查哪些插件可用,执行GStreamer的任何命令行选项。

gst_parse_launch()

  在GStreamer中,通过手动组装单个元素来构建管道,但是,当管道足够简单,并且不需要任何高级功能时,可以使用快捷方式:gst_parse_launch();
  此函数接受管道的文本表示并将其转换为实际的管道,这非常方便。事实上,这个函数非常方便,有一个完全围绕它构建的工具,请参阅GStreamer工具,了解gst-launch-1.0和gst-launch-1.0语法。
  本篇,我们正在构建一个由一个名为playbin的元素组成的管道。playbin是一个特殊的元素,它既是源又是汇,是一个完整的管道。在内部,它创建并连接了播放媒体所需的所有元素。

gst_element_set_state()

  每个GStreamer元素都有一个关联的状态,您或多或少可以将其视为常规DVD播放器中的播放/暂停按钮。现在,只需说,除非将管道设置为播放状态,否则播放将不会开始。
  gst_element_set_stat()将管道(我们唯一的元素,记住)设置为播放状态,从而启动播放。

gst_element_get_bus()

  检索管道的总线。

gst_bus_timed_pop_filtered()

  gst_bus_timed_pop_filtered()将阻塞,直到您通过该总线收到指定错误或指定的事件,这些事件预定义了。

gst_message_unref(msg);

  清理消息。

gst_object_unref (bus);

  清理qobject类型,按照生成顺序逆向的来unref释放引用。

gst_element_set_state (pipeline, GST_STATE_NULL);

  设置管道状态为空,资源都会被自动回收。

gst_object_unref (pipeline)

  清理qobject类型,按照生成顺序逆向的来unref释放引用。


模块化

  在这里插入图片描述

gstreamerManager.pri

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWDHEADERS += \$$PWD/gstreamerManager.hSOURCES += \$$PWD/gstreamerManager.cQMAKE_CXXFLAGS += -fpermissive# gstreamer头文件和库文件
INCLUDEPATH += /usr/include/gstreamer-1.0
LIBS += -lgstreamer-1.0
#LIBS += -lgobject-2.0 -lgstreamer-1.0 -lgstvideo-1.0# glibc头文件和库文件
INCLUDEPATH += /usr/include/glib-2.0
INCLUDEPATH += /usr/lib/x86_64-linux-gnu/glib-2.0/include
LIBS += -lglib-2.0

Demo源码

#include "gstreamerManager.h"#include <gst/gst.h>#define DEBUG   printf("%s:%d\n", __FILE__, __LINE__)void test001HelloWorldDemo(int *argc, char **argv[])
{GstElement *pipeline;GstBus *bus;GstMessage *msg;// 步骤一:初始化gstgst_init(argc, argv);// 步骤二:定义管道(指定渲染器,否则ubuntu上渲染画面会出错)
//    pipeline = gst_parse_launch("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm", NULL);pipeline = gst_parse_launch("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm video-sink=\"ximagesink\"", NULL);// 步骤三:开始播放(设置管道的运行状态:空、准备、播放、暂停)gst_element_set_state (pipeline, GST_STATE_PLAYING);// 步骤四:获取管道的总线bus = gst_element_get_bus (pipeline);// 步骤五:阻塞获取bus上指定的消息返回(未获取到则阻塞)msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);// 步骤六:消息的处理(这里有很多消息,只是举例子一个if(GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR){g_printerr ("An error occurred! Re-run with the GST_DEBUG=*:WARN ""environment variable set for more details.\n");}// 步骤七:释放资源(其中管道先设置状态空:该状态将会回收所有被该组件占用的资源,然后再释放)gst_message_unref (msg);gst_object_unref (bus);gst_element_set_state (pipeline, GST_STATE_NULL);gst_object_unref (pipeline);
}

工程模板v1.0.0

  在这里插入图片描述

入坑

入坑一:播放画面异常

问题

  播放画面错位
在这里插入图片描述

  测试原本文件应该是:
  在这里插入图片描述

尝试

  命令行去检测,也是异常:
  在这里插入图片描述

  测试windows上,是正常:
  在这里插入图片描述

  所以是系统装的环境可能有问题。重新切换虚拟机使用ubuntu20.04重新制作虚拟机,用起来还是一样,有问题:
  在这里插入图片描述

  用网页测试,没问题:
  在这里插入图片描述

  用vlc测试,也没问题:
  在这里插入图片描述

  然后测试其他地址试试,发现没问题:
  在这里插入图片描述

解决

  后来发现是需要指定渲染器才行。


上一篇:《GStreamer开发笔记(三):测试gstreamer/v4l2+sdl2/v4l2+QtOpengl打摄像头延迟和内存》
下一篇:敬请期待…


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

相关文章:

GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147714800 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…...

2021年认证杯SPSSPRO杯数学建模A题(第二阶段)医学图像的配准全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 A题 医学图像的配准 原题再现&#xff1a; 图像的配准是图像处理领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合同一对象在不同条件下获取的图像。例如为了更好地综合多种信息来辨识不同组织或病变&#xff0c;医生可能使用…...

CV中常用Backbone-3:Clip/SAM原理以及代码操作

前面已经介绍了简单的视觉编码器&#xff0c;这里主要介绍多模态中使用比较多的两种backbone&#xff1a;1、Clip&#xff1b;2、SAM。对于这两个backbone简单介绍基本原理&#xff0c;主要是讨论使用这个backbone。 1、CV中常用Backbone-2&#xff1a;ConvNeXt模型详解 2、CV中…...

RPC 协议详解、案例分析与应用场景

一、RPC 协议原理详解 RPC 协议的核心目标是让开发者像调用本地函数一样调用远程服务&#xff0c;其实现过程涉及多个关键组件与流程。 &#xff08;一&#xff09;核心组件 客户端&#xff08;Client&#xff09;&#xff1a;发起远程过程调用的一方&#xff0c;它并不关心调…...

dify-plugin-daemon的.env配置文件

源码位置&#xff1a;dify-plugin-daemon\.env 本文使用dify-plugin-daemon v0.1.0版本&#xff0c;主要总结了dify-plugin-daemon\.env配置文件。为了本地调试方便&#xff0c;采用本地运行时环境WSL2Ubuntu22.04方式运行dify-plugin-daemon服务。 一.服务器基本配置 服务器…...

【Python】开发工具uv

文章目录 1. uv install1.1 下载安装脚本来安装1.2 使用pipx安装uv1.3 补充 2. 考虑在离线系统上安装uv2.1 下载并上传安装包2.2 用户级安装uv&#xff08;~/.local/bin/&#xff09;2.3 补充 3. uv 管理Python解释器4. uv 管理依赖5. uv运行代码5.1 uv不在项目下执行脚本5.2 u…...

《技术择时,价值择股》速读笔记

文章目录 书籍信息概览技术择时价值择股投资策略投资心态 书籍信息 书名&#xff1a;《技术择时&#xff0c;价值择股&#xff1a;A股投资实战笔记》 作者&#xff1a;二十八画生 概览 技术择时 三种简单方法&#xff0c;教你买在起涨点 趋势行情中的“买点”判断&#xff…...

Python可视化设计原则

在数据驱动的时代&#xff0c;可视化不仅是结果的呈现方式&#xff0c;更是数据故事的核心载体。Python凭借其丰富的生态库&#xff08;Matplotlib/Seaborn/Plotly等&#xff09;&#xff0c;已成为数据可视化领域的主力工具。但工具只是起点&#xff0c;真正让图表产生价值的&…...

SAP重塑云ERP应用套件

在2025年Sapphire大会上&#xff0c;SAP正式发布了其云ERP产品的重塑计划&#xff0c;推出全新“Business Suite”应用套件&#xff0c;并对供应链相关应用进行AI增强升级。这一变革旨在简化新客户进入SAP生态系统的流程&#xff0c;同时为现有客户提供更加统一、智能和高效的业…...

2025.5.25总结

今天早上刷了会手机&#xff0c;然后下午去刷了一道科目一&#xff0c;限时训练3.5h。遗憾的是&#xff0c;这周只刷了一道题&#xff0c;并没有达成每周两道的目标。 其次&#xff0c;一天下来跟平时的节假日一样&#xff0c;有些小压抑。我也察觉到了自己的情绪。烦心事无非…...

(九)PMSM驱动控制学习---无感控制之高阶滑膜观测器

在之前的文章中&#xff0c;我们介绍了永磁同步电机无感控制中的滑模观测器&#xff0c;但是同时我们也认识到了他的缺点&#xff1a;因符号函数带来的高频切换分量&#xff0c;使用低通滤波器引发相位延迟&#xff1b;在本篇文章&#xff0c;我们将会介绍高阶滑模观测器的无感…...

6个跨境电商独立站平台

1. WP最主题(WPZUI) 官网&#xff1a;http://www.wpzui.com 简介&#xff1a; WP最主题专注于专业WordPress主题开发定制&#xff0c;致力于为用户提供高质量、高性能的WordPress主题。其主题设计注重用户体验和SEO优化&#xff0c;适用于多种网站类型&#xff0c;包括企业站…...

电子电路:电学都有哪些核心概念?

电子是基本粒子,带负电荷。电荷是物质的一种属性,电子带有负电荷,而质子带有正电荷。电荷的单位是库仑。 电流呢,应该是指电荷的流动,单位是安培,也就是库仑每秒。所以电流其实就是电荷在导体中的移动形成的。比如,当电子在导线中流动时,就形成了电流。不过要注意,传…...

SQL进阶之旅 Day 2:基础查询优化技巧

【SQL进阶之旅 Day 2】基础查询优化技巧 开篇&#xff1a;为什么需要基础查询优化&#xff1f; 在SQL学习的旅程中&#xff0c;掌握基础查询优化是迈向专业数据库开发的关键一步。随着数据量的爆炸式增长&#xff0c;简单的SELECT语句已经无法满足现代应用对性能的要求。今天…...

时序数据库 TDengine × Superset:一键构建你的可视化分析系统

如果你正在用 TDengine 管理时序数据&#xff0c;写 SQL 查询没问题&#xff0c;但一到展示环节就犯难——图表太基础&#xff0c;交互不够&#xff0c;甚至连团队都看不懂你辛苦分析的数据成果&#xff1f;别担心&#xff0c;今天要介绍的这个组合&#xff0c;正是为你量身打造…...

一键化部署

好的&#xff0c;我明白了。你希望脚本变得更简洁&#xff0c;主要负责&#xff1a; 代码克隆&#xff1a;从 GitHub 克隆你的后端和前端项目&#xff0c;并在克隆前确保目标目录为空。文件复制&#xff1a;将你预先准备好的 Dockerfile (后端和前端各一个)、前端的 nginx.con…...

Win 系统 conda 如何配置镜像源

通过命令添加镜像源&#xff08;推荐&#xff09; 以 清华源 为例&#xff0c;依次执行以下命令&#xff1a; # 添加主镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main # 添加免费开源镜像源 conda config --add channels http…...

Devicenet主转Profinet网关助力改造焊接机器人系统智能升级

某汽车零部件焊接车间原有6台焊接机器人&#xff08;采用Devicenet协议&#xff09;需与新增的西门子S7-1200 PLC&#xff08;Profinet协议&#xff09;组网。若更换所有机器人控制器或上位机系统&#xff0c;成本过高且停产周期长。 《解决方案》 工程师选择稳联技术转换网关…...

《STL--list的使用及其底层实现》

引言&#xff1a; 上次我们学习了容器vector的使用及其底层实现&#xff0c;今天我们再来学习一个容器list&#xff0c; 这里的list可以参考我们之前实现的单链表&#xff0c;但是这里的list是双向循环带头链表&#xff0c;下面我们就开始list的学习了。 一&#xff1a;list的…...

whisper相关的开源项目 (asr)

基于 Whisper&#xff08;OpenAI 的开源语音识别模型&#xff09;的开源项目有很多&#xff0c;涵盖了不同应用场景和优化方向。以下是一些值得关注的项目&#xff1a; 1. 核心工具 & 增强版 Whisper OpenAI Whisper 由 OpenAI 开源的通用语音识别模型&#xff0c;支持多语…...

python的pip怎么配置的国内镜像

以下是配置pip国内镜像源的详细方法&#xff1a; 常用国内镜像源列表 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple中科大&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple华为云&#xff1…...

PCB 通孔是电容性的,但不一定是电容器

哼&#xff1f;……这是什么意思&#xff1f;…… 多年来&#xff0c;流行的观点是 PCB 通孔本质上是电容性的&#xff0c;因此可以用集总电容器进行建模。虽然当信号的上升时间大于或等于过孔不连续性延迟的 3 倍时&#xff0c;这可能是正确的&#xff0c;但我将向您展示为什…...

领域驱动设计与COLA框架:从理论到实践的落地之路

目录 引言 DDD核心概念 什么是领域驱动设计 DDD的核心概念 1. 统一语言&#xff08;Ubiquitous Language&#xff09; 2. 限界上下文&#xff08;Bounded Context&#xff09; 3. 实体&#xff08;Entity&#xff09;与值对象&#xff08;Value Object&#xff09; 4. 聚…...

公有云AWS基础架构与核心服务:从概念到实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 &#xff08;初学者技术专栏&#xff09; 一、基础概念 定义&#xff1a;AWS&#xff08;Amazon Web Services&#xff09;是亚马逊提供的云计算服务&a…...

Python60日基础学习打卡D35

import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import time import matplotlib.pyplot as plt# 设置GPU设…...

Python经典算法实战

在编程的世界里&#xff0c;算法是解决问题的灵魂&#xff0c;而Python以其简洁优雅的语法成为实现算法的理想语言。无论你是初学者还是有一定经验的开发者&#xff0c;《Python经典算法实战》都能带你深入算法的殿堂&#xff0c;从理论到实践&#xff0c;一步步构建起扎实的编…...

spring+tomcat 用户每次发请求,tomcat 站在线程的角度是如何处理用户请求的,spinrg的bean 是共享的吗

对于 springtomcat 用户每次发请求&#xff0c;tomcat 站在线程的角度是如何处理的 比如 bio nio apr 等情况 tomcat 配置文件中 maxThreads 的数量是相对于谁来说的&#xff1f; 以及 spring Controller 中的全局变量:各种bean 对于线程来说是共享的吗&#xff1f; 一、Tomca…...

目标检测 RT-DETR(2023)详细解读

文章目录 主干网络&#xff1a;Encoder&#xff1a;不确定性最小Query选择Decoder网络&#xff1a; 将DETR扩展到实时场景&#xff0c;提高了模型的检测速度。网络架构分为三部分组成&#xff1a;主干网络、混合编码器、带有辅助预测头的变换器编码器。具体来说&#xff0c;先利…...

微信小程序 隐私协议弹窗授权

开发微信小程序的第一步往往是隐私协议授权&#xff0c;尤其是在涉及用户隐私数据时&#xff0c;必须确保用户明确知晓并同意相关隐私政策。我们才可以开发后续的小程序内容。友友们在按照文档开发时可能会遇到一些问题&#xff0c;我把所有的授权方法和可能遇到的问题都整理出…...

题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形

题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形 时间限制: 2s 内存限制: 192MB 提交: 494 解决: 206 题目描述 小蓝要画一个 2025 图形。图形的形状为一个 h w 的矩形&#xff0c;其中 h 表示图形的高&#xff0c;w 表示图形的宽。当 h 5,w 10 时&#xff0c;图形如下所…...