openwrt gstreamer实例学习笔记(一.初始化gstreamer)

GStreamer 是一个非常强大而且通用的流媒体应用程序框架。 GStreamer所具备的很多优点来源于其框架的模块化: GStreamer能够无缝的合并新的插件。 但是, 由于追求模块化和高效率, 使得GStreamer在整个框架上变的复杂, 也同时因为复杂度的提高, 使得开发一个新的应用程序显得不是那么的简单。

由于工作需求,因此笔者开启了gstreamer构建音频播放器之路!

首先openwrt下面make menuconfig 要选择gstreamer必要的插件库,由于openwrt下面已经很好地支持了gstreamer的大部分插件,因此使得openwrt下面基于gstreamer开发变得轻松一点。

第一步:写程序

当我们准备写一个GStreamer应用程序时,你仅需要通过包含头文件gst/gst.h 来访问库函数。除此之外,不要忘记初始化GStreamer库。

#include <stdio.h>
#include <glib.h>
#include <gst/gst.h>

int main (int   argc,   char *argv[])
{
  const gchar *nano_str;
  guint major, minor, micro, nano;

gst_init (&argc, &argv);

gst_version (&major, &minor, &micro, &nano);

if (nano == 1)
    nano_str = "(CVS)";
  else if (nano == 2)
    nano_str = "(Prerelease)";
  else
    nano_str = "";

printf("This program is linked against GStreamer %d.%d.%d %s\n", major, minor, micro, nano_str);

return 0;
}

以上程序是初始gstreamer,并打印gstreamer的版本号!

第二歩:

编写openwrt 下面makefile

include $(TOPDIR)/rules.mk

#LIB_GS=/home/xuyonghong/share/ffmpeg/car_radio_firmware/trunk/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib
PKG_NAME:=gst-test
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/gst-test
    SECTION:=multimedia
    CATEGORY:=Multimedia
    DEPENDS:=+gstreamer1* +glib2    +libpthread
    TITLE:=gstreamer test demo
endef

define Package/gst-test/description
    If you can‘t figure out what this program does, you‘re probably
    brain-dead and need immediate medical attention.
endef

TARGET_CPPFLAGS:= \
    -I$(STAGING_DIR)/usr/include/gstreamer-1.0 \
    $(TARGET_CPPFLAGS)

TARGET_CPPFLAGS:= \
    -I$(STAGING_DIR)/usr/include/glib-2.0 \
    $(TARGET_CPPFLAGS)

MAKE_FLAGS += \
    CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(PKG_CONFIGS) -ffunction-sections -fdata-sections" \
    LDFLAGS="$(TARGET_LDFLAGS) $(PKG_CONFIGS) -Wl,--gc-sections" \

PKG_CONFIGS:= \
        `pkg-config --cflags --libs glib-2.0 gthread-2.0  gstreamer-1.0`

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/gst-test/install
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/gst-test $(1)/bin/

#   
#$(CP) $(LIB_GS)/libgstreamer*  $(1)/bin

endef

$(eval $(call BuildPackage,gst-test))

第三步:make编译

第四步;测试之

[email protected]:/#
[email protected]:/# chmod +x gst-test
[email protected]:/# ./gst-test
This program is linked against GStreamer 1.2.3
[email protected]:/#
[email protected]:/#

时间: 2024-07-29 23:04:26

openwrt gstreamer实例学习笔记(一.初始化gstreamer)的相关文章

openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))

1)概述 管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号.所有这些数据流在运行的时候自动的流过管道. 2) 缓冲区(Buffers) 缓冲区包含了你创建的管道里的数据流.通常一个source element会创建一个新的缓冲区,同时element还将会把缓冲区的数据传递给下一个element.当使用GStreamer底层构造来创建一个媒体管道的时候,你不需要自己来处理缓冲区,element将会为你处理这些缓冲区. 一个缓冲区主要由以下一个

openwrt gstreamer实例学习笔记(六. gstreamer Pads及其功能)

