GStreamer —— 2.6、Windows下Qt加载GStreamer库后运行 - “教程6:媒体格式和Pad功能“(附:完整源码)

运行效果

在这里插入图片描述

简介

     上一个教程演示了GUI 工具包集成(gtk)。本教程介绍媒体格式和Pad功能。Pad Capabilities 是 GStreamer 的一个基本元素,尽管大多数它们不可见,因为框架会处理它们 自然而然。这个有点理论性的教程展示了:

          • 什么是 Pad 功能。

          • 如何检索它们。

          • 何时检索它们。

          • 为什么你需要了解它们。

     如前所述,Pads 允许信息进入和离开 一个元素。Pad 的功能(或简称 Caps),那么, 指定哪些类型的信息可以通过 Pad 传输。为 示例,“分辨率为 320x200 像素和 30 帧的 RGB 视频 per second“或”16 bits per sample audio, 5.1 channels at 44100 samples” 每秒“,甚至是 MP3 或 H264 等压缩格式。Pads 可以支持多种功能(例如,视频接收器可以 支持不同类型的 RGB 或 YUV 格式的视频)和功能可以是 指定为范围 (例如,音频接收器可以支持示例 速率为每秒 1 到 48000 个样本)。但是,实际的 从 Pad 到 Pad 传输的信息必须只有一个 Well Specify 类型。通过称为协商的过程,两个链接的 Pad 就 一个通用类型,因此 Pad 的 Capabilities 变得固定(它们只有一个类型并且不包含范围)。演练 下面的示例代码应该清楚地说明了这一切。为了将两个元素链接在一起,它们必须共享一个 common subset of Capabilities (否则它们不可能 相互理解)。这是 Capabilities 的主要目标。作为应用程序开发人员,您通常会通过链接 元素一起(如果使用 all-in-all 元素,则程度较小 喜欢 )。在这种情况下,您需要知道 Pad Caps(因为它们 都熟悉地引用了)的元素,或者至少知道什么 它们是 GStreamer 拒绝将两个元素与协商联系起来的时候 错误。

GStreamer相关运行库
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0/gst
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/glib-2.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0/includeLIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gstreamer-1.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gobject-2.0.lib

完整源码
#include <gst/gst.h>/* Functions below print the Capabilities in a human-friendly format */
static gboolean print_field (GQuark field, const GValue * value, gpointer pfx)
{gchar *str = gst_value_serialize (value);g_print ("%s  %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str);g_free (str);return TRUE;
}static void print_caps (const GstCaps * caps, const gchar * pfx)
{guint i;g_return_if_fail (caps != NULL);if (gst_caps_is_any (caps)){g_print ("%sANY\n", pfx);return;}if (gst_caps_is_empty (caps)){g_print ("%sEMPTY\n", pfx);return;}for (i = 0; i < gst_caps_get_size (caps); i++){GstStructure *structure = gst_caps_get_structure (caps, i);g_print ("%s%s\n", pfx, gst_structure_get_name (structure));gst_structure_foreach (structure, print_field, (gpointer) pfx);}
}/* 打印有关pod模板的信息,包括其功能 */
static void print_pad_templates_information (GstElementFactory * factory)
{g_print ("Pad Templates for %s:\n", gst_element_factory_get_longname (factory));if (!gst_element_factory_get_num_pad_templates (factory)) { g_print ("  none\n"); return; }GstStaticPadTemplate *padtemplate;const GList *pads = gst_element_factory_get_static_pad_templates (factory);while (pads){padtemplate = (GstStaticPadTemplate*)pads->data;pads = g_list_next (pads);if (padtemplate->direction == GST_PAD_SRC)g_print ("  SRC template: '%s'\n", padtemplate->name_template);else if (padtemplate->direction == GST_PAD_SINK)g_print ("  SINK template: '%s'\n", padtemplate->name_template);elseg_print ("  UNKNOWN!!! template: '%s'\n", padtemplate->name_template);if (padtemplate->presence == GST_PAD_ALWAYS)g_print ("    Availability: Always\n");else if (padtemplate->presence == GST_PAD_SOMETIMES)g_print ("    Availability: Sometimes\n");else if (padtemplate->presence == GST_PAD_REQUEST)g_print ("    Availability: On request\n");elseg_print ("    Availability: UNKNOWN!!!\n");if (padtemplate->static_caps.string){GstCaps *caps;g_print ("    Capabilities:\n");caps = gst_static_caps_get (&padtemplate->static_caps);print_caps (caps, "      ");gst_caps_unref (caps);}g_print ("\n");}
}/* 显示给定元素中请求pod的能力 */
static void print_pad_capabilities (GstElement *element, gchar *pad_name)
{/* 取回pad */GstPad *pad = gst_element_get_static_pad (element, pad_name);if (!pad) { g_printerr ("Could not retrieve pad '%s'\n", pad_name); return; }/* 获取当前在 pad 上配置的具有最后一个 GST_EVENT_CAPS 事件的功能。(如果协商尚未完成,则检索可接受的上限) */GstCaps *caps = gst_pad_get_current_caps (pad);if (!caps){caps = gst_pad_query_caps (pad, NULL);}/* 打印后释放 */g_print ("Caps for the %s pad:\n", pad_name);print_caps (caps, "      ");gst_caps_unref (caps);gst_object_unref (pad);
}int main(int argc, char *argv[])
{/* 初始化GStreamer */gst_init (&argc, &argv);/* 创建元素工厂 */GstElementFactory *source_factory = gst_element_factory_find ("audiotestsrc");GstElementFactory *sink_factory = gst_element_factory_find ("autoaudiosink");if (!source_factory || !sink_factory) { g_printerr ("Not all element factories could be created.\n"); return -1; }/* 打印这些工厂的pod模板信息 */print_pad_templates_information (source_factory);print_pad_templates_information (sink_factory);/* 要求工厂实例化实际元素 */GstElement *source = gst_element_factory_create (source_factory, "source");GstElement *sink = gst_element_factory_create (sink_factory, "sink");/* 创建空管道 */GstElement *pipeline = gst_pipeline_new ("test-pipeline");if (!pipeline || !source || !sink) { g_printerr ("Not all elements could be created.\n"); return -1; }/* 构建管道 */gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);if (gst_element_link (source, sink) != TRUE) { g_printerr ("Elements could not be linked.\n"); gst_object_unref (pipeline); return -1; }/* 打印初始能力(处于NULL状态) */g_print ("In NULL state:\n");print_pad_capabilities (sink, (gchar *)"sink");/* 开始播放 */GstStateChangeReturn ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr ("Unable to set the pipeline to the playing state (check the bus for error messages).\n"); }gboolean terminate = FALSE;GstMessage *msg;/* 等待错误、EOS或状态更改 */GstBus *bus = gst_element_get_bus (pipeline);do{// 等待获取符合条件的消息msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_STATE_CHANGED));/* 解析消息 */if (msg != NULL){GError *err;gchar *debug_info;switch (GST_MESSAGE_TYPE (msg)){case GST_MESSAGE_ERROR:gst_message_parse_error (msg, &err, &debug_info);g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");g_clear_error (&err);g_free (debug_info);terminate = TRUE; break;case GST_MESSAGE_EOS:g_print ("End-Of-Stream reached.\n");terminate = TRUE; break;case GST_MESSAGE_STATE_CHANGED:/* 我们只对来自管道的状态更改消息感兴趣 */if (GST_MESSAGE_SRC (msg) == GST_OBJECT (pipeline)){GstState old_state, new_state, pending_state;gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);g_print ("\nPipeline state changed from %s to %s:\n", gst_element_state_get_name (old_state), gst_element_state_get_name (new_state));/* 打印sink元素的当前功能 */print_pad_capabilities (sink, (gchar *)("sink"));}break;default:/* 通常不会运行到这里 */g_printerr ("Unexpected message received.\n"); break;}gst_message_unref (msg);}} while (!terminate);/* 释放资源 */gst_object_unref (bus);gst_element_set_state (pipeline, GST_STATE_NULL);gst_object_unref (pipeline);gst_object_unref (source_factory);gst_object_unref (sink_factory);return 0;
}

