没有什么比在屏幕上打印“Hello World”更好的了!
但是由于我们正在处理多媒体框架,因此我们将播放视频。
不要被下面的代码量吓到:只有4行可以做真正的工作,其余的是清理代码。
#include <gst/gst.h>
#include<stdio.h>
int
main(int argc, char* argv[])
{
GstElement* pipeline;
GstBus* bus;
GstMessage* msg;
/* Initialize GStreamer */
//不管使用gstreamer做什么事情,这一行语句是必须要的,且一定是第一个gstreamer命令。
//初始化 GStreamer 库、设置内部路径列表、注册内置元素和加载标准插件。
gst_init(&argc, &argv);
/* Build the pipeline */
//此行是本程序的核心,并举例说明了两个关键点 gst_parse_launch 和 playbin 具体的作用后面会提到
//样例中给的视频经常加载不出来,此处我用了局域网中的摄像头
pipeline =
gst_parse_launch
("playbin uri=rtsp://账号:密码@IP:端口号/h264/ch1/main/av_stream",
NULL);
printf("111 begin");
/* Start playing */
//每个GStreamer元素都有一个关联的状态,只有当状态为 PLAYING 时才会开始执行。
gst_element_set_state(pipeline, GST_STATE_PLAYING);
/* Wait until error or EOS */
//以下语句一直等到发生错误或找到流的末尾,当媒体到达其末端(EOS)或遇到错误(尝试关闭视频窗口或拔下网线)时,执行将结束。
bus = gst_element_get_bus(pipeline);
msg =
gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE,
GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
/* See next tutorial for proper error message handling/parsing */
if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR) {
g_error("An error occurred! Re-run with the GST_DEBUG=*:WARN environment "
"variable set for more details.");
}
/* Free resources */
//对所有资源进行释放
gst_message_unref(msg);
gst_object_unref(bus);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
return 0;
}
运行结果
gst_parse_launch
GstElement *
gst_parse_launch (const gchar * pipeline_description,
GError ** error)
该函数将 pipeline 的文本描述转换为具体的 pipeline 对象,gst-launch-1.0 命令行工具实际上是围绕它实现的。
pipeline_description – 描述管道的命令行
error – 管道错误时的错误消息。
返回消息:
成功时返回 GstElement 类型的 pipeline,失败时返回 NULL
playbin
playbin 组件同时充当了媒体数据的 source 和 sink,我们让 gst_parse_launch() 构造的是由 playbin 单个组件组成的 pipeline,playbin 的内部实现里创造和连接了用于播放媒体流的所有必要组件,示例将 uri 参数传递给了_playbin_ uri 可以是_http:// 或 _file://,playbin 会透明的示例相应的 source,如果出现 uri 错误、文件不存在或缺少插件等问题,示例程序会错误退出,实际应用中我们往往通过 Gstreamer 的通信机制来获得反馈。
Playbin 可以处理音频和视频文件及功能
- 自动文件类型识别,并基于自动选择和使用正确的音频/视频/字幕解复用器/解码器
- 音频文件的可视化
- 视频文件的字幕支持。字幕可以存储在外部文件中。
- 不同视频/音频/字幕流之间的流选择
- 元信息(标签)提取
- 轻松访问上一个视频示例
- 通过网络播放流时进行缓冲
- 带静音选项的音量控制
gst_element_set_state
当GStreamer框架中的元件通过管道连接好之后,它们就开始了各自的处理流程,期间一般会经历多次状态切换,其中每个元件在特定时刻将处于如下四种状态之一:
GST_STATE_NULL:这是默认状态。在这种状态下没有分配资源,因此,转换到此状态将释放所有资源。当元件的引用计数达到0并被释放时,该元件必须处于此状态。
GST_STATE_READY:在就绪状态下,元件已分配了其所有全局资源,即可以保留在流中的资源。你可以考虑打开设备,分配缓冲区等。但是在这种状态下不会打开流,因此流位置自动为零。如果先前已打开流,则应在此状态下将其关闭,并应重置位置,属性等。
GST_STATE_PAUSED:在此状态下,元件已打开流,但未对其进行处理。此时元件可以修改流的位置,读取和处理数据,状态一旦更改为 PLAYING,即可开始播放。总之,PAUSED 与 PLAYING 相同,只是 PAUSED 没有运行时钟。
GST_STATE_PLAYING:在该 PLAYING 状态下,与该 PAUSED 状态下完全相同,只是时钟现在运行。
所有的元件都从NULL状态开始,依次经历 NULL、READY、PAUSED、PLAYING 等状态间的转换。元件当前所处的状态可以通过调用 gst_element_set_state() 函数进行切换:
gst_element_get_bus
gst_element_get_bus()会得到pipeline的总线
GstBus *
gst_element_get_bus (GstElement * element)
返回组件的bus,注意只有GstPipeline会为应用程序提供bus
element - 获取bus的目标组件
return - 组件的GstBus,使用后需要取消引用(unref),返回的是完整传输的可为空的值
gst_bus_timed_pop_filtered
gst_bus_timed_pop_filtered()会阻塞直到你遇到一个错误或者流播放结束。
在超时时间内从bus上获取一条消息,该消息类型与指定的消息掩码匹配时返回,会丢弃所有与指定消息掩码不匹配的消息,如果超时时间为0,此函数行为与gst_bus_pop_filtered类似,如果超时时间为GST_CLOCK_TIME_NONE,函数会一直阻塞,直到bus上出现匹配的消息
bus - 获取到的总线
timeout - 超时时间(单位ns),GST_CLOCK_TIME_NONE会使函数永远等待
types - 指定匹配的消息类型,匹配任何类型为GST_MESSAGE_ANY
return - 如果超时仍未收到匹配的消息类型会返回NULL,否则会返回与之匹配的GstMessage类型,消息是从bus上 获取到的,使用后需要通过gst_message_unref清除,返回的是完整传输的可为空的值