FFmpeg開發筆記(三十五)Windows環境給FFmpeg整合libsrt

aqi00發表於2024-07-06
《FFmpeg開發實戰:從零基礎到短影片上線》一書的“10.2 FFmpeg推流和拉流”提到直播行業存在RTSP和RTMP兩種常見的流媒體協議。除此以外,還有比較兩種比較新的流媒體協議,分別是SRT和RIST。

其中SRT全稱為Secure Reliable Transport,中文叫做安全可靠傳輸協議。RIST全稱為Reliable Internet Stream Transport,中文叫做可靠的網際網路流傳輸協議。SRT和RIST兩個協議均在2017年釋出,騰訊影片雲已將SRT作為傳輸層之上的協議。根據騰訊影片雲的實踐,相比傳統的RTMP直播協議,SRT對推流卡頓問題有明顯改善。下面就介紹如何在Windows環境給FFmpeg整合SRT協議的支援庫libsrt。

一、安裝Perl

libsrt依賴於openssl庫,而openssl庫又要透過perl編譯,所以得先安裝perl。Perl的官網地址是https://strawberryperl.com/,最新版本安裝包的下載連結為https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_53822_64bit/strawberry-perl-5.38.2.2-64bit.msi。
安裝包下載完畢,雙擊即可啟動安裝程式,注意perl的安裝目錄不能帶空格,因此不能安裝到“Program Files”這樣的目錄,只能安裝在沒有空格的目錄,比如E:\Apache\Strawberry\。
Perl安裝完畢,會自動在Path變數中新增Perl的安裝路徑。注意修改Windows環境變數的Path值,把msys64的幾個bin路徑都挪到perl路徑後面,確保編譯openssl時呼叫新安裝的perl程式,而非呼叫msys64的perl程式。

二、安裝Nasm

如果之前已經在msys64中安裝了nasm,此時就不必再安裝nasm,可以直接使用msys64裡面安裝的nasm程式。詳細的nasm安裝說明參見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“1.3.3 安裝已編譯的FFmpeg及其dll庫”。

三、編譯安裝OpenSSL

因為libsrt依賴於openssl庫,所以編譯libsrt前要先編譯openssl庫。openssl的原始碼下載頁面是https://www.openssl.org/source/,比如openssl-3.3.0的下載連結為https://www.openssl.org/source/openssl-3.3.0.tar.gz。
openssl的編譯和安裝步驟說明如下。
1、開啟VisualStudio的控制檯,也就是開始選單依次選擇“Visual Studio 2022”——“x86_x64 Cross Tools Command Prompt for VS 2022”。然後解壓openssl的原始碼包,並進入解壓後的目錄,也就是執行下面命令:

tar zxvf openssl-3.3.0.tar.gz
cd openssl-3.3.0

2、執行下面命令透過perl配置openssl庫:

perl Configure VC-WIN64A --prefix=E:\Apache\openssl

3、執行下面命令編譯openssl。

nmake

4、編譯完成後,執行下面命令安裝openssl。(該步驟編譯比較久,請耐心等待)

nmake install

5、給Windows環境變數新增OPENSSL_ROOT_DIR,變數值為OpenSSL的安裝路徑“E:\Apache\openssl”。

四、配置libsrt

libsrt是一款SRT協議的支援庫。它的原始碼託管頁面是https://github.com/Haivision/srt,最新版本是2023年8月釋出的libsrt-1.5.3,該版本的原始碼包下載地址是https://github.com/Haivision/srt/archive/refs/tags/v1.5.3.tar.gz。
先解壓下載完的原始碼包,再開啟cmake-gui,在Source欄填入libsrt的原始碼路徑比如E:/VisualProject/srt-1.5.3,在Build欄填入libsrt的編譯路徑比如E:/VisualProject/srt-1.5.3/build。如下圖所示。

接著單擊cmake-gui視窗中部左側的Configure按鈕,開始配置srt原始碼。等待配置完畢,單擊Configure按鈕右邊的Generate按鈕,開始生成srt原始碼的vs工程。等待生成完畢,單擊Generate按鈕右邊的Open Project按鈕,啟動VisualStudio自動載入srt的vs工程。

五、編譯libsrt

等待VisualStudio啟動完畢,依次選擇頂部選單“生成”→“配置管理器”,在開啟的配置管理器介面上,找到左上角的“活動解決方案配置”下拉框,把Debug模式改為Release模式,再單擊右下角的關閉按鈕。
接著單擊介面右側解決方案列表中的srt_shared,再依次選擇頂部選單“生成”→“生成srt_shared”(或“Build srt_shared”)。等待生成完畢,即可在srt原始碼路徑的build/Release目錄下找到libsrt的庫檔案(包括srt.dll和srt.lib)。