一:概述 如我们在Elements一章中看到的那样,Pads是element对外的接口.数据流从一个element的source pad到另一个element的sink pad.pads的功能(capabilities)决定了一个element所能处理的媒体类型. 一个pad的类型由2个特性决定:它的数据导向(direction)以及它的时效性(availability).正如我们先前提到 的,Gstreamer定义了2种pads的数据导向:source pad以及sink pad.pads的数

openwrt gstreamer实例学习笔记(四. gstreamer Bins)

1)概述 Bins是一种容器element.你可以往Bins中添加element.由于Bins本身也是一种element,所以你可以像普通element一样 操作Bins.因此,先前关element的内容同样可以应用于Bins. Bins允许你将一组有链接的element组合成一个大的逻辑element.你不再需要对单个element进行操作,而仅仅操作Bins.当你在构建一个复杂的管道时,你会发现Bins的巨大优势,因为它允许你将复杂的管道分解成一些小块. Bins同样可以对包含在其中的ele

openwrt gstreamer实例学习笔记(二.gstreamer 的 Element)

对程序员来说,GStreamer 中最重要的一个概念就是 GstElement 对象.该对象是构建一个媒体管道的基本块.所有上层(high-level)部件都源自GstElement对象.任何一个解码器编码器.分离器.视频/音频输出部件实际上都是一个 GstElement对象. 对程序员来说,element就像一个黑盒子.你element的一端输入数据,element对数据进行一些处理,然后数据从element的另一端输出.拿一个解码element来说,你输入一 些有特定编码的数据,elemen

openwrt gstreamer实例学习笔记(五. gstreamer BUS)

1)概述 BUS(总线) 是一个简单的系统,它采用自己的线程机制将一个管道线程的消息分发到一个应用程序当中.总线的优势是:当使用GStreamer的时候,应用程序不需要线程识别,即便GStreamer已经被加载了多个线程. 每一个管道默认包含一个总线,所以应用程序不需要再创建总线.应用程序只需要在总线上设置一个类似于对象的信号处理器的消息处理器.当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务. 2)如何使用一个总线(Bus) 使

openwrt gstreamer实例学习笔记(三.深入了解gstreamer 的 Element)

在前面的部分,我们简要介绍过 GstElementFactory 可以用来创建一个element的实例,但是GstElementFactory不仅仅只能做这件事,GstElementFactory作为在 GStreamer 注册系统中的一个基本类型,它可以描述所有的插件(plugins)以及由GStreamer创建的element.这意味着GstElementFactory可以应用于一些自动element实例, 像自动插件(autopluggers); 或者创建一个可用element列表,像管道

coco2d-x 3.0游戏实例学习笔记 《跑酷》 二 游戏界面--全新的3.0物理世界

从这里开始,就和之前前辈的有很多不同啦. 在MainScene中,开始按钮中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,而且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是很简单的,因为它都帮我们封装好了. 那么这一步,我们在PlayScene 中主要完成以下功能: 1.物理世界创建 2.创建一个地面的物理刚体 相关知识个人见解: 所谓的创建物理世界,个人觉得是一个抽象的东东,作为新手,开始并不能理解,开始你可以就

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角添加动作

这一步当中,我们主要完成以下功能: 1.地图的无限滚动---让主角看起来真的是在跑动 2.给主角添加Jump跳跃和crouch下蹲动作 那么首先来让背景滚动起来,在PlayScene.h中添加: //初始化背景 void initBG(); //用update函数让地图滚动 virtual void update(float dt); //背景精灵 cocos2d::Sprite* bgSprite1; cocos2d::Sprite* bgSprite2; cocos2d::Sprite* g

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同时带着刚体

在这一步,我们主要是把主角加入到游戏场景中来,并且让它跑动,这里的跑动,实际上也就是执行一组动画,让其看起来像是在跑动,而且相对屏幕的位置也不会改变 我们会定义一个主角类:Runner,而这一步就要用到 帧动画 的创建和使用等知识点. 对于Runner,我的设计思路如下: 1.主角有一个动作集合,包括跑动,跳起来,以及蹲下.那么就有不同的帧动画,那么这里借鉴到 晓风残月前辈的方法,将帧动画打包命名,之后根据动作名来执行动作 2.主角需要绑定刚体,并且在不同的动作下的刚体大小不同 3.我们给主角设