Gstreamer基础课程6: 媒体格式和Pad Caps

1.目标

Pad是Gstreamer的基本元素。本教程主要是

  • what are Pad Capabilities
  • How to retrieve them
  • When to retrieve them
  • Why you need to know about them

2.介绍

2.1 Pads

Pads允许数据进入和离开元素。Pad Caps则指定了可以通过Pad传递的数据类型。例如,“分辨率为320x200像素且每秒30帧的RGB视频”,或“每个样本音频16位,每秒44100个样本的5.1通道”,甚至是诸如mp3或h264之类的压缩格式。
Pad可以支持多种Caps,(例如,视频接收器可以支持不同类型的RGB或YUV格式的视频),并且可以为Caps指定范围,(例如,音频接收器可以支持每秒1到48000个样本的采样率)。但是,从Pad到Pad的实际数据必须只有一种明确指定的类型,这个过程称为协商(negotiation)。两个进行链接的Pad会就一种固定的类型达成共识。
为了将两个元素链接在一起,它们必须共享一个功能的公共子集(否则它们可能无法相互理解)。这是Pad的主要目的。

2.2 Pad 模版

Pad是从Pad模版中创建的,该模版指示Pad可能具有的所有可能的Caps。模版对于创建多个相似的Pad很有用,并且还允许提早拒绝元素之间的链接,如果Pad模版的Caps没有公共子集,则无需进一步的协商。
Pad模版可以视为协商过程中的第一步,随着过程的发展,再实例化实际的Pad,并完善其Capa,直到修复(或协商失败)为止。

2.3 功能示例

在这里插入图片描述
该Pad是在元素上始终可用的sink。它支持两种媒体,均是整数格式的原始音频(audio/x-raw),有符号16bit Little Endian和无符号8bit。方括号表示范围,例如通道数从1到2不等。
在这里插入图片描述
video/x-raw表示次src pad输出原始视频。它支持各种尺寸和帧率,以及一组YUV格式(花括号表示一个列表)。所有的这些格式表示图像平面的不同打包和二次采样。

2.4 PS

gst-inspect-1.0命令可以用来查看Gstreamer元素的Caps。
请记住,某些元素会查询底层硬件以获取受支持的格式,并相应地提供其Pad Caps(通常在进入READY状态或更高状态时执行此操作)。因此,所显示的上限可能因平台而异,甚至因一次执行而不同(即使这种情况很少见)。
本教程实例化了两个元素(这次,通过它们的工厂),显示了它们的Pad模板,链接了它们并设置了播放管道。在每次状态更改时,都会显示接收器元素的Pad的功能,因此您可以观察到协商如何进行,直到确定Pad Caps为止。

3.Implement

3.1 Compile

gcc basic-tutorial-6.c -o basic-tutorial-6 `pkg-config --cflags --libs gstreamer-1.0`

3.2 Code

#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);
  }
}

/* Prints information about a Pad Template, including its Capabilities */
static void print_pad_templates_information (GstElementFactory * factory) {
   
  const GList *pads;
  GstStaticPadTemplate *padtemplate;

  g_print ("Pad Templates for %s:\n", gst_element_factory_get_longname (factory
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值