GStreamer SDK 1.0 Build Via Cerbero

本文編寫時(shí)基于GStreamer v1.11.0版治唤,文中提及所有目錄結(jié)構(gòu)、文件茉帅、模塊等信息也均以v1.11.0為標(biāo)準(zhǔn)。后續(xù)如GStreamer官方SDK有做較大變動(dòng)锭弊,請(qǐng)自行適配堪澎。

1. GStreamer Introduction

GStreamer是一個(gè)基于流水線的多媒體框架,其內(nèi)部基于GObject味滞,以C語言寫成(參見Wikipedia)樱蛤。GStreamer采用基于plugin和pipeline的體系機(jī)構(gòu),框架中所有的功能模塊都是可插拔的plugins剑鞍,可以很方便地安裝到任意pipeline上昨凡。

1.1 GStreamer 環(huán)境

通常,在運(yùn)行基于GStreamer開發(fā)的程序前蚁署,需要配置開發(fā)平臺(tái)所需環(huán)境便脊,建議直接下載已編譯的安裝包,實(shí)在有特定需求(如裁剪光戈、特定庫支持)時(shí)哪痰,再考慮手動(dòng)編譯SDK遂赠。

GStreamer最新版本(1.11.0)中支持的系統(tǒng)具體如下:

  • Linux
    大部分Linux發(fā)行版均已提供GStreamer package,但部分發(fā)行版由于法律原因等會(huì)對(duì)GStreamer plugins進(jìn)一步切割晌杰,因此可能不會(huì)包含gst-plugins-bad跷睦、gst-plugins-ugly及gst-libav pacakges

  • OpenBSD
    不同架構(gòu)的package都有支持

  • Windows
    提供相應(yīng)版本MSI安裝器,SDK共提供三種文件肋演,分別為:

    • Runtime:運(yùn)行GStreamer程序必需的文件抑诸,可能會(huì)隨程序一同發(fā)布
    • Development:開發(fā)GStreamer程序額外所需的文件
    • Merge Modules:為GStreamer程序部署SDK所需的額外文件
  • Mac OS X
    提供相應(yīng)的框架

  • Android
    提供可被集成入Android NDK的GStreamer Binaries

  • IOS
    提供可被集成入XCode的GStreamer Binaries

  • Source

1.2 GStreamer內(nèi)部模塊

依據(jù)plugins功能及實(shí)現(xiàn)算法性能的不同,GStreamer將其分為如下模塊:

2. Cerbero編譯系統(tǒng)

Cerbero是一個(gè)服務(wù)于開源項(xiàng)目的多平臺(tái)編譯系統(tǒng)爹殊,它為不同體系哼鬓、發(fā)行版的平臺(tái)編譯并創(chuàng)建本地化package。

2.1 Cerbero基礎(chǔ)環(huán)境搭建

雖然Cerbero已經(jīng)為各個(gè)平臺(tái)提供了bootstrap(啟動(dòng)引導(dǎo)項(xiàng))边灭,但仍需要一些基礎(chǔ)環(huán)境來支持bootstrap异希。

由于Cerbero使用Python2.x(>= 2.6)開發(fā)編譯腳本,因此不論是什么平臺(tái)都必須安裝Python绒瘦,本教程中安裝版本為v2.7称簿。除此之外,各平臺(tái)所需依賴項(xiàng)各有不同惰帽。具體如下:

2.1.1 OSX

在OSX上你需要安裝如下軟件:

Note:
此次實(shí)際編譯并未涉及OSX平臺(tái)憨降,因此IOS及OSX相關(guān)部分編譯并未測(cè)試,如需編譯SDK该酗,可參照教程中通用部分或根據(jù)github自行完成授药。

2.1.2 Linux(以Ubuntu為例)

測(cè)試環(huán)境為Ubuntu 14.04,其他版本或發(fā)行版僅供參考呜魄。需確認(rèn)如下軟件是否安裝:

  • Git
    如當(dāng)前環(huán)境中沒有g(shù)it工具悔叽,請(qǐng)先手動(dòng)安裝完成爵嗅。


    安裝完成后,配置git信息趟庄。

      git config --global user.email "xxxx@xxx.com"
      git config --global user.name "xxxx"
    
  • Python 2.x
    確認(rèn)所使用的發(fā)行版中python版本>= 2.6且已添加python的argparse模塊(Python2.7已默認(rèn)支持)伪很。


如出現(xiàn)正常安裝步驟報(bào)錯(cuò)時(shí)戚啥,請(qǐng)嘗試先手動(dòng)sudo apt-get update && upgrade完善系統(tǒng)后重試。

2.1.3 Windows

Windows中環(huán)境配置較為復(fù)雜锉试,編譯SDK通常也相對(duì)耗時(shí)較長猫十,但由于其中Directshow Plugins需使用到Directshow base classes,仍依賴Microsoft編譯器和SDK完成編譯,所以也無法通過Linux系統(tǒng)完美跨平臺(tái)編譯炫彩。

同時(shí)Cerbero默認(rèn)使用Makefile進(jìn)行所有項(xiàng)目的編譯匾七,類似Unix,因此如需在Windows中正常編譯江兢,必須首先配置Unix編譯環(huán)境昨忆。

具體需安裝項(xiàng)如下:

  • Python2.7 : Download
    切記只能安裝2.7版本,3.x版本并不支持

  • CMake : Download
    下載的x86版本可同樣支持x64版本編譯杉允,安裝時(shí)勾選添加至環(huán)境變量邑贴。

  • Git : Download
    安裝過程中選擇“Checkout as-is, commit as-is"選項(xiàng)念恍,其他保持默認(rèn)


    安裝完成后垛耳,配置git信息口柳。

      git config --global user.email "xxxx@xxx.com"
    git config --global user.name "xxxx"
    
  • Msys/MinGW : Download


    勾選"Basic Setup"所有項(xiàng)進(jìn)行安裝捻勉。

    此處選擇所有項(xiàng)為便捷做法,如有興趣揍堰,可嘗試去除如gcc-ada等項(xiàng)钠惩,以最小化安裝

  • Wix 3.5 :Download
    Windows MSI打包工具秕狰,默認(rèn)安裝即可

  • Microsoft SDK 7.1 : Download
    安裝Win7.1 SDK GRMSDKX_EN_DVD.7z(帶X)鸣哀,只有該包中存在amd64.msi我衬,否則安裝時(shí)因找不到文件報(bào)錯(cuò)而安裝失敗。

    如安裝過程中報(bào)錯(cuò)不能安裝依賴于 .NET Framework 4的組件井仰,則請(qǐng)下載.NET 4并安裝后重試糕档。

  • Windows Driver Kit 7.1.0 : Download
    安裝GRMWDK_EN_7600_1.iso

安裝完上述項(xiàng)后,由于Cerbero必須在MinGW shell中運(yùn)行尿背,因此必須為shell配置部分程序環(huán)境變量:

  • windows x86

      echo 'export PATH="$PATH:/c/Python27:/c/Program Files(x86)/Git/bin:/c/MinGW/bin/
    
  • windows x64

      echo 'export PATH="$PATH:/c/Python27:/c/Program Files/Git/bin:/c/MinGW/bin/"' > ~/.profile
    

Note:
如生成的“.profile”文件與shell不位于同一路徑下捶惜,請(qǐng)手動(dòng)拷貝至同一路徑下。并在shell中運(yùn)行python鹤竭、git臀稚、cmake命令確認(rèn)已生效三痰。

至此稚机,Cerbero基礎(chǔ)環(huán)境已搭建完成获搏。

2.2 Cerbero基礎(chǔ)編譯過程