关注

笔者 - jxd

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

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

相关文章

【前缀和与差分 C/C++】洛谷 P8218 求区间和

2025 - 03 - 09 - 第 72 篇 Author: 郑龙浩 / 仟濹 【前缀和与差分 C/C】 文章目录 洛谷 P8218 求区间和题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示思路代码 洛谷 P8218 求区间和 题目描述 给定 n n n 个正整数组成的数列 a 1 , a 2 , ⋯ , a n a_…

初识Bert

在学习Bert之前我们先了解“递归神经网络&#xff08;RNN Recurrent neural network)” 和 “长短期记忆&#xff08;LSTM Long short-term memory)” 我们如果仅仅识别每个字的含义&#xff0c;那么在一句话中没有相同的字还是可以的但是如果一句话中有相同的字&#xff0c;那…

clickhouse源码分析

《ClickHouse源码分析》 当我们谈论数据库时&#xff0c;ClickHouse是一个不容忽视的名字。它是一个用于联机分析处理&#xff08;OLAP&#xff09;的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;以其快速的数据查询能力而闻名。对于想要深入了解这个高效工具…

[网络爬虫] 动态网页抓取 — Selenium 元素定位

&#x1f31f;想系统化学习爬虫技术&#xff1f;看看这个&#xff1a;[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 在使用 Selenium 时&#xff0c;往往需要先定位到指定元素&#xff0c;然后再执行相应的操作。例如&#xff0c;再向文本输入框中输入文字之前&#xff0c;…

ArcGIS操作:15 计算点的经纬度,并添加到属性表

注意&#xff1a;需要转化为地理坐标系 1、打开属性表&#xff0c;添加字段 2、计算字段&#xff08;以计算纬度为例 !Shape!.centroid.Y ) 3、效果

[项目]基于FreeRTOS的STM32四轴飞行器: 七.遥控器按键

基于FreeRTOS的STM32四轴飞行器: 七.遥控器 一.遥控器按键摇杆功能说明二.摇杆和按键的配置三.按键扫描 一.遥控器按键摇杆功能说明 两个手柄四个ADC。 左侧手柄&#xff1a; 前后推为飞控油门&#xff0c;左右推为控制飞机偏航角。 右侧手柄&#xff1a; 控制飞机飞行方向&a…

Redis 内存淘汰策略深度解析

Redis 作为高性能的内存数据库&#xff0c;其内存资源的高效管理直接关系到系统的稳定性和性能。当 Redis 的内存使用达到配置的最大值&#xff08;maxmemory&#xff09;时&#xff0c;新的写入操作将触发内存淘汰机制&#xff08;Eviction Policy&#xff09;&#xff0c;以释…

【面试】Java 集合

集合 1、常见的集合有哪些2、说说 List、Set、Queue、Map 四者的区别3、Collection 和 Collections 有什么区别4、Comparable 和 Comparator 的区别5、ArrayList 和 LinkedList 的区别是什么6、ArrayList 和 Vector 的区别是什么7、ArrayList 和 Vector 的扩容机制8、CopyOnWri…

【c++】平移字符串

说明 实现字符串的左移与右移 示例代码 #include <iostream> #include <string> using namespace std;int main() {string str1 "12345";//左移2位string str2 str1.substr(2) str1.substr(0, 2);cout << str2 << endl;//右移2位&…

密码学(终极版)

加密 & 解密 备注&#xff1a;密码学领域不存在完全不能破解的密码&#xff0c;但是如果一个密码需要很久很久&#xff0c;例如一万年才能破解&#xff0c;就认为这个密码是安全的了。 对称加密 非对称加密 公钥加密、私钥解密 私钥签名、公钥认证 非对称的底层原理是…

