gstreamer

gstreamer

gstreamer

  1. 概述
    GStreamer是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。
  2. 设计原则
    • 结构清晰,功能强大
    • 面向对象的编程思想
    • 灵活的可扩展功能
    • 高性能
    • 核心库与插件分离
  3. gstreamer 架构


    gstreamer.png

    核心:与媒体无关

glib 交叉编译

export CC=arm-hisiv400-linux-gcc
  1. zlib 交叉编译
         cd  zlib-1.2.11
        ./configure --prefix=./output  --enable-shared
        make 
        make install 
  1. libffi 交叉编译
    cd libffi-3.2
    ./configure --prefix=./output --host=arm-hisiv400-linux
    make 
    make install 
  1. gettext 交叉编译
   ./configure --prefix=./output  --enable-shared --host=arm-hisiv400-linux
    make 
    make install 
  1. glib 交叉编译
cd glib-2.56.0
./configure --host=arm-hisiv400-linux --prefix=./output  \
            PKG_CONFIG_PATH=./output/lib/pkgconfig \
            glib_cv_stack_grows=no \
            glib_cv_uscore=no \
            ac_cv_func_posix_getpwuid_r=yes \
            ac_cv_func_posix_getgrgid_r=yes \
            --with-pcre=internal  \
            --enable-libmount=no  \
make
make install

gstreamer 交叉编译

  1. orc 交叉编译
      cd  orc-0.4.28
      ./configure --prefix=./output  --host=arm-hisiv400-linux
      make 
      make install 
  1. x264 交叉编译
     cd  x264
      ./configure --prefix=./output  --enable-shared --host=arm-hisiv400-linux --disable-asm \
                --cross-prefix=arm-hisiv400-linux-  
      make 
      make install 
  1. libxml2 交叉编译
    cd  libxml2-2.9.8   
    ./configure --prefix=./output --enable-shared \
                --host=arm-hisiv400-linux\
                CROSS_COMPILE=arm-hisiv400-linux- \
                --with-python=no
    make && make install 
  1. openssl 交叉编译
  cd  openssl-1.1.0h
  ./config --prefix=./output shared no-asm 
  sed -i "s/-m64//g" ./Makefile
  make && make install 
  1. gstreamer-1.14.0 交叉编译
    cd  gstreamer-1.14.0
    ./configure --prefix=./output --host=arm-hisiv400-linux\
            LDFLAGS="-Wl,--unresolved-symbols=ignore-in-shared-libs" \
            PKG_CONFIG_PATH=./output/lib/pkgconfig \
            GIO_LIBS="-L./output/lib -lgio-2.0 -lgobject-2.0 -lglib-2.0" \
            GLIB_LIBS="-L./output/lib -lglib-2.0  -lgobject-2.0 -lgthread-2.0 -lgmodule-2.0" \
            --disable-loadsave \
            --disable-gtk-doc \
            ac_cv_func_register_printf_function=no \
            --disable-tests \
            --disable-valgrind \
     make && make install 
  1. gst-plugins-base-1.14.0 交叉编译
      cd   gst-plugins-base-1.14.0 
     ./configure --prefix=./output --host=arm-hisiv400-linux 
      make && make install 
  1. gst-plugins-good-1.14.0 交叉编译
      cd  gst-plugins-good-1.14.0
     ./configure --prefix=./output --host=arm-hisiv400-linux 
      make && make install 
  1. gst-plugins-bad-1.14.0 交叉编译
      cd gst-plugins-bad-1.14.0
     ./configure --prefix=./output --host=arm-hisiv400-linux --disable-dvb
      make && make install 
  1. gst-plugins-ugly-1.14.0 交叉编译
      cd gst-plugins-ugly-1.14.0
     ./configure --prefix=./output --host=arm-hisiv400-linux  \
               --with-x264-libraries=./output/lib/libx264.so
      make && make install 
  1. gst-rtsp-server-1.14.0 交叉编译
      cd  gst-rtsp-server-1.14.0
     ./configure --prefix=./output --host=arm-hisiv400-linux 
      make && make install 

gstreamer 基本概念

  1. 元件(element)
    Elements 是组成管道的最基本的构件。
    可以将若干个元件(Elements)连接在一起,从而创建一个管道(pipeline)来完成一个特殊的任务,例如,媒体播放或者录像。
    Elements 根据功能分类:
  • Source elements
  • Sink elements
  • Filter elements
    如下图:


    element.png

    通过一个fakesrc工厂对象来创建一个名叫source的元件:

  GstElement *element = gst_element_factory_make ("fakesrc", "source");
  1. 箱柜(bin) 和管道(Pipeline)
    箱柜(Bins)是一个可以装载元件(element)的容器。管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element)。
    如下图:


    bin.png
#include <gst/gst.h>
int  main (int   argc,
      char *argv[])
{
  GstElement *pipeline;
  GstElement *source, *filter, *sink;
  /* init */
  gst_init (&argc, &argv);
  /* create pipeline */
  pipeline = gst_pipeline_new ("my-pipeline");
  /* create elements */
  source = gst_element_factory_make ("fakesrc", "source");
  filter = gst_element_factory_make ("identity", "filter");
  sink = gst_element_factory_make ("fakesink", "sink");

  /* must add elements to pipeline before linking them */
  gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);
  /* link */
  if (!gst_element_link_many (source, filter, sink, NULL)) {
    g_warning ("Failed to link elements!");
  }
