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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HUST】网安|编译原理实验|实验四攻
- 下一篇: JAVA的那些数据结构实现总结,实现,扩