GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo
前言
本篇开始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 += $$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源码
#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
emsp;emsp;
入坑
入坑一:播放画面异常
问题
emsp;emsp;播放画面错位
emsp;emsp;
emsp;emsp;测试原本文件应该是:
emsp;emsp;
尝试
emsp;emsp;命令行去检测,也是异常:
emsp;emsp;
emsp;emsp;测试windows上,是正常:
emsp;emsp;
emsp;emsp;所以是系统装的环境可能有问题。重新切换虚拟机使用ubuntu20.04重新制作虚拟机,用起来还是一样,有问题:
emsp;emsp;
emsp;emsp;用网页测试,没问题:
emsp;emsp;
emsp;emsp;用vlc测试,也没问题:
emsp;emsp;
emsp;emsp;然后测试其他地址试试,发现没问题:
emsp;emsp;
解决
后来发现是需要指定渲染器才行。
GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo的更多相关文章
- Django开发笔记四
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...
- Windows11使用WSL Ubuntu搭建paddle的GPU环境
Windows11使用WSL Ubuntu搭建paddle的GPU环境 最近升级到了Windows11,突然有个大胆的想法:在Windows11上安装WSL,将所有开发环境安装到WSL中.这样就能在w ...
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl 后篇 --事件冒泡 系列文章链接: ASP.NET ...
- linux(ubuntu) 搭建java程序运行环境
一:简介 ubuntu 系统的和linux差不多,我们需要在系统上搭建java程序运行环境,需要安装jdk,mysql这两个软件,tomcat是绿色版,直接通过taz -zxvf tomcat 就可以 ...
- Modbus库开发笔记之九:利用协议栈开发Modbus TCP Server应用
前面我们已经完成了Modbus协议栈的开发,但这不是我们的目的.我们开发它的目的当然是要使用它来解决我们的实际问题.接下来我们就使用刚开发的Modbus协议栈开发一个Modbus TCP Server ...
- openwrt gstreamer实例学习笔记(一.初始化gstreamer)
GStreamer 是一个非常强大而且通用的流媒体应用程序框架. GStreamer所具备的很多优点来源于其框架的模块化: GStreamer能够无缝的合并新的插件. 但是, 由于追求模块化和高效率, ...
- [APP] Android 开发笔记 001-环境搭建与命令行创建项目
1. 安装JDK,SDK JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html Android SDK http ...
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
随机推荐
- Task VS ValueTask
在 C# 中,异步编程是构建响应式应用程序的基础.Task 是表示异步操作的首选类型.但是,在某些高性能场景中,与 Task 相关的开销可能会达到一个瓶颈.ValueTask 是 .NET Core ...
- Docker应用部署(Mysql、tomcat、Redis、redis)
Docker应用部署mysql5.7 1.拉取镜像 docker pull mysql:5.7 2.查看镜像 docker images 3.创建容器 docker run -id \ -p 3307 ...
- 读论文-序列感知推荐系统(Sequence-Aware Recommender Systems)
前言 今天读的论文为一篇于2018年发表在(ACM computing surveys (CSUR))的论文,这篇文章主要讲述了序列感知推荐系统(Sequence-Aware Recommender ...
- faker 函数支持哪些
3.2 常用函数 除了上述介绍的fake.name和fake.address生成姓名和地址两个函数外,常用的faker函数按类别划分有如下一些常用方法. 1.地理信息类 fake.city_suffi ...
- 【MIPS】经典指令块集锦
Directives声明变量值存储 容易将数据段地址和地址上的内容搞混 .data fibs: .space 48 # allocate 12 * 4 = 48 Byte memory, store ...
- QT5.14.1+Win7 64+Oracle11gR2 Qt连接数据库
原文链接 1.QT5.14下OCI驱动编译完整步骤 1.安装qt的时候手动选择安装源码资源(默认不安装Source的) 2.进入QT安装目录下E:\Qt5.14\5.14.0\Src\qtbase\s ...
- Joker 全栈低代码智能开发平台:开启高效开发新时代
低代码开发技术凭借其独特优势,正逐渐成为软件开发领域的关键力量.Gartner 预测,到 2025 年,全球 70% 的新应用将采用低代码 / 无代码技术.Forrester 报告显示,中国低代码市场 ...
- Netty源码—5.Pipeline和Handler
大纲 1.Pipeline和Handler的作用和构成 2.ChannelHandler的分类 3.几个特殊的ChannelHandler 4.ChannelHandler的生命周期 5.Channe ...
- PKI(Public Key Infrastructure,公钥基础设施)常见标准介绍
ASN.1 - 数据结构描述语言 文件编码格式 DER编码格式 PEM编码格式 证书.密码学Key格式标准 X.509标准 PKCS(公钥加密标准)系列(PKCS#1.PKCS#8.PKCS#12) ...
- PHP文件上传封装
class FileUploader { private $targetDirectory; private $allowedExtensions; private $maxFileSize; pub ...