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

技術開發故事會連載ios

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

SDL 簡介

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

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

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

因而可知,高下立判。一個跨平臺是寫了接口就行,無論實現;另外一個是寫好了實現,才能跨平臺(貌似跑題了)。學習

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

SDL 下載安裝

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

brew install sdl2

注意,這裏下載的是 SDL 2.0 版本,若是用以下的命令調試

brew install sdl

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

採用最新的 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 的安裝路徑以下:

/usr/local/Cellar/sdl2/2.0.10

該目錄以下圖:

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

這裏要用到 include_directorieslink_directories 兩個命令。

其中:

include_directories 是將頭文件所在文件夾添加在搜索路徑中,這樣就能經過 include 去加載頭文件了。
link_directories 是將庫所在的文件夾添加在路徑中去,這樣在編譯時就能連接到這個庫。

具體代碼以下:

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

代碼中聲明瞭一個變量 SDL_DIR 做爲安裝路徑,若是你的系統上路徑有所不一樣,只須要修改路徑就好了。

在 MAC 上也能夠把路徑設置成 /usr/local,全部的庫安裝時在這個目錄的 libinclude 目錄下也有一份索引。

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

你能夠經過 link_directories 命令將不少庫所在文件夾都添加到路徑中,可是隻有 target_link_libraries 命令纔會最終決定關聯什麼庫,若是你添加的文件夾路徑沒有對應庫的話,反而要報錯的。

實現代碼以下:

target_link_libraries(av-beginner SDL2)

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

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

代碼實踐

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

#include <iostream>
#include <SDL2/SDL.h>
using namespace std;

int main(){
    cout << "hello av-beginner" << endl;
    SDL_Init(SDL_INIT_EVERYTHING);
    return 0;
}

SDL_Init 是 SDL 的初始化函數,能夠根據所需功能選擇性的初始化也能夠所有初始化。

若是程序正常輸出而且正常退出,那麼說明環境配置 OK 了,後面就能夠進行功能開發了。

總結

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

具體代碼見倉庫:

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

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

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

掃碼關注,持續更新

相關文章
相關標籤/搜索