FreeRTOS任务状态查询

一.任务相关API vTaskList&#xff08;&#xff09;&#xff0c;创建一个表格描述每个任务的详细信息 char biaoge[1000]; //定义一个缓存 vTaskList(biaoge); //将表格存到这缓存中 printf("%s /r/n",biaoge); 1.uxTaskPriorityGet&#xff08;&#xf…

yolov5代码详解--3.python代码脚本

三、val.py val.py的主要作用是对训练好的模型进行验证&#xff08;或评估&#xff09;。具体来说&#xff0c;它用于在指定的验证集上评估模型的性能&#xff0c;计算各项评估指标&#xff0c;并输出结果。val.py通常在模型训练完成后运行&#xff0c;用于验证模型的检测精度、…

无人机应用探索:玻纤增强复合材料的疲劳性能研究

随着无人机技术的快速发展&#xff0c;轻量化已成为其结构设计的核心需求。玻纤增强复合材料凭借高强度、低密度和优异的耐环境性能&#xff0c;成为无人机机身、旋翼支架等关键部件的理想选择。然而&#xff0c;无人机在服役过程中需应对复杂多变的环境&#xff1a;高空飞行时…

Python SQLite3 保姆级教程:从零开始学数据库操作

Python SQLite3 保姆级教程&#xff1a;从零开始学数据库操作 本文适合纯新手&#xff01;无需任何数据库基础&#xff0c;跟着步骤操作即可掌握 SQLite3 的核心用法。 目标&#xff1a;让你像用记事本一样轻松操作数据库&#xff01; 目录 什么是 SQLite3&#xff1f;环境准…

C语言中的整数类型(short,int,long和long long)

整数是编程中最常见的一种数据类型&#xff0c;C语言提供了多种整数类型&#xff0c;包括 short、int、long 和 long long&#xff0c;它们的主要区别在于存储范围和内存占用的大小。 本节将详细讲解这些整数类型的定义、特性、使用场景以及注意事项&#xff0c;帮助你全面理解…

使用jcodec库,访问网络视频提取封面图片上传至oss

注释部分为FFmpeg&#xff08;确实方便但依赖太大&#xff0c;不想用&#xff09; package com.zuodou.upload;import com.aliyun.oss.OSS; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.zuodou.oss.OssProperties;…

游戏引擎学习第147天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说&#xff0c;我们通过隐式计算来解决问题&#xff0c;而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分&#xff0c;并计划继续处理音量问题。不过&#xff0c;实际上我们现在不需要继续处理…

使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile

比起容器、镜像来说&#xff0c;Dockerfile 非常普通&#xff0c;它就是一个纯文本&#xff0c;里面记录了一系列的构建指令&#xff0c;比如选择基础镜像、拷贝文件、运行脚本等等&#xff0c;每个指令都会生成一个 Layer&#xff0c;而 Docker 顺序执行这个文件里的所有步骤&…

Linux -- 磁盘结构、文件系统ext2

一、磁盘 1.磁盘的物理结构 2.磁盘的存储结构 盘片&#xff1a;是机械硬盘存储数据的主要介质&#xff0c;一般由铝合金或玻璃等材料制成&#xff0c;表面涂有一层磁性材料。数据通过磁头在盘片的磁性涂层上进行磁化来记录&#xff0c;磁化的不同方向代表二进制的 0 和 1。盘面…

标量、向量、矩阵与张量:从维度理解数据结构的层次

在数学和计算机科学中,维度描述了数据结构的复杂性,而标量、向量、矩阵、张量则是不同维度的数据表示形式。它们的关系可以理解为从简单到复杂的扩展,以下是详细解析: 1. 标量(Scalar):0维数据 定义:单个数值,没有方向,只有大小。 维度:0维(无索引)。 示例: 温度…