六、安裝libsrt

雖然VisualStudio把libsrt的dll庫檔案編譯了出來,但是若想讓FFmpeg識別libsrt,還得依照相應的目錄結構放入libsrt的庫檔案和標頭檔案,從而模擬Linux環境的安裝結果。詳細的安裝步驟參考《FFmpeg開發實戰:從零基礎到短影片上線》一書的第8章的“8.1.4 給FFmpeg整合freetype”。
1、在msys64的/usr/local目錄下新建libsrt目錄,並在該目錄下建立lib子目錄;
2、把srt原始碼路徑的build/Release目錄下的srt.lib和srt.dll兩個檔案複製到上面第一步建立的lib目錄;
3、在lib目錄下建立pkgconfig子目錄,把srt原始碼路徑下的build/srt.pc複製到pkgconfig目錄,並將該pc檔案的下面這行配置。

prefix=C:/Program Files (x86)/SRT

改為下面這行配置

prefix=/usr/local/libsrt

4、在libsrt目錄下建立include目錄,並在include目錄建立srt子目錄,把srt原始碼路徑的build/version.h以及srtcore目錄下的access_control.h、logging_api.h、platform_sys.h、srt.h、udt.h等標頭檔案都複製到srt目錄下。還要把srt原始碼路徑的common下面的win目錄整個複製到include目錄下。
經過以上步驟操作後的libsrt目錄結構如下所示:

/usr/local/libsrt
 |--------------- lib
 |                 |-- srt.lib
 |                 |-- srt.dll
 |                 |-- pkgconfig
 |                        |----- srt.pc
 |--------------- include
 |                 |-- srt
 |                        |----- access_control.h
 |                        |----- logging_api.h
 |                        |----- platform_sys.h
 |                        |----- srt.h
 |                        |----- udt.h
 |                        |----- version.h
 |                 |-- win
 |                        |----- syslog_defs.h
 |                        |----- unistd.h
 |                        |----- wintime.h

5、接著給環境變數PKG_CONFIG_PATH新增libsrt的pkgconfig路徑,也就是在/etc/profile檔案末尾新增如下一行內容。

export PKG_CONFIG_PATH=/usr/local/libsrt/lib/pkgconfig:$PKG_CONFIG_PATH

6、儲存並退出profile檔案後,在MSYS視窗中執行下面命令重新載入環境變數。

source /etc/profile

7、執行下面命令檢視當前的環境變數,發現PKG_CONFIG_PATH的修改已經奏效。

env | grep PKG_CONFIG_PATH

七、讓FFmpeg啟用libsrt

由於FFmpeg預設未啟用libsrt,因此需要重新配置FFmpeg,標明啟用libsrt,然後重新編譯安裝FFmpeg。FFmpeg的Windows環境完整編譯過程參見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“8.1 Windows環境編譯FFmpeg”,詳細的啟用步驟說明如下。
1、回到FFmpeg原始碼的目錄,執行以下命令重新配置FFmpeg,主要增加啟用libsrt。(增加了選項--enable-libsrt)

./configure  --prefix=/usr/local/ffmpeg --arch=x86_64 --enable-shared --disable-static --disable-doc --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libdavs2 --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libfreetype --enable-sdl2 --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libopus --enable-libvpx --enable-libass --enable-libfribidi --enable-libxml2 --enable-fontconfig --enable-openssl --enable-libuavs3d --enable-libxvid --enable-libsrt --enable-iconv --enable-zlib --extra-cflags='-I/usr/local/lame/include -I/usr/local/libogg/include -I/usr/local/amr/include -I/usr/local/libxvid/include' --extra-ldflags='-L/usr/local/lame/lib -L/usr/local/libogg/lib -L/usr/local/amr/lib -L/usr/local/libxvid/lib' --cross-prefix=x86_64-w64-mingw32- --target-os=mingw32

2、執行下面命令編譯FFmpeg。

make clean
make -j4

3、執行下面命令安裝FFmpeg。

make install
cp /usr/local/libsrt/lib/*.dll /usr/local/ffmpeg/bin

4、執行以下命令檢視FFmpeg的版本資訊。

ffmpeg -version

檢視控制檯回顯的FFmpeg版本資訊,找到“--enable-libsrt”,說明FFmpeg正確啟用了SRT協議的支援庫libsrt。
更多詳細的FFmpeg開發知識參見《FFmpeg開發實戰:從零基礎到短影片上線》一書。

相關文章