此處以Windows平臺(tái)編譯為示例常熙,Linux可參照進(jìn)行症概,步驟一致,唯一區(qū)別為打包后文件格式不同诅蝶。

編譯之前调炬,需在shell中運(yùn)行如下命令行進(jìn)行版本庫克络峙荨:

git clone git://anongit.freedesktop.org/gstreamer/sdk/cerbero

clone成功后棘钞,目錄結(jié)構(gòu)(v1.11.0)如下圖所示:

此處最好將cerbero完整文件夾內(nèi)容拷貝值/home/usrxxx/下宜猜,以避免后面compile過程中出現(xiàn)完整路徑過長而導(dǎo)致失敗問題姨拥。具體可參造4.5小節(jié)內(nèi)容。

可以看到文件夾上有勾選標(biāo)號(hào)提示柴罐,這是ToriseGit的功能憨奸,Windows下平臺(tái)可以更加便捷直觀地查看git庫文件膀藐,在裁剪SDK時(shí)有較大幫助额各,建議安裝。當(dāng)然麻诀,不安裝也不影響后續(xù)操作蝇闭。

可以看到根目錄下存在 setup.py文件呻引,而實(shí)際上cerbero編譯工具使用前并不需要安裝逻悠,只需要直接運(yùn)行cerbero-uninstalled腳本及選項(xiàng)(可選)即可韭脊。

2.2.1 cerbero-uninstalled常用選項(xiàng)

編譯之前沪羔,先簡(jiǎn)單了解下cerbero-uninstalled的常用選項(xiàng):

./cerbero-uninstalled --help

其輸出內(nèi)容為:

usage: cerbero-uninstalled [-h] [-c CONFIG]
                           {add-recipe,rdeps,tag,genxcconfig,genlibfiles,check,list-packages,show-config,add-package,build,genvsprops,shell,run,cleanone,packageinfo,bundle-source,buildone,wipe,debug-packages,package,bootstrap,list,checkpackage,deps,gensdkshell,fetch-package,fetch}
                           ...

Build and package a set of modules to distribute them in a SDK

positional arguments:
  {add-recipe,rdeps,tag,genxcconfig,genlibfiles,check,list-packages,show-config,add-package,build,genvsprops,shell,run,cleanone,packageinfo,bundle-source,buildone,wipe,debug-packages,package,bootstrap,list,checkpackage,deps,gensdkshell,fetch-package,fetch}
                        sub-command help
    add-recipe          Adds a new recipe
    rdeps               List the reverse dependencies of a recipe
    tag                 Tag a git recipe or all git recipes using their
                        sdk-$version branch
    genxcconfig         Generate XCode config files to use the SDK from VS
    genlibfiles         Generate MSVC compatible library files (.lib)
    check               Run checks on a given recipe
    list-packages       List all the available packages
    show-config         Show configuration settings
    add-package         Adds a new package
    build               Build a recipe
    genvsprops          Generate Visual Studio property sheets to use the SDK
                        from VS
    shell               Starts a shell with the build environment
    run                 Runs a command in the cerbero shell
    cleanone            Clean a single recipe without its dependencies
    packageinfo         Print information about this package
    bundle-source       Bundle Source code of recipes and Cerbero
    buildone            Build or rebuild a single recipe without its
                        dependencies
    wipe                Wipes everything to restore the build system
    debug-packages      Outputs debug information about package, like
                        duplicates files or files that do not belong to any
                        package
    package             Creates a distribution package
    bootstrap           Bootstrap the build system installing all the
                        dependencies
    list                List all the available recipes
    checkpackage        Run checks on a given package
    deps                List the dependencies of a recipe
    gensdkshell         Create a script with the shell environment for the SDK
    fetch-package       Fetch the recipes sources from a package
    fetch               Fetch the recipes sources

optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG, --config CONFIG
                        Configuration file used for the build

上面列出的命令實(shí)際上都定義于./cerbero/commands/路徑下琅豆,以相應(yīng)名稱的python腳本文件形式存在趋距,如:

雖然cerbero-uninstalled支持很多命令,但編譯相關(guān)的并不多摘盆,這里僅介紹如下常用選項(xiàng):

  • [-c CONFIG]
    cerbero-unistalled編譯時(shí)孩擂,如未使用該選項(xiàng),則cerbero-unistalled使用默認(rèn)配置(等價(jià)于變量)進(jìn)行編譯狈邑;如指定cbc文件米苹,則使用指定配置完成編譯蘸嘶。

    可選擇的CONFIG文件位于/config路徑下训唱,如下圖所示:

  • list
    列出所有可選的recipes况增;recipe用于指定某個(gè)模塊的源训挡、依賴項(xiàng)舍哄、編譯步驟、產(chǎn)出庫(動(dòng)態(tài)弥锄、靜態(tài))等編譯過程相關(guān)信息籽暇。

    可選擇的recipe文件位于/recipes目錄下戒悠,由于數(shù)量較多舟山,截取部分如下圖所示:

  • list-packages
    列出所有可打包的packages;打包實(shí)質(zhì)上是將編譯過程中各模塊相關(guān)文件(頭文件突琳、庫等)符相,按照對(duì)應(yīng)的package文件內(nèi)容取出至指定路徑啊终,壓縮并打包為對(duì)應(yīng)平臺(tái)文件蓝牲。

    可選擇的package文件位于/packages路徑下,如下圖所示:

  • bootstrap
    下載并安裝當(dāng)前環(huán)境下編譯時(shí)所需工具

  • build
    編譯某個(gè)recipe散怖,包括其依賴項(xiàng)

  • buildone
    編譯某個(gè)recipe镇眷,不包括其依賴項(xiàng)

  • cleanone
    清理某個(gè)recipe

  • package
    打包某個(gè)package欠动,遞歸遍歷所有依賴項(xiàng)具伍。

  • wipe
    清理之前build過程中產(chǎn)生的所有文件人芽,慎用

2.2.2 cerbero-uninstalled基礎(chǔ)編譯

本節(jié)內(nèi)容閱讀默認(rèn)前面章節(jié)所述環(huán)境均已安裝配置完善萤厅,繼續(xù)閱讀前靴迫,請(qǐng)確認(rèn)均已完備玉锌。

選擇只簡(jiǎn)單指定.cbc文件,而不修改配置文件(package禀倔、recipe、commands等)直接編譯剃袍,可能存在如下問題:

  • 模塊依賴項(xiàng)多,打包操作內(nèi)部遍歷后整體所需編譯模塊較多憔维,造成編譯耗時(shí)長(虛擬機(jī)測(cè)試2天左右)
  • 部分特定模塊打包時(shí)并未勾選业扒,造成安裝編譯后SDK無法提供相應(yīng)環(huán)境支持

如可接受上述問題,則可按照如下步驟進(jìn)行基礎(chǔ)編譯:

./cerbero-uninstalled -c config/xxx.cbc bootstrap
./cerbero-uninstalled -c config/xxx.cbc package gstreamer-1.0

編譯成功后蹭沛,將生成對(duì)應(yīng)平臺(tái)文件摊灭,如windows中msi帚呼,linux下tar.bz2文件等。

Note:
編譯過程中如出現(xiàn)錯(cuò)誤煤杀,可先跳轉(zhuǎn)至章節(jié) “4. 問題-解決方法匯總”查看是否已有記錄沈自。

3. Cerbero配置

Cerbero內(nèi)部使用了典型的oven-cookbook-recipe結(jié)構(gòu)枯途,結(jié)合其他功能命令柔袁、config等模塊構(gòu)建整個(gè)編譯系統(tǒng)捶索。

Projects通過recipes文件(.recipe)來定義灰瞻,文件中描述了需要編譯的項(xiàng)目信息,如name, version, license, sources和編譯方法璃弄。同時(shí)构回,還提供了一些用于后續(xù)打包的文件纤掸。

Packages通過packages文件(.package)來定義借跪,文件中描述了包信息,如name, version, license, maintainer和其他用于打包的內(nèi)容歇由。一個(gè)包內(nèi)部包含了一系列recipes沦泌,安裝時(shí)將進(jìn)行展開京腥。

3.1 定制編譯步驟

如前所述公浪,projects通過recipe文件來定義欠气,build過程中會(huì)根據(jù)recipe內(nèi)容進(jìn)行編譯预柒。編譯步驟實(shí)際上分為六步,分別為:

  • Fetch
  • Extract
  • Configure
  • Compile
  • Install
  • Post_install

第一次編譯時(shí)憔古,必須Fetch相關(guān)源以進(jìn)行后續(xù)步驟鸿市,但通常在編譯成功后焰情,我們將不再希望所有模塊每次編譯時(shí)都自動(dòng)更新為最新版本(穩(wěn)定性不可控)内舟,此時(shí)可以將Fetch步驟去除,之后的build便會(huì)基于已有的源包進(jìn)行編譯充岛。

./cerbero/build/recipe.py

3.2 指定模塊編譯版本

編譯時(shí)裸准,可能會(huì)出現(xiàn)某個(gè)模塊的最新或特定版本存在bug赔硫,此時(shí)可通過指定模塊編譯版本來解決爪膊。

3.2.1 SourceType.GIT

以libffi為例推盛, 修改下圖中標(biāo)示處:


其中commit等可從已clone下來的git版本庫中獲取耘成,需為對(duì)應(yīng)版本commit id瘪菌。修改完成后师妙,確認(rèn)是否有其他相關(guān)內(nèi)容需一并修改默穴,此處需自行調(diào)整蓄诽。

clean后重新build仑氛,測(cè)試通過调衰。

3.2.2 SourceType.TARBALL

此處以faad2為例,修改下圖中標(biāo)示處:


修改version米酬、url地址赃额,url地址需訪問鏈接進(jìn)行手動(dòng)確認(rèn)跳芳,方法通常為去除末端版本字段飞盆,如faad2-2.7.tar.bz后訪問吓歇。其他獲取方法請(qǐng)自行研究票腰。

3.2.3 SourceType.SVN

此處以Tremor為例杏慰,修改如下圖標(biāo)示處:

3.3 GStreamer SDK 裁剪

./cerbero-unistalled -c config/xxx.cbc package gstreamer-1.0

鍵入該命令行缘滥,可開始gstreamer-1.0 SDKpackage動(dòng)作完域。

SDK實(shí)質(zhì)上是package所有recipe build后相關(guān)文件的產(chǎn)物凹耙,對(duì)應(yīng)編譯中參與的角色(總package肠仪、子package异旧、模塊),裁剪也分為如下三種:

3.3.1 總package裁剪-.package

gstreamer-1.0 的package文件位于路徑 ./packages/gstreamer-1.0/下拌屏。

首先整體瀏覽下該package文件內(nèi)容:

# -*- Mode: Python -*- vi:si:et:sw=4:sts=4:ts=4:syntax=python
class SDKPackage(package.SDKPackage):
    name = "gstreamer-1.0"
    shortdesc = "GStreamer 1.0"
    longdesc = "GStreamer 1.0"
    title = "GStreamer 1.0"
    url = "http://gstreamer.freedesktop.org"
    version = '1.9.0.1'
    sdk_version = '1.0'
    codename = 'Congo'
    license = License.LGPL
    uuid = 'b1b4b712-0d09-4a34-8117-8a69b6deecc2'
    vendor = "GStreamer Project"
    org = "org.freedesktop.gstreamer"
    ignore_package_prefix = True
    packages =[
        # (name, required, selected)
        ('gstreamer-1.0-core', True, True),
        #('gstreamer-1.0-system', False, True),
        #('gstreamer-1.0-playback', False, True),
        ('gstreamer-1.0-codecs', False, True),
        ('gstreamer-1.0-effects', False, True),
        #('gstreamer-1.0-net', False, True),
        #('gstreamer-1.0-visualizers', False, True),
        #('gstreamer-1.0-codecs-gpl', False, False),
        ('gstreamer-1.0-codecs-restricted', False, True),
        #('gstreamer-1.0-net-restricted', False, False),
        #('gstreamer-1.0-dvd', False, False),
        #('gstreamer-1.0-libav', False, False),
        #('gstreamer-1.0-encoding', False, False),
        ('gstreamer-1.0-capture', False, False),
        #('gstreamer-1.0-editing', False, False),
        ('gstreamer-1.0-devtools', False, False),
    ]
    platform_packages = {
        Platform.WINDOWS: [
            ('vsintegration-1.0', True, False),
            ('gstreamer-1.0-vs-templates', True, False),
        ],
    }

    install_dir = {
        Platform.WINDOWS: 'gstreamer',
        Platform.LINUX: '/opt/gstreamer-1.0/',
        Platform.DARWIN: '/Library/Frameworks/GStreamer.framework/',
        Platform.IOS: '/Library/Developer/GStreamer/iPhone.sdk'
    }

    root_env_var = 'GSTREAMER_1_0_ROOT_%(arch)s'
    wix_upgrade_code = {
        PackageType.DEVEL: {
            Architecture.X86 : 'c0c6126d-1f4a-4577-9598-e900f594fd06',
            Architecture.X86_64: '49c4a3aa-249f-453c-b82e-ecd05fac0693',
        },
        PackageType.RUNTIME: {
            Architecture.X86 : 'ebe0c791-d84e-4f7e-a4eb-18012a0e319d',
            Architecture.X86_64: 'c20a66dc-b249-4e6d-a68a-d0f836b2b3cf',
        },
    }
    osx_framework_library = ('GStreamer', 'lib/GStreamer')
    ios_framework_library = ('GStreamer', 'lib/GStreamer')
    
    def prepare(self):
        if self.config.target_platform in [Platform.ANDROID, Platform.IOS]:
        p = ['gstreamer-1.0-dvd']
        self.packages = [ x for x in self.packages if x[0] not in p]
        if self.config.target_platform == Platform.IOS:
            self.resources_postinstall = 'post_install_ios'
            #self.user_resources = ['share/gst-sdk/tutorials/xcode iOS']

從面的代碼中可以看出,裁剪過程中端圈,只需要關(guān)注gstreamer-1.0.package文件的如下字段:

  • packages
  • platform_packages
    對(duì)于不需要的子package可以直接使用#注釋掉以裁剪舱权。至于如何確認(rèn)是否需要宴倍,就要打開各子package甚至更底層的模塊recipe文件進(jìn)行確認(rèn)啊楚。

gstreamer-1.0-codecs.package為例浑彰,如下圖所示:


實(shí)際上,子package文件中也只是在deps涯保、files未荒、files_devel及志、platform_files這些字段中粗略列出相關(guān)模塊和庫速侈,如需最終確認(rèn)是否存在依賴或裁剪的空間,需進(jìn)一步打開所引入的模塊recipe文件冶共。

gst-plugins-good-1.0為例家卖,子package gstreamer-1.0-codecs.package中使用了其:plugins_codecs:plugins_codecs_devel兩項(xiàng)內(nèi)容庙楚,因此我們只關(guān)注gst-plugins-good-1.0.recipe文件中的這兩部分醋奠。

:plugins_codecs_devel字段不存在
此時(shí)可以清晰地看到窜司,子package中引入模塊字段處其實(shí)是包含了模塊中對(duì)應(yīng)字段所有l(wèi)ib塞祈。如無需將這些lib打包到SDK中议薪,則可在子package中移除對(duì)該字段的引入斯议。

3.3.2 子package裁剪-.package

上節(jié)的裁剪是總package級(jí)別的哼御,簡(jiǎn)單卻也也粗暴,只能以package為單位進(jìn)行裁剪看靠,控制精度很低挟炬。實(shí)際上谤祖,為提高精度泊脐,可以對(duì)子package做進(jìn)一步的裁剪容客。

gstreamer-1.0-codecs.package為例但两,可做如下裁剪(具體裁剪內(nèi)容根據(jù)需求決定):

3.3.3 模塊裁剪-.recipe

上節(jié)的子package裁剪雖然已經(jīng)比總package級(jí)別裁剪精密很多谨湘,但某些時(shí)候芥丧,我們可能只需要在最終SDK中包含某子package所引入模塊字段中的一個(gè)lib擅耽,其他lib都可以去除物遇,此時(shí)就需要進(jìn)行模塊級(jí)別的裁剪询兴。

gst-plugins-good-1.0.recipe為例诗舰,可做如下裁剪示例(其他字段可參照進(jìn)行):


4. 問題-解決方法匯總

4.1 Git信息未配置


解決辦法為根據(jù)提示配置信息:

git config --global user.email "xxxx@xxx.com"
git config --global user.name "xxxx"

4.2 Download certificate 驗(yàn)證


將參數(shù)check_cert=True修改為check_cert=False以關(guān)閉驗(yàn)證眶根。

4.3 Console Unicode


The most secure solution is this one: Go to your Registry key HKEY_CURRENT_USER\Software\Microsoft\Command Processor and add String value Autorun = chcp 65001.

4.4 GPLed program for Windows NT/...


msgfmt是gettext中的一部分汛闸,使用gettext0.19.5中發(fā)現(xiàn)該系列程序運(yùn)行會(huì)出錯(cuò),而在gettext0.18.2中并未出現(xiàn)該問題艺骂。目前采用的方法是恢復(fù)使用0.18.2系列msgfmt程序替代诸老。
Download

4.5 webrtc-audio-processing compile error


查找到根本問題為make過程中對(duì)應(yīng).o文件拼接后路徑過長

需cebero文件夾內(nèi)容直接放置在home/usrxx/目錄下以減少完整路徑長度。

4.6Ubuntu Android SDK libmad缺失

解決方法為去除對(duì)libmad項(xiàng)的依賴钳恕,需修改文件有:

  • ./recipes/gst-plugins-ugly-1.0.recipe


  • ./recipes/gst-plugins-ugly-1.0-static.recipe


  • ./packages/gstreamer-1.0-codec-restricted.package


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末别伏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌类茂,老刑警劉巖厚骗,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冲秽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夹姥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祈搜,“玉大人,你說我怎么就攤上這事』茸拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵阻课,是天一觀的道長。 經(jīng)常有香客問我适秩,道長,這世上最難降的妖魔是什么扬跋? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任倍奢,我火速辦了婚禮痪宰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘具练。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布君仆。 她就那樣靜靜地躺著,像睡著了一般牍鞠。 火紅的嫁衣襯著肌膚如雪吐句。 梳的紋絲不亂的頭發(fā)上攀芯,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天氧秘,我揣著相機(jī)與錄音阻星,去河邊找鬼。 笑死畦幢,一個(gè)胖子當(dāng)著我的面吹牛宇葱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼际看,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼僵朗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起云矫,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤陨界,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌木,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玄柠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娃闲,到底是詐尸還是另有隱情属拾,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布虏劲,位于F島的核電站,受9級(jí)特大地震影響应结,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一八堡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦百新、人聲如沸形庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至示惊,卻和暖如春丈探,著一層夾襖步出監(jiān)牢的瞬間辨宠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工霹期, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓邑蒋,卻偏偏與公主長得像覆糟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容