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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo

發布時間:2025/5/22 编程问答 15 如意码农
生活随笔 收集整理的這篇文章主要介紹了 GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

??本篇開始gstreamer的編程學習,先搭建基礎的環境,跑通一個基礎的Demo對GStreamer編程有個初步的了解。

 

Demo

??

??

 

GStreamer

??GStreamer是一個靈活、快速、多平臺的多媒體框架,此框架非常強大和通用,用于創建流媒體應用程序。GStreamer框架的許多優點來自其模塊化,GStreamer可以無縫地整合新的插件模塊。但是,由于模塊化和強大的功能往往以更高的復雜性為代價,編寫新的應用程序并不總是那么容易。

結構

??教程分為幾個部分,圍繞一個共同的主題:

  • 基礎教程:描述理解GStreamer中其余教程所需的一般主題。
  • 播放教程:解釋使用GStreamer制作媒體播放應用程序所需知道的一切。
  • Android教程:涉及您需要知道的幾個Android特定主題的教程。
  • iOS教程:涉及您需要知道的幾個iOS特定主題的教程。
    ??基礎教程——理解其余教程所需的一般主題
 

搭建基礎開發環境

步驟一:安裝gstreamer1.0環境

sudo apt-get update
sudo 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
sudo apt-get install libglib2.0-0

步驟二:創建C工程

??使用QtCreator新建空的C工程:
??

步驟三:添加gstreamer開發環境

??然后查找gst.h頭文件:

sudo find / -name "gst.h"

??

??查找庫:

sudo find / -name "gstreamer-1.0*”

??

??查找依賴的頭文件:

sudo find / -name "glib.h"

??

sudo find / -name “glibconfig”

??

??將頭文件路徑和庫添加進pri:
??

# gstreamer頭文件和庫文件
INCLUDEPATH += /usr/include/gstreamer-1.0
LIBS += -lgstreamer-1.0
#LIBS += -lgobject-2.0 -lgstreamer-1.0 -lgstvideo-1.0 # glibc頭文件和庫文件
INCLUDEPATH += /usr/include/glib-2.0
INCLUDEPATH += /usr/lib/x86_64-linux-gnu/glib-2.0/include
LIBS += -lglib-2.0
 

第一個GStreamer程序

步驟一:初始化gst

??這是每個程序都要做的。
??

步驟二:定義管道

??

步驟三:設置管道狀態

??

步驟四:獲取管道的總線bus

??

步驟五:從總線bus中阻塞獲取指定的信息

??

??

步驟六:消息處理

??

步驟七:釋放資源

??

 

關鍵函數

gst_init()

??初始化所有內部結構,檢查哪些插件可用,執行GStreamer的任何命令行選項。

gst_parse_launch()

??在GStreamer中,通過手動組裝單個元素來構建管道,但是,當管道足夠簡單,并且不需要任何高級功能時,可以使用快捷方式:gst_parse_launch();
??此函數接受管道的文本表示并將其轉換為實際的管道,這非常方便。事實上,這個函數非常方便,有一個完全圍繞它構建的工具,請參閱GStreamer工具,了解gst-launch-1.0和gst-launch-1.0語法。
??本篇,我們正在構建一個由一個名為playbin的元素組成的管道。playbin是一個特殊的元素,它既是源又是匯,是一個完整的管道。在內部,它創建并連接了播放媒體所需的所有元素。

gst_element_set_state()

??每個GStreamer元素都有一個關聯的狀態,您或多或少可以將其視為常規DVD播放器中的播放/暫停按鈕。現在,只需說,除非將管道設置為播放狀態,否則播放將不會開始。
??gst_element_set_stat()將管道(我們唯一的元素,記住)設置為播放狀態,從而啟動播放。

gst_element_get_bus()

??檢索管道的總線。

gst_bus_timed_pop_filtered()

??gst_bus_timed_pop_filtered()將阻塞,直到您通過該總線收到指定錯誤或指定的事件,這些事件預定義了。

gst_message_unref(msg);

??清理消息。

gst_object_unref (bus);

??清理qobject類型,按照生成順序逆向的來unref釋放引用。

gst_element_set_state (pipeline, GST_STATE_NULL);

??設置管道狀態為空,資源都會被自動回收。

gst_object_unref (pipeline)

??清理qobject類型,按照生成順序逆向的來unref釋放引用。

 

模塊化

??

gstreamerManager.pri

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD HEADERS += \
$$PWD/gstreamerManager.h SOURCES += \
$$PWD/gstreamerManager.c QMAKE_CXXFLAGS += -fpermissive # gstreamer頭文件和庫文件
INCLUDEPATH += /usr/include/gstreamer-1.0
LIBS += -lgstreamer-1.0
#LIBS += -lgobject-2.0 -lgstreamer-1.0 -lgstvideo-1.0 # glibc頭文件和庫文件
INCLUDEPATH += /usr/include/glib-2.0
INCLUDEPATH += /usr/lib/x86_64-linux-gnu/glib-2.0/include
LIBS += -lglib-2.0
 

Demo源碼

#include "gstreamerManager.h"

#include <gst/gst.h>

#define DEBUG   printf("%s:%d\n", __FILE__, __LINE__)

void test001HelloWorldDemo(int *argc, char **argv[])
{
GstElement *pipeline;
GstBus *bus;
GstMessage *msg; // 步驟一:初始化gst
gst_init(argc, argv);
// 步驟二:定義管道(指定渲染器,否則ubuntu上渲染畫面會出錯)
// pipeline = gst_parse_launch("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm", NULL);
pipeline = gst_parse_launch("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm video-sink=\"ximagesink\"", NULL);
// 步驟三:開始播放(設置管道的運行狀態:空、準備、播放、暫停)
gst_element_set_state (pipeline, GST_STATE_PLAYING);
// 步驟四:獲取管道的總線
bus = gst_element_get_bus (pipeline);
// 步驟五:阻塞獲取bus上指定的消息返回(未獲取到則阻塞)
msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
// 步驟六:消息的處理(這里有很多消息,只是舉例子一個
if(GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR)
{
g_printerr ("An error occurred! Re-run with the GST_DEBUG=*:WARN "
"environment variable set for more details.\n");
}
// 步驟七:釋放資源(其中管道先設置狀態空:該狀態將會回收所有被該組件占用的資源,然后再釋放)
gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
 

工程模板v1.0.0

emsp;emsp;

入坑

入坑一:播放畫面異常

問題

emsp;emsp;播放畫面錯位
emsp;emsp;

emsp;emsp;測試原本文件應該是:
emsp;emsp;

嘗試

emsp;emsp;命令行去檢測,也是異常:
emsp;emsp;

emsp;emsp;測試windows上,是正常:
emsp;emsp;

emsp;emsp;所以是系統裝的環境可能有問題。重新切換虛擬機使用ubuntu20.04重新制作虛擬機,用起來還是一樣,有問題:
emsp;emsp;

emsp;emsp;用網頁測試,沒問題:
emsp;emsp;

emsp;emsp;用vlc測試,也沒問題:
emsp;emsp;

emsp;emsp;然后測試其他地址試試,發現沒問題:
emsp;emsp;

解決

??后來發現是需要指定渲染器才行。

總結

以上是生活随笔為你收集整理的GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo的全部內容,希望文章能夠幫你解決所遇到的問題。

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