十七、GstStreams
1 GstStream基本概念
-
GstStream对象是一个高级对象,定义了一个数据流,在GstPipeline中存在或可以存在。
-
它由一个唯一标识符“Stream ID”定义。一个GstStream并不自动意味着该流在管道或元素中存在。
-
能够在管道中引入新流的任何元素都应该创建适当的GstStream对象,并可以通过GST_EVENT_STREAM_START事件和/或GstStreamCollection传递该对象。
-
不修改流的性质的元素可以为其添加额外信息(例如丰富GstCaps或GstTagList)。这通常是由解析元素完成的。
1.1 GstStreams继承关系
GObject
╰──GInitiallyUnowned
╰──GstObject
╰──GstStream
2 GstStream类型结构
2.1 GstStream类型注册宏定义
/* filename: gststreams.h */
#define GST_TYPE_STREAM (gst_stream_get_type ())
/* filename: gststreams.c */
G_DEFINE_TYPE_WITH_CODE (GstStream, gst_stream, GST_TYPE_OBJECT,
G_ADD_PRIVATE (GstStream) _do_init);
2.2 GstStream类型相关枚举
2.2.1 GstStreamType
typedef enum {
/* 目前这个流没有被标识类型 */
GST_STREAM_TYPE_UNKNOWN = 1 << 0,
/* 音频流 */
GST_STREAM_TYPE_AUDIO = 1 << 1,
/* 视频流 */
GST_STREAM_TYPE_VIDEO = 1 << 2,
/* 复用类型流 muxed container type */
GST_STREAM_TYPE_CONTAINER = 1 << 3,
/* 流包含字幕/图片数据 */
GST_STREAM_TYPE_TEXT = 1 << 4
} GstStreamType;
2.2.2 GstStreamFlags
/* filename: gstevent.h */
/**
* GstStreamFlags:
* @GST_STREAM_FLAG_NONE: 此流没有特殊属性
* @GST_STREAM_FLAG_SPARSE: 此流是一个稀疏流(例如,字幕流),数据可能仅在不规则间隔内以较大间隔流动。
* @GST_STREAM_FLAG_SELECT: 此流应默认选择。此标志可供解复用器使用,以表示在播放场景中应默认选择该流。
* @GST_STREAM_FLAG_UNSELECT: 此流不应默认选择。此标志可供解复用器使用,以表示在播放场景中不应默认选择该流,但仅当用户显式选择时(例如,对于听障者的音频轨道或导演的解说音轨)。
*
* 自版本:1.2
*/
typedef enum {
GST_STREAM_FLAG_NONE,
GST_STREAM_FLAG_SPARSE = (1 << 0),
GST_STREAM_FLAG_SELECT = (1 << 1),
GST_STREAM_FLAG_UNSELECT = (1 << 2)
} GstStreamFlags;
2.3 GstStream相关结构体
2.3.1 GstStreamClass
/* filename: gststreams.h */
struct _GstStreamClass {
GstObjectClass parent_class;
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
2.3.2 GstStream
/* filename: gststreams.h */
/**
* GstStream:
* @stream_id: 此 #GstStream 的流标识符
*
* 代表单个流的高级对象。它可能由管道中的实际数据流(#GstPad)支持,也可能没有。
*
* 一个 #GstStream 不关心数据的变化(例如解码、编码、解析等),只要底层数据流对应于相同的高级流(例如,特定的音频轨道)。
*
* 一个 #GstStream 包含有关流的所有相关信息,如流标识符、标签、能力、类型等。
*
* 元素可以为内部使用(包含与数据流相关的信息)子类化 #GstStream。
*
*
* Since: 1.10
*/
struct _GstStream {
/*< private >*/
GstObject object;
/*< public >*/
const gchar *stream_id; /* 此 #GstStream的流标识符 */
/*< private >*/
GstStreamPrivate *priv;
gpointer _gst_reserved[GST_PADDING];
};
2.3.3 GstStreamPrivate
/* filename: gststreams.c */
struct _GstStreamPrivate
{
GstStreamFlags flags;
GstStreamType type;
GstTagList *tags;
GstCaps *caps;
};