playbin运用
多流处理:一个电影,对应一个视频和多个音频流(立体声/5.1声道被视为一个单独的流),以适应不同的语言。在这种情况下,用户选择一个音频流,应用程序只播放选定的音频流,忽略其他音频流。
为了能够选择合适的流,用户需要了解一些关于它们的信息,例如它们的语言。这些信息以“元数据”(附加数据)的形式嵌入在流中,本教程展示了如何检索这些信息。
分流
定义:从容器中检索各个流的过程被称为“分流”(demultiplexing
)或“解封装”(demuxing
)
枚举与playbin标志位
稍后,我们将设置一些playbin
的标志位。我们希望有一个方便的枚举类型,可以方便地操作这些标志位,但由于playbin
是一个插件,不是GStreamer核心的一部分,所以这个枚举类型对我们不可用。"技巧"就是在我们的代码中声明这个枚举类型:GstPlayFlags
。GObject
允许内省,因此可以在运行时获取这些标志位的可能值,而不使用这个"技巧"的方式要复杂得多。
函数与知识点
-
flags
属性:playbin
的重要属性之一,可以改变playbin
的行为,该属性可以具有任何组合的GstPlayFlags
。其中最有趣的值有:GST_PLAY_FLAG_VIDEO
启用视频渲染;GST_PLAY_FLAG_AUDIO
启用声音渲染;GST_PLAY_FLAG_TEXT
启用字母渲染;GST_PLAY_FLAG_VIS
没有视频流时,启用可视化;其他参数见Basic tutorial 12
-
connection-speed
属性:playbin
的属性之一,告知playbin
我们网络连接的最大速度,因此,如果服务器上有多个可用版本的请求媒体,playbin
会选择最合适的版本。这通常与像HLS
或RTSP
这样的流媒体协议结合使用。 -
GMainLoop
属性:表示GLib
或GTK+
应用程序的主事件循环的不透明数据类型。 -
g_main_loop_run()
功能:在调用循环的g_main_loop_quit()
之前,运行主事件循环。注意:如果在循环的
GMainContext
线程上调用此函数,它将处理循环中的事件,否则它将简单地等待。 -
g_main_loop_quit()
功能:停止运行一个GMainLoop
,对于该循环的任何对g_main_loop_run()
的调用都会返回。注意,当调用
g_main_loop_quit()
时已经被分派的源仍将被执行。 -
GstTagList
属性:gst
数据结构之一。存储描述媒体元数据的标签列表。 -
void g_signal_emit_by_name (GObject* instance, const gchar* detailed_signal, ...)
功能:发出一个信号。信号的发出是同步进行的。只有在调用了所有处理程序或停止信号发出后,该方法才会返回控制。提示:本
tutorial
里,用于恢复与流相关联的GstTagList
-
gst_tag_list_get_string()
功能:将给定标签的内容复制到值中,如果与该标签关联的有多个值,则将多个值合并为一个值。说明:值中的结果字符串将使用
UTF-8
编码,并在不再需要时由调用者使用g_free
释放。返回的字符串也保证非NULL
和非空。提示:本
tutorial
中,使用像gst_tag_list_get_string()
这样的gst_tag_list_get_*
函数提取单个标签。这种检索标签列表的方式可能不太直观,被称为动作信号。动作信号由应用程序发送给特定的元素,该元素执行动作并返回结果。它们的行为类似于动态函数调用,其中类的方法通过名称(信号的名称)而不是内存地址来标识。这些信号在文档中以及常规信号一起列出,并且被打上“动作”的标签。例如,可以参考playbin的文档。
playbin
定义了3个动作信号以获取元数据:get-video-tags
、get-audio-tags
和get-text-tags
。标签的名称是标准化的,并且该列表可以在GstTagList
文档中找到。在这个示例中,我们对流的GST_TAG_LANGUAGE_CODE
和其GST_TAG_*_CODEC
(音频、视频或文本)感兴趣。 -
playbin
的另外三个属性:current-video
、current-audio
和current-text
,获取当前选中的流。