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环境

cpp 复制代码
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头文件:

cpp 复制代码
sudo find / -name "gst.h"

查找库:

cpp 复制代码
sudo find / -name "gstreamer-1.0*"

查找依赖的头文件:

cpp 复制代码
sudo find / -name "glib.h"
cpp 复制代码
sudo find / -name "glibconfig"

将头文件路径和库添加进pri:

cpp 复制代码
# 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

cpp 复制代码
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

HEADERS += \
    $$PWD/gstreamerManager.h

SOURCES += \
    $$PWD/gstreamerManager.c

QMAKE_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源码

cpp 复制代码
#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;

    // 步骤一:初始化gst
    gst_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

相关推荐
oMcLin21 小时前
如何在Ubuntu 22.04 LTS上配置并优化MySQL 8.0分区表,提高大规模数据集查询的效率与性能?
android·mysql·ubuntu
朝阳58121 小时前
Ubuntu 22.04 安装 Fcitx5 中文输入法完整指南
linux·运维·ubuntu
永远在Debug的小殿下1 天前
wsl安装Ubuntu and ROS2
linux·运维·ubuntu
Ephemeral Memories1 天前
ubuntu安装软件失败以及运行闪退
linux·ubuntu
linweidong1 天前
在Ubuntu新版本安装gcc4.8等老版本环境
linux·运维·ubuntu
知识分享小能手1 天前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker
老前端的功夫1 天前
TypeScript索引访问类型深度解析:类型系统的动态访问与模式匹配
前端·javascript·ubuntu·架构·typescript·前端框架
oMcLin1 天前
如何在Ubuntu 20.04上配置并调优Kubernetes集群,确保在多租户环境下的高可用性与资源分配?
linux·ubuntu·kubernetes
爱吃大芒果1 天前
openJiuwen(Windows端)大模型添加及AI Agent创建教程
人工智能·ubuntu·openjiuwen
云qq1 天前
x86操作系统23——进程相关系统调用
linux·c语言·汇编·ubuntu