[..]
}
  1. 衬垫(Pad)
    衬垫(Pads)相当于一个元件的接口,各个元件(element)通过这个接口进行连接,这样数据流就可以在这些元件中进行传输。

Pads 分类:
永久型(always)
随机型(sometimes)
请求型 (on request)
如下:filsrc 衬垫类型为永久型

  ./gst-inspect-1.0 filsrc 
  Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:
      ANY
  1. 功能(Cap)
    Caps描述了能够通过衬垫或当前通过衬垫的数据流格式。
    通过 gst-inspect-1.0 命令可以查看元件所支持的媒体类型。
    如:
./gst-inspect-1.0 rtph264depay

Pad Templates:
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      application/x-rtp
                  media: video
             clock-rate: 90000
          encoding-name: H264

  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-h264
          stream-format: avc
              alignment: au
      video/x-h264
          stream-format: byte-stream
              alignment: { nal, au }
  1. 总线(Bus)
    每一个管道默认包含一个总线,应用程序不需要再创建总线。应用程序在总线上设置一个消息处理器。当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务。
gint main (gint   argc,
      gchar *argv[])
{
  GstElement *pipeline;
  GstBus *bus;

  /* init */
  gst_init (&argc, &argv);

  /* create pipeline, add handler */
  pipeline = gst_pipeline_new ("my_pipeline");

  /* adds a watch for new message on our pipeline's message bus to
   * the default GLib main context, which is the main context that our
   * GLib main loop is attached to below
   */
  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_watch (bus, my_bus_callback, NULL);
  gst_object_unref (bus);

[..]
  1. 缓冲区(Buffer)
    缓冲区包含了创建的管道里的数据流。通常一个源元件会创建一个新的缓冲区,同时元件还将会把缓冲区的数据传递给下一个元件。当使用GStreamer底层构造来创建一个媒体管道的时候,不需要自己来处理缓冲区,元件将会自动处理这些缓冲区。
    一个缓冲区主要由以下一个组成:
  • 指向某块内存的指针
  • 内存的大小
  • 缓冲区的时间戳
  • 一个引用计数,指出了缓冲区所使用的元件数。没有元件可引用的时候,这个引用将用于销毁缓冲区
  1. 事件(Events)
    事件包括管道里的控制信息,如寻找信息和流的终止信号。

gstreamer 基本命令

播放本地文件:

gst-launch-1.0 playbin uri=file:/home/duxj/testvideo/sintel.ts  

播放同时录制视频

gst-launch-1.0 rtspsrc location =rtsp://127.0.0.1:8554/test ! rtph264depay ! mpegtsmux ! tee name=t t. ! queue ! filesink location=bla.ts t. ! queue ! decodebin ! autovideosink

gstreamer 实现播放器

#include <gst/gst.h>
int main(int argc, char *argv[]) 
{
  GstElement *pipeline;
  GstBus *bus;
  GstMessage *msg;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Build the pipeline */
  pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);

  /* Start playing */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* Wait until error or EOS */
  bus = gst_element_get_bus (pipeline);
  msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

  /* Free resources */
  if (msg != NULL)
    gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

插件编写

  • 从模板生成gstreamer插件
    获取插件模板:
  git clone git://anongit.freedesktop.org/gstreamer/gst-template.git
  cd gst-template/gst-plugin/src

通过make_element 生成 插件文件:

 ../tools/make_element ExampleFilter
 生成 gstexamplefilter.c gstexamplefilter.h

修改src/Makefile.am

vi Makefile.am
plugin_LTLIBRARIES = libgstexamplefilter.la
libgstexamplefilter_la_SOURCES = gstexamplefilter.c
libgstexamplefilter_la_CFLAGS = $(GST_CFLAGS)
libgstexamplefilter_la_LIBADD = $(GST_LIBS)
libgstexamplefilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstexamplefilter_la_LIBTOOLFLAGS = --tag=disable-static
noinst_HEADERS = gstexamplefilter.h

编译

./autogen.sh
CC=arm-hisiv400-linux-gcc
./configure --prefix=./output --host=arm-hisiv400-linux \
PKG_CONFIG_PATH=./output/lib/pkgconfig \
make
make install

将编译好的libgstexamplefilter.la libgstexamplefilter.so 复制到指定的运行目录下。
测试插件:

  ./gst-inspect-1.0 examplefilter
  • 参考 svn 的已写的插件编写新插件
    从 svn 上下载 /nvr/development/examples/gst_plugin_demo 工程,复制工程修改ProjectMetadata.cmake配置文件
    make
  • 插件基本函数
   注册插件
   gst_element_register 
   #类似于C++里面的构造函数,该初始化过程只进行一次
   gst_demo_class_init    
   # 实例的初始化, 结构体赋初值
   gst_demo_init
   # 设置属性函数
   gst_demo_set_property
   # 获取属性值
   gst_demo_get_property
   # pipeline 事件的处理
  gst_demo_sink_event
   # pipeline 数据的处理
  gst_demo_chain

NVR视频流的分发

nvr.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容