02.28 「音視頻連載-001」基礎學習篇- SDL 介紹以及工程配置

技術開發故事會連載

這是音視頻基礎學習系列的第一篇文章,主要講解 SDL 是什麼以及為什麼要用到它,看似和音視頻沒啥卵關係,其實必不可少。

SDL 簡介

SDL 是 “Simple DirectMedia Layer” 的縮寫,它是一個跨平臺的多媒體庫,可以在 Mac、Windows、Linux 以及更多的系統上運行。

SDL 提供了統一的針對音頻、視頻、鍵盤、鼠標、控制桿以及 3D 硬件的低級別訪問接口,我們利用這些接口就能在不同系統上播放出音頻、視頻內容,而無需懂得系統特定的音視頻接口。

這種跨平臺特性和 OpenGL 是一樣的,差別在與 OpenGL 是真·跨平臺,它是 Khronos Group 組織開發維護的一個接口規範,具體的實現是由驅動廠商完成。而 SDL 是把要兼容平臺的相關接口都給封裝好了,然後才對外提供統一的接口。

由此可見,高下立判。一個跨平臺是寫了接口就行,不管實現;另一個是寫好了實現,才能跨平臺(貌似跑題了)。

由於 SDL 的跨平臺特性,在後續學習 FFmpeg 時就可以利用 SDL 進行音視頻的播放操作,而不用像在 Android 平臺上搞 FFmpeg 還得編譯 so、寫 JNI 、寫界面那麼麻煩,另外 ffplay 源碼裡面也是用的 SDL 進行播放的,可以從中進行借鑑。

SDL 下載安裝

在 Mac 上下載 SDL 很簡單,直接

<code>brew install sdl2/<code>

注意,這裡下載的是 SDL 2.0 版本,如果用如下的命令

<code>brew install sdl/<code>

下載的就是 SDL 1.0 版本了,區別就是版本後面數字 2 的後綴。

採用最新的 2.0 ,我當前使用的版本號就是 2.0.10

如果是 Windows 系統,參考下其他文章的下載配置吧,沒有電腦也沒辦法了。

SDL 下載之後位於 MAC 系統的如下目錄,這個目錄後續會用到的。

/usr/local/Cellar/sdl2/2.0.10

CLion 新建工程

接下來就開始打開 CLion ,新建一個 C++ 工程。

這裡用到 CLion 是因為它確實好用,自動補全、代碼提示、斷點調試等功能非常好用,只是沒有社區免費版的,有 30 天的免費試用期,之後就得靠激活碼激活了。

好在是用 CMake 進行編譯的,如果下載了工程源碼,並且配置好了 CMake 的關聯庫和頭文件,直接用 CMake 命令行也可以進行編譯的,這個後面會講到。

C++ 工程關聯 SDL 庫

接下來就是在 C++ 工程中關聯 SDL 庫,便於在工程中引用 SDL 相關頭文件。

之前提到 SDL 的安裝路徑如下:

<code>/usr/local/Cellar/sdl2/2.0.10/<code>

該目錄如下圖:

「音視頻連載-001」基礎學習篇- SDL 介紹以及工程配置

其中 include 就是頭文件的路徑,lib 就是庫的路徑。

這裡要用到 include_directories 和 link_directories 兩個命令。

其中:

include_directories 是將頭文件所在文件夾添加在搜索路徑中,這樣就能通過 include 去加載頭文件了。

link_directories 是將庫所在的文件夾添加在路徑中去,這樣在編譯時就能鏈接到這個庫。

具體代碼如下:

<code># 聲明一個變量 SDL_DIR 為 SDL 安裝路徑set(SDL_DIR "/usr/local/Cellar/sdl2/2.0.10")# 設置要包含的頭文件的路徑include_directories(${SDL_DIR}/include)# 設置要關聯的庫的路徑link_directories(${SDL_DIR}/lib)/<code>

代碼中聲明瞭一個變量 SDL_DIR 作為安裝路徑,如果你的系統上路徑有所不同,只需要修改路徑就行了。

在 MAC 上也可以把路徑設置成 /usr/local,所有的庫安裝時在這個目錄的 lib 和 include 目錄下也有一份索引。

最後將我們要編譯的程序關聯上 SDL 這個庫。

你可以通過 link_directories 命令將很多庫所在文件夾都添加到路徑中,但是隻有 target_link_libraries 命令才會最終決定關聯什麼庫,如果你添加的文件夾路徑沒有對應庫的話,反而要報錯的。

實現代碼如下:

<code>target_link_libraries(av-beginner SDL2)/<code>

target_link_libraries 方法會優先鏈接動態庫,也可以顯示指定動態庫或者靜態庫。MAC 上動態庫的後綴是 dylib 。在上面的圖片可以看到 libSDL2.dylib 其實是一個索引,真正的庫是 libSDL2-2.0.0.dylib,索引忽略了它的版本號。

完成了 SDL 庫的關聯,就可以開始真正編寫代碼了。

代碼實踐

代碼實踐主要是驗證我們的環境配置有沒有問題,運行一個 SDL 函數來試試。

<code>#include <iostream>#include <sdl2>using namespace std;int main(){    cout << "hello av-beginner" << endl;    SDL_Init(SDL_INIT_EVERYTHING);    return 0;}/<sdl2>/<iostream>/<code>

SDL_Init 是 SDL 的初始化函數,可以根據所需功能選擇性的初始化也可以全部初始化。

如果程序正常輸出並且正常退出,那麼說明環境配置 OK 了,後面就可以進行功能開發了。

總結

以上就是音視頻基礎學習連載的 001 篇。

具體代碼見倉庫:

https://github.com/glumes/av-beginner

本篇文章對應的提交 tag 為 av-beginner-001,可切換至對應源碼查看。

能力有限,文中有不對之處,歡迎加我微信 ezgluems 進行交流~~


分享到:


相關文章: