gstreamer应用开发(播放器)之旅

Dreaming-in-Gottingen 2021-03-18 原文

GStreamer开发,主要分为两块:应用开发、插件开发。

插件开发人员,通常是编解码库的作者(做出了编解码库后,希望gstreamer能用起来这个库,因此增加这个适配层)、芯片原厂人员(将自家的hw适配到gstreamer框架下)、其他(对muxer/demux软件库较熟悉的)。

应用开发人员,调通用的标准接口,进行多媒体处理。

 

  本篇是针对app开发者来介绍的。

  需求:命令行的管道方式可以播放一个文件,但如果在应用程序中播放,如何做呢?

这个一个基本流程:

0. pipeline生成:gst_pipeline_new(const gchar * name)
  是对下条接口的封装:gst_element_factory_make(“pipeline”, name);

  其实,pipeline就是一个element,其直接父类为GstBin,爷爷类为GstElement,太爷类为GstObject,再上面一层是GInitiallyUnowned,再再上面一层为GInitiallyUnowned

1. element生成:gst_element_factory_make(const gchar * factoryname, const gchar * name)
  某个element生成流程:先找到某个elemnent factory,再用该工厂生产出某个具体element
  step1: factory = gst_element_factory_find(factoryname)
  step2: element = gst_element_factory_create(factory, name)
  注意:factoryname必须准确,否则找不到工厂,但某个element的名字name可以随意变化(即使为NULL也行),但最好命名符合意义。
  pipeline的生成也是直接调这个接口的。

2. 某个factory的寻找:gst_element_factory_find(const gchar* name)
  先从注册的插件系统中寻找该feature,再引用该feature
  step1: GstPluginFeature *feature = gst_registry_find_feature(gst_registry_get(), name, GST_TYPE_ELEMENT_FACTORY);
  step2: GST_ELEMENT_FACTORY(feature); //把GstPluginFeature *转换为GstElementFactory *

3. 拿到pipeline的消息总线(GstBus*):gst_pipeline_get_bus(GST_PIPELINE(pipeline))

  gst_pipeline_xx的参数只能针对GstPipeline类型的
  先转换为element,再拿element的bus(只有element才有bus)
  step1: gst_element_get_bus(GST_ELEMENT_CAST(pipeline));
  step2: gst_element_get_bus(GstElement * element); //拿Bus时要对element加锁

4. 注册总线观察者:gst_bus_add_watch(bus, bus_call, loop);
  gst_bus_add_watch_full (bus, G_PRIORITY_DEFAULT, func, user_data, NULL);
  gst_bus_add_watch_full_unlocked()
  step1: GSource *source = get_bus_create_watch(bus)
  step2: g_source_set_callback(source, (GSourceFunc)func, user_data, notify);
  step3: GMainContext *ctx = g_main_context_get_thread_default();
  step4: guint id = g_source_attach(source, ctx);
  step5: g_source_unref(source);

5. bin中添加element:gst_bin_add_many(GST_BIN(pipeline), src, decoder, sink, NULL);
  依次将各element添加到bin中:
    while (element1) {
      gst_bin_add(bin, element1);
      element_1 = va_arg(args, GstElement*);
    }

6. 串联各element:gst_element_link_many(src, decoder, sink, NULL);
  与上条类似,依次将各element串联起来(gst_element_link(element_1, element_2))

7. 设置pipeline状态:gst_element_set_state(pipeline, GST_STATE_PLAYING);
  先拿到GstElementClass类,再对其进行状态设置
  step1: GstElementClass *oclass = GST_ELEMENT_GET_CLASS(element);
  step2: oclass->set_state(element, state);

发表于
2021-03-18 00:37 
OnlyTime_唯有时光 
阅读(0
评论(0
编辑 
收藏

 

版权声明:本文为Dreaming-in-Gottingen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Dreaming-in-Gottingen/p/14553052.html

gstreamer应用开发(播放器)之旅的更多相关文章

  1. GStreamer环境搭建篇

    GStreamer环境搭建篇   GStreamer是一套强大的多媒体中间件系统,跟FFmpeg功能类似。   […]...

  2. GStreamer各个包构建

    GStreamer各个包构建   GStreamer按功能、维护的标准化程度、依赖库的版权差异等分了若干个包( […]...

随机推荐

  1. Python三十个常见的脚本汇总

    1、冒泡排序     2、计算x的n次方的方法     这里有我自己整理了一套最新的python系统学习教程, […]...

  2. render_template 网页模板

    模板简单介绍:   视图函数:视图函数就是装饰器所装饰的方法,视图函数的主要作用是生成请求的响应,这是最简单的 […]...

  3. 运维工作经验汇总———高级运维工程师

    目录 第一章 初入公司 第2章 第一阶段:解决物理服务器单电问题 第3章 第二阶段:解决服务器虚拟化问题 第4 […]...

  4. book list

    少有人走的路—心智成熟的旅程 心态决定一切 富爸爸穷爸爸 余世维的书...

  5. 【算法】哈希表的诞生

    参考资料 《算法(java)》                           — — Robert Se […]...

  6. 动态规划入门——多重背包与单调优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第14篇文章,也是动态规划专 […]...

  7. ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码

    概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful […]...

  8. Hive千亿级数据倾斜解决方案

    数据倾斜问题剖析 数据倾斜是分布式系统不可避免的问题,任何分布式系统都有几率发生数据倾斜,但有些小伙伴在平时工 […]...