gstreamer---basic-tutorial-1

news/2024/5/19 14:45:27 标签: 人工智能, 边缘计算

没有什么比在屏幕上打印“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清除,返回的是完整传输的可为空的值

http://www.niftyadmin.cn/n/1223316.html

相关文章

三维空间长度温度数量_模温机是如何控制模具温度,必须要遵守的原则

模具温度对胶件的成型质量、成型效率有着较大的影响。在温度较高的模具里&#xff0c;熔融胶料的流动性较好&#xff0c;有利于胶料充填强&#xff0c;获取高质量的胶件外观表面&#xff0c;但会使胶料固化时间变长&#xff0c;顶出时易变形&#xff0c;对结晶性胶料而言&#…

也谈WINDOWS下分区类型变为RAW

作者&#xff1a;张宇&#xff0c;北亚硬盘数据恢复中心&#xff0c;转载请联系作者&#xff0c;如果实在不想联系作者&#xff0c;至少请保留版权&#xff0c;谢谢。看到网上有很多人提到&#xff0c;在正常使用电脑的情况下&#xff0c;分区类型变为RAW&#xff0c;双击时提示…

adb查看版本号_adb使用第4课(查找包名)

通过adb查询设备里面的包名1、先手动打开对应的APP应用2、输入&#xff1a;adb shell dumpsys window w |findstr / |findstr name这样就可以查看到酷我音乐的包名&#xff1a;cn.kuwo.kwmusiccar但是找到包名后想知道这个包名的版本信息和对应的安装位置&#xff0c;那该怎么办…

Gstreamer---Basic tutorial 2: GStreamer相关概念

通过示例二可以学习&#xff1a; 1、什么是GStreamer对象及怎么创建 2、如何将元素互相连接 3、如何自定义用户的行为 4、如何观察总线的错误情况并从GStreamer消息中提取信息 #include <gst/gst.h>/* 通过示例二可以学习&#xff1a; 1、什么是GStreamer对象及怎么创建…

json文件存储 qt_初学Qt(二) 中高级功能列举

上一次和大家聊了聊Qt的三大基类&#xff0c;信号和槽的使用以及重新实现一些事件等话题。如果在学习Qt之前有一定的C语言编程&#xff0c;可能对响应界面操作还会有些不习惯。这次聊一聊Qt的中高级功能。一、高级功能&#xff1a;国际化、自定义外观、3D画图、创建插件在C GUI…

windows下解压linux、unix平台TAR包的乱码问题

作者&#xff1a;张宇&#xff0c;北亚硬盘数据恢复中心&#xff0c;转载请联系作者&#xff0c;如果实在不想联系作者&#xff0c;至少请保留版权&#xff0c;谢谢。这篇文章的部分观点是我的个人看法&#xff0c;可能会有错误&#xff0c;希望大家指正。WINDOWS与LINUX/UNIX对…

hexo评论_hexo 博客添加评论和阅读量

说在最前面&#xff0c;最近刚发现一个好看的主题 Chic&#xff0c;然后果断就换了。效果很好。感谢作者。如果你们也喜欢的话&#xff0c;直接去GitHub项目&#xff0c;里边有安装文档&#xff0c;非常的简单。附上我的博客地址&#xff0c;欢迎参观。评论和文章阅读量统计经过…

GStreamer---Basic tutorial 3: 动态管道

学习完这篇教程&#xff0c;你讲具备开始Playback tutorial的必要知识&#xff1a; 如何在连接elements的时候实现更好的控制。如何获取感兴趣的事件通知以便及时做出处理。 #include <gst/gst.h>/* Structure to contain all our information, so we can pass it to c…