gstreamer---basic-tutorial-1

没有什么比在屏幕上打印“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 可以处理音频和视频文件及功能

  1. 自动文件类型识别,并基于自动选择和使用正确的音频/视频/字幕解复用器/解码器
  2. 音频文件的可视化
  3. 视频文件的字幕支持。字幕可以存储在外部文件中。
  4. 不同视频/音频/字幕流之间的流选择
  5. 元信息(标签)提取
  6. 轻松访问上一个视频示例
  7. 通过网络播放流时进行缓冲
  8. 带静音选项的音量控制

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清除,返回的是完整传输的可为空的值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ap21ril

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值