吞脚 发表于 2025-6-3 00:07:35

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

前言

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

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044210-1655606993.png
  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044352-306516838.png
 GStreamer

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

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

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

步骤一:安装gstreamer1.0环境

sudo apt-get updatesudo 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-pulseaudiosudo apt-get install libglib2.0-0步骤二:创建C工程

  使用QtCreator新建空的C工程:
  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044055-610787967.png
步骤三:添加gstreamer开发环境

  然后查找gst.h头文件:
sudo find / -name "gst.h"  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044008-281134817.png
  查找库:
sudo find / -name "gstreamer-1.0*”  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044108-1192374227.png
  查找依赖的头文件:
sudo find / -name "glib.h"  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044124-2037866011.png
sudo find / -name “glibconfig”  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044102-1641614718.png
  将头文件路径和库添加进pri:
  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044139-318156963.png
# gstreamer头文件和库文件INCLUDEPATH += /usr/include/gstreamer-1.0LIBS += -lgstreamer-1.0#LIBS += -lgobject-2.0 -lgstreamer-1.0 -lgstvideo-1.0# glibc头文件和库文件INCLUDEPATH += /usr/include/glib-2.0INCLUDEPATH += /usr/lib/x86_64-linux-gnu/glib-2.0/includeLIBS += -lglib-2.0 第一个GStreamer程序

步骤一:初始化gst

  这是每个程序都要做的。
  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044089-402812078.png
步骤二:定义管道

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044056-1910646405.png
步骤三:设置管道状态

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044120-1123703815.png
步骤四:获取管道的总线bus

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044064-1555046485.png
步骤五:从总线bus中阻塞获取指定的信息

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104043989-2070511169.png
  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044162-1643488516.png
步骤六:消息处理

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044035-60273692.png
步骤七:释放资源

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044518-632413091.png
 关键函数

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释放引用。
 模块化

  https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044014-252487542.png
gstreamerManager.pri

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

#include "gstreamerManager.h"#include #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

emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044204-535833004.png
入坑

入坑一:播放画面异常

问题

emsp;emsp;播放画面错位
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044024-688219538.png
emsp;emsp;测试原本文件应该是:
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044096-968053141.png
尝试

emsp;emsp;命令行去检测,也是异常:
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044113-1602089254.png
emsp;emsp;测试windows上,是正常:
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044456-65069737.png
emsp;emsp;所以是系统装的环境可能有问题。重新切换虚拟机使用ubuntu20.04重新制作虚拟机,用起来还是一样,有问题:
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044163-146695883.png
emsp;emsp;用网页测试,没问题:
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044134-65592858.png
emsp;emsp;用vlc测试,也没问题:
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044011-1302907370.png
emsp;emsp;然后测试其他地址试试,发现没问题:
emsp;emsp;https://img2024.cnblogs.com/blog/1971530/202505/1971530-20250522104044110-1022811253.png
解决

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo