日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GStreamer 入门 - Hello,World

發布時間:2024/4/11 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GStreamer 入门 - Hello,World 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GStreamer 是一個用于構建媒體處理組件圖(也可以稱為 pipeline,或管道)的庫。它支持的應用非常廣泛,從簡單的 Ogg/Vorbis 播放,音頻/視頻流到復雜的音頻(混音)和視頻(非線性編輯)處理。

應用程序可以透明地利用編解碼和過濾器技術的進步。開發者可以通過編寫簡單的基于一個干凈、通用的接口的插件,來添加新的編解碼器和過濾器。

GStreamer 可以運行于所有主要的操作系統平臺,如 Linux,Android,Windows,Max OS X,iOS,以及大部分 BSDs,商業 Unixes,Solaris,和 Symbian。它已經被移植到了廣泛的操作系統,處理器,和編譯器平臺上。它可以運行于所有主要的硬件架構上,包括 x86,ARM,MIPS,SPARC 和 PowerPC,32 位以及 64 位上,以及小尾端或大尾端。

GStreamer 可以橋接到其它多媒體框架,以復用已有的組件(比如編解碼器)及使用平臺的輸入/輸出機制:

  • Linux/Unix:OpenMAX-IL (via gst-omx)
  • Windows::DirectShow
  • Mac OS X:QuickTime

GStreamer 核心框架

  • 基于圖的結構允許構建任何形態的管線
  • 基于 GLib 2.0 對象模型 的面向對象設計和繼承
  • 小于 500KB 的緊湊的核心庫,大約有 65k 行代碼
  • 構建多線程的管線是容易的且透明的
  • 對于插件和應用程序開發者,都有著干凈,簡單和穩定的 API
  • 極端輕量的數據處理意味著非常的高性能/低延遲。
  • 無論是對于核心架構,還是對于插件/應用程序的開發者,都有完整的調試系統
  • 具有時鐘來確保全局的流間同步(a/v 同步)
  • 具有服務質量 (qos) 來確保在高 CPU 負載下最優的可能質量。

智能插件架構

  • 動態加載 的插件提供元素和媒體類型,通過一個注冊表緩存按需加載,與 ld.so.cache 類似。
  • 元素接口 處理所有已知類型的 source,過濾器,和 sinks
  • 權能系統 允許使用 MIME 類型和媒體特有的屬性驗證元素的兼容性
  • 自動插拔使用權能系統自動完成復雜的路徑
  • 可以通過把管線轉儲為一個 .dot 文件來將它可視化,并基于此創建一副 PNG 圖像。
  • 資源友好型插件不會浪費內存

多媒體技術的廣泛覆蓋

GStreamers 的能力可以通過新插件來擴展。下面列出的功能只是使用 GStreamers 時可用的 GStreamer 自己的插件的粗糙的概覽,不包括任何第三方提供的。

  • 容器格式:asf,avi,3gp/mp4/mov,flv,mpeg-ps/ts,mkv/webm,mxf,ogg
  • 流:http,mms,rtsp
  • 編解碼器:FFmpeg,各種編解碼庫,第三方的編解碼包
  • 元數據:它們之間有著公共映射的本地容器格式
  • 視頻:各種顏色空間,支持漸進式和交錯視頻
  • 音頻:具有各種位深度的整型和浮點型音頻數據和多通道配置

大量的開發工具

  • gst-launch 命令行工具可用于快速的原型和測試,與 ecasound 類似
  • 大量 文檔,包括部分完成的?手冊 和 插件編寫者指南
  • 大量可選的測試程序和每個模塊中的示例代碼
  • 可通過 各種各樣的編程語言 訪問 GStreamer API

GStreamer 是一個靈活,快速和多平臺的多媒體框架。

GStreamer 是一個極端強大和功能豐富的用于創建流媒體應用的框架。GStreamer 框架的許多優點來自于它的模塊化:GStreamer 可以與新插件模塊無縫的協同工作。但由于模塊化和強大常常是以更大的復雜性為代價的,因而編寫新應用并不總是那么簡單。

GStreamer 編譯

GStreamer 是一個開源的多媒體框架,因而從源碼編譯也是非常方便的。GStreamer 提供了 Meson 和 Cerbero 等編譯方式。這里用 Meson 在 Ubuntu Linux 上編譯 GStreamer。

Meson 構建系統是一個快速的可移植的構建系統。它根據構建配置文件,生成可以被 ninja 執行的構建指令,GStreamer 項目使用它作為所有子項目的構建系統。可以使用如下命令安裝 meson 和 ninja:

sudo apt-get install meson ninja-build

在 2021 年 9 月,所有主要的 GStreamer 模塊都被合入了一個單獨的代碼倉庫,GStreamer 單獨的倉庫 位于主 GStreamer git 倉庫,這是如今 GStreamer 版本 1.19/1.20 及之后版本的所有 GStreamer 開發將發生的地方。

在這個單獨的倉庫合并位于分開的 git 倉庫中不同的 GStreamer 模塊之前,有一個稱為 gst-build 的分開的元構建工程用于下載并構建所有的子項目。如果你想要開發更老的穩定分支,比如 GStreamer 1.16 或 1.18,則你應該使用它。

如果你想要構建或開發即將到來的開發或穩定分支,你應該使用包含在單個代碼倉庫中的 GStreamer 模塊的 main 分支。gst-build 與單個代碼倉庫的工作方式基本相同,僅有的不同是它將下載各種 GStreamer 子模塊。

為了構建當前的 GStreamer 開發版本,它將在不遠的未來變為 1.20 穩定分支,需要先 clone GStreamer 倉庫:

git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git cd gstreamer

或者如果你具有這個倉庫的開發者權限的話:

git clone git@gitlab.freedesktop.org:gstreamer/gstreamer.git cd gstreamer

如果你想要構建穩定的 1.18 或 1.16 分支,則 clone gst-build:

git clone https://gitlab.freedesktop.org/gstreamer/gst-build.git cd gst-build

倉庫中包含了一些值得注意的腳本和目錄:

  • meson.build 是頂層的構建定義,它遞歸地配置所有依賴。它也定義了一些輔助命令,使你可以有一個未安裝的開發環境或簡單地更新 GStreamer 模塊的 git 倉庫。
  • subprojects/ 是包含了 GStreamer 模塊和一系列依賴的目錄。
  • 通過執行如下命令配置一個模塊(或在 gst-build 下一次配置多個):

    meson <build_directory>

    其中 build_directory 是所有的構建指令和輸出將放置的位置(這也被稱為 “輸出目錄” 構建)。如果目錄還沒有創建,則它將在此時創建。注意調用 meson 不需要任何命令參數其實是隱式地調用了 meson setup 命令(比如執行一個工程的初始化配置)。

    就 build_directory 的位置而言只有一個限制:它不能與源碼目錄(比如你下載你的模塊的目錄)相同。盡管它可以位于目錄的外面或下面/里面。

    一旦 meson 配置完成,你可以:

  • 進入特定的構建目錄并運行 ninja:
  • cd <build_directory> ninja
  • 或不要在每次想要執行 ninja 時都切換到構建目錄,你可以只指定構建目錄作為一個參數。這個選項的好處是你可以在任何地方執行(而不是切換到 ninja 目錄)
  • ninja -C </path/to/build_directory>

    這將構建那個模塊(和子工程如果構建 gst-build 或單個倉庫)的所有東西。

    注意:當你修改源文件時你不需要重新運行 meson,你只需要重新運行 ninja。如果構建/配置文件發生了改變,ninja 將自己判斷出來 meson 需要重新運行并將自動地運行它。

    Hello,World

    要獲得對于一個庫的第一印象,再也沒有比跑起來一個基于這個庫開發的,在屏幕上輸出 “Hello World” 的應用更好的方式了。但這里要處理的是多媒體框架,這里將用播放一個媒體文件來替代。

    上面的構建過程也將一并構建出 GStreamer 工程的測試和示例應用,其中包括 GStreamer 的 helloworld 示例應用。這個應用的代碼位于 gstreamer/tests/examples/helloworld,編譯之后生成的二進制可執行文件位于 <build_directory>/tests/examples/helloworld/helloworld。

    helloworld 示例應用的源碼如下:

    #include <gst/gst.h>static gboolean bus_call (GstBus * bus, GstMessage * msg, gpointer data) {GMainLoop *loop = (GMainLoop *) data;switch (GST_MESSAGE_TYPE (msg)) {case GST_MESSAGE_EOS:{g_print ("End-of-stream\n");g_main_loop_quit (loop);break;}case GST_MESSAGE_ERROR:{gchar *debug;GError *err;gst_message_parse_error (msg, &err, &debug);g_printerr ("Debugging info: %s\n", (debug) ? debug : "none");g_free (debug);g_print ("Error: %s\n", err->message);g_error_free (err);g_main_loop_quit (loop);break;}default:break;}return TRUE; }gint main (gint argc, gchar * argv[]) {GstElement *playbin;GMainLoop *loop;GstBus *bus;guint bus_watch_id;gchar *uri;gst_init (&argc, &argv);if (argc < 2) {g_print ("usage: %s <media file or uri>\n", argv[0]);return 1;}playbin = gst_element_factory_make ("playbin", NULL);if (!playbin) {g_print ("'playbin' gstreamer plugin missing\n");return 1;}/* take the commandline argument and ensure that it is a uri */if (gst_uri_is_valid (argv[1]))uri = g_strdup (argv[1]);elseuri = gst_filename_to_uri (argv[1], NULL);g_object_set (playbin, "uri", uri, NULL);g_free (uri);/* create an event loop and feed gstreamer bus messages to it */loop = g_main_loop_new (NULL, FALSE);bus = gst_element_get_bus (playbin);bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);gst_object_unref (bus);/* start play back and listed to events */gst_element_set_state (playbin, GST_STATE_PLAYING);g_main_loop_run (loop);/* cleanup */gst_element_set_state (playbin, GST_STATE_NULL);gst_object_unref (playbin);g_source_remove (bus_watch_id);g_main_loop_unref (loop);return 0; }

    這個應用接收一個媒體資源的 URI,并播放這個媒體資源。具體用法如下:

    $ build/tests/examples/helloworld/helloworld [URI]

    如播放一個 AAC 文件:

    $ build/tests/examples/helloworld/helloworld file:///home/hanpfei/aac.aac

    但用這個應用播放媒體文件時,報了插件找不到的錯,如:

    $ build/tests/examples/helloworld/helloworld file:///home/hanpfei/aac.aac 'playbin' gstreamer plugin missing

    helloworld 應用通過插件 “playbin” 來播放媒體文件。一般來說,插件的物理形式是一個動態鏈接庫,GStreamer 框架在初始化過程中會到特定的目錄下尋找插件。用戶可以通過環境變量 GST_PLUGIN_PATH 來為 GStreamer 指定插件的搜索路徑,或者以編程的方式,來讓 GStreamer 在特定的目錄中搜索插件,如:

    GstRegistry *registry;registry = gst_registry_get();gst_registry_scan_path(registry, "/usr/lib/x86_64-linux-gnu/gstreamer-1.0");

    上面看到的 “playbin” 插件,是 GStreamer 項目本身提供的一個基礎的插件,其代碼位于 gst-plugins-base 項目中,這個項目的具體位置為 https://github.com/GStreamer/gst-plugins-base。對于 Ubuntu Linux,也可以通過如下命令安裝編譯好的二進制:

    $ apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

    這個命令一次性安裝 GStreamer 的各種開發庫,其中 gstreamer1.0-plugins-base 里會包含 “playbin” 這個插件,這個插件一般會安裝在 /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstplayback.so。

    有了這些之后,helloworld 即可以正常運行起來。

    接下來就可以開始愉快地探索 GStreamer 的概念和操作了。

    總結

    以上是生活随笔為你收集整理的GStreamer 入门 - Hello,World的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。