zoukankan      html  css  js  c++  java
  • openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))

    1)概述

    管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号。所有这些数据流在运行的时候自动的流过管道。

    2) 缓冲区(Buffers)

    缓冲区包含了你创建的管道里的数据流。通常一个source element会创建一个新的缓冲区,同时element还将会把缓冲区的数据传递给下一个element。当使用GStreamer底层构造来创建一个媒体管道的时候,你不需要自己来处理缓冲区,element将会为你处理这些缓冲区。

    一个缓冲区主要由以下一个组成:

    指向某块内存的指针

    内存的大小

    缓冲区的时间戳

    一个引用计数,指出了缓冲区所使用的element数。没有element可引用的时候,这个element将用于销毁缓冲区。

    这里有一个简单的例子,我们先创建了一个缓冲区,然后为这个缓冲区分配内存,然后将数据存放在缓冲区中,并传递至下一个element。该element读取数据,处理某些事件(像创建一个新的缓冲区并进行解码),对该缓冲区解引用,这将造成数据空闲,导致缓冲区被销毁。典型的音频和视频解码器就是这样工作的。

    尽管如此,还有一些更为复杂的设定,element会适当的修改缓冲区,也就是说,不会分配一个新的缓冲区。element也可以写入硬件内存(如视频捕获源)或是使用XShm从X-server分配内存。缓冲区只能读,等等。

    3)事件(Events)

    事件是一系列控制粒子,随着缓冲区被发送到管道的上游和下游。下游事件通知流状态相同的element,可能的事件包括中断,flush,流的终止信号等等。在应用程序与element之间的交互以及事件与事件之间的交互中,上游事件被用于改变管道中数据流的状态,如查找。对于应用程序来说,上游事件非常重要,下游事件则是为了说明获取更加完善的数据概念上的图像。

    由于大多数应用程序以时间为单位查找,下面的例子实现了同样的功能:

    static void  seek_to_time (GstElement *element,     guint64     time_ns)

    {

         GstEvent *event;

         event = gst_event_new_seek (GST_SEEK_METHOD_SET |  GST_FORMAT_TIME,   time_ns);

         gst_element_send_event (element, event);

    }

    以上代码主要是说明其具体的工作原理,快捷算法是一个函数 gst_element_seek ()。

  • 相关阅读:
    SQL Server CheckPoint的几个误区
    MongoDB集群与LBS应用系列(一)
    也来“玩”Metro UI之磁贴
    Python基础:函数式编程
    ASP.NET MVC 用户登录Login
    巧用 .NET 中的「合并运算符」获得 URL 中的参数
    Razor.js,基于JavaScript的Razor实现
    大话数据结构-排序
    hdu 1498
    3.7 检测两个表中是否有相同的数据
  • 原文地址:https://www.cnblogs.com/xuyh/p/4564510.html
Copyright © 2011-2022 走看看