GStreamer Playback tutorial 学习笔记(一)

playbin运用

多流处理:一个电影,对应一个视频和多个音频流(立体声/5.1声道被视为一个单独的流),以适应不同的语言。在这种情况下,用户选择一个音频流,应用程序只播放选定的音频流,忽略其他音频流。

为了能够选择合适的流,用户需要了解一些关于它们的信息,例如它们的语言。这些信息以“元数据”(附加数据)的形式嵌入在流中,本教程展示了如何检索这些信息。

分流

定义:从容器中检索各个流的过程被称为“分流”(demultiplexing)或“解封装”(demuxing

枚举与playbin标志位

稍后,我们将设置一些playbin的标志位。我们希望有一个方便的枚举类型,可以方便地操作这些标志位,但由于playbin是一个插件,不是GStreamer核心的一部分,所以这个枚举类型对我们不可用。"技巧"就是在我们的代码中声明这个枚举类型:GstPlayFlagsGObject允许内省,因此可以在运行时获取这些标志位的可能值,而不使用这个"技巧"的方式要复杂得多。

函数与知识点

  1. flags属性:playbin的重要属性之一,可以改变playbin的行为,该属性可以具有任何组合的GstPlayFlags。其中最有趣的值有:GST_PLAY_FLAG_VIDEO 启用视频渲染;GST_PLAY_FLAG_AUDIO 启用声音渲染;GST_PLAY_FLAG_TEXT 启用字母渲染;GST_PLAY_FLAG_VIS 没有视频流时,启用可视化;其他参数见Basic tutorial 12

  2. connection-speed属性:playbin的属性之一,告知playbin我们网络连接的最大速度,因此,如果服务器上有多个可用版本的请求媒体,playbin会选择最合适的版本。这通常与像HLSRTSP这样的流媒体协议结合使用。

  3. GMainLoop 属性:表示 GLibGTK+ 应用程序的主事件循环的不透明数据类型。

  4. g_main_loop_run() 功能:在调用循环的g_main_loop_quit()之前,运行主事件循环。

    注意:如果在循环的GMainContext线程上调用此函数,它将处理循环中的事件,否则它将简单地等待。

  5. g_main_loop_quit() 功能:停止运行一个GMainLoop,对于该循环的任何对g_main_loop_run()的调用都会返回。

    注意,当调用g_main_loop_quit()时已经被分派的源仍将被执行。

  6. GstTagList 属性:gst数据结构之一。存储描述媒体元数据的标签列表。

  7. void g_signal_emit_by_name (GObject* instance, const gchar* detailed_signal, ...) 功能:发出一个信号。信号的发出是同步进行的。只有在调用了所有处理程序或停止信号发出后,该方法才会返回控制。

    提示:本tutorial里,用于恢复与流相关联的GstTagList

  8. 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-tagsget-audio-tagsget-text-tags。标签的名称是标准化的,并且该列表可以在GstTagList文档中找到。在这个示例中,我们对流的GST_TAG_LANGUAGE_CODE和其GST_TAG_*_CODEC(音频、视频或文本)感兴趣。

  9. playbin的另外三个属性:current-videocurrent-audiocurrent-text,获取当前选中的流。

你可能感兴趣的:(GStreamer学习笔记,GStreamer,服务器,webrtc,c++)