crtmpserver簡介
我們在第一章的時候已經簡要說明了crtmpserver,crtmpserver是一個由C++語言編寫的開源的RTMP流媒體伺服器,與其對應的商業產品自然是Adobe公司的FMS。與FMS相比,從功能上來說crtmpserver只能稱為FMS的簡化版本,其功能並沒有FMS那麼完善甚至是遠遠沒有達到。其與flash player的相容性自然也比不上官方的FMS了。但是crtmpserver提供了最常見的RTMP實現。作為開源的高效能RTMP流媒體伺服器,不僅可以用在x86平臺的linux伺服器,windows伺服器,還可以被用在arm等嵌入式平臺上。crtmpserver的程式碼結構良好,類的繼承體系清楚,程式碼效率高。是學習RTMP協議和伺服器端程式設計的好例子。
crtmpserver的官方網站是www.rtmpd.com 但是目前該網站好像是出了問題,並不能開啟,crtmpserver的google論壇上有網友說crtmpserver的原始碼暫時移動到github上了,具體地址是https://github.com/shiretu/crtmpserver 如果大家想要下載到最新的crtmpserver原始碼,可以到該git頁面上下載。後續還請關注crtmpserver的官方網站。
本系列文章並不打算使用該git上下載的程式碼,由於之前工作中使用的crtmpserver程式碼是基於717的版本,所以該系列也將基於此版本作為講解。請在這裡下載crtmpserver-717.tar.gz 程式碼包,其關聯的openssl程式碼為 openssl-1.0.1c.tar.gz
linux下編譯與執行crtmpserver
本次linux使用的發行版是Ubuntu 10.10,各個編譯工具版本如下:
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
cmake version 2.8.7
crtmpserver原始碼依賴openssl,所以我們需要先編譯openssl庫,並安裝相關的標頭檔案。另外crtmpserver使用的cmake工具進行原始碼的編譯管理,所以也需要安裝cmake。
openssl的編譯:本次使用的是openssl-1.0.1c.tar.gz 解壓之後在原始碼根目錄直接執行:
$ ./config
$ make
$ make test
$ make install
crtmpserver的編譯:解壓上面下載到的gz壓縮包,執行下面命令:
cd crtmpserver-717/builders/cmake/
cmake .
make
在make的時候報告下面的錯誤:
在檔案tinyxmlparser.cpp中有一個變數ptrdiff_t沒有定義,我們開啟該檔案,在第407行將變數ptrdiff_t加上std的字首即可,改為 std::ptrdiff_t,之後繼續make
之後出現下面的錯誤:
說有一個變數objectEncoding定義之後沒有使用,而警告被當作錯誤處理。我們只需要修改一下CMakeFileLists.txt 找到如下這一行,註釋掉即可,其實主要是去掉-Werror選項:
修改CMakeFileLists.txt之後需要重新cmake 這樣會重新生成Makefile檔案,然後再make直到完成,最後完成之後的資訊是這樣的:
執行crtmpserver,編譯完成之後此時的目錄還在crtmpserver-717/builders/cmake/目錄下,直接執行下面的命令:
./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua
程式成功執行之後的顯示如下,表示成功執行:
windows下編譯與執行crtmpserver
首先在windows下編譯crtmpserver也需要windows版本的openssl,所以我們需要先編譯windows版本的openssl。
編譯windows版本的openssl:將openssl解壓之後,有一個INSTALL.W32或者INSTALL.W64,裡面有如何編譯windows版本的openssl的說明,我們以win32為例子。
編譯openssl需要perl的支援,我們先安裝windows環境下的perl工具,其下載地址為:http://www.activestate.com/activeperl 我的電腦是64位的,所以我下載的是 ActivePerl-5.24.0.2400-MSWin32-x64-300558.exe 直接安裝,在安裝的下一步中選擇 “Typical”就可以。
安裝完成之後,我們就可以開始編譯windows版本的openssl了,步驟如下:
<1>. 我用的是VS2010。其他的版本應該差不太多,開啟“開始”---“程式”---“Microsoft Visual Studio 2010”---“Visual Studio Tools”---“Visual Studio 命令提示(2010)”,注意這裡要從選單中開啟VS 2010的命令列,會自動設定一些環境變數的,如果直接執行“開始”---“執行”--cmd.exe這個命令列的話,可能編譯的時候找不到標頭檔案等。
<2>. 在上面開啟的VS2010的命令列中,cd到openssl原始碼根目錄,然後執行下面的命令:
perl Configure VC-WIN32 no-asm --prefix=c:/openssl-1.0.1c
指定配置,並設定openssl的安裝目錄
<3>. ms\do_ms
<4>. 將nmake.exe所在的路徑新增到系統環境變數,例如我找到nmake.exe是在D:\Program Files\Microsoft Visual Studio 10.0\VC\bin下面
<5>. 將D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE新增到環境變數,因為cl.exe需要的mspdb100.dll在這個目錄下,否則會返回0x80錯誤。同樣你也應該在你自己的VS2010的相關安裝目錄下找。
<6>. nmake -f ms\ntdll.mak
<7>. nmake -f ms\ntdll.mak test 這一步是編譯測試,可以不做,僅僅是為了測試上面的是否編譯好了
<8>. nmake -f ms\ntdll.mak install 這一步是安裝,會安裝到我們的第4步指定的 --prefix=c:/openssl-1.0.1c 目錄中也就是拷貝相關的庫檔案到這裡
windows下的openssl編譯完成的介面如下:
安裝完成的介面如下:
現在開始編譯windows版本的crtmpserver,開啟crtmpserver的原始碼目錄中的builders\VS2010\VS2010.sln 工程,直接在解決方案上面右鍵,生成解決方案。會出現錯誤提示找不到openssl的標頭檔案:
在VS2010中crtmpserver的各個模組被單獨做為專案工程,很多工程都用到了openssl,所以我們需要設定一個全域性的openssl的標頭檔案和庫檔案的路徑。在VS2010中設定全域性包含沒有VC那麼方便,首先開啟屬性管理器視窗:
再開啟皮膚中隨便選擇一個專案,展開如圖的介面,雙擊如圖所示指定的專案檔案,並在彈出的介面中指定包含目錄路徑:
用同樣的方法指定庫檔案的路徑:
繼續編譯,發現報錯如下:
將上圖中所示的兩處地方,0值改成(uint32_t)0; 繼續編譯,報告一個連結錯誤,並且還有一些intellisense錯誤,如下:
在crtmpserver官方原始碼提供的VS2010.sln解決方案中有兩個原始檔沒有新增到工程中來,我們手工新增進來,如下圖,開啟thelib工程,展開如下圖的rtp目錄,右鍵新增現有專案:
選擇標頭檔案nattraversalprotocol.h 該檔案在原始碼目錄的sources/thelib/include/protocols/rtp/目錄下:
同樣的方法新增cpp檔案,cpp檔案所在的目錄為sources/thelib/src/protocols/rtp/目錄:
新增完成之後繼續生成解決方案,解決方案生成成功,我們需要設定一下執行的命令列引數:--use-implicit-console-appender crtmpserver.lua 表示列印控制檯日誌,並且使用工作目錄下的crtmpserver.lua作為配置檔案,將工作目錄設定成$(OutDir)該變數對應的目錄實際上是crtmpserver-717\builders\VS2010\Debug,我們的程式最終編譯之後的執行檔案和庫檔案就放在這個目錄下:
我們可以開啟編譯成功之後檔案生成的目錄中的檔案如下,目錄為builders/VS2010/Debug/目錄:
直接點選VS2010的選單的“開始執行(不除錯)”,這樣cmd輸出視窗最後輸出完成之後,會輸出一行“請按任意鍵繼續…”否則一閃而過出錯也看不清楚。
執行之後乾脆報下面的錯誤:
程式直接崩潰,原來openssl的相關dll沒有拷貝到我們的程式目錄下,我們拷貝過來:
繼續執行,發現報錯如下:
我們去掉配置檔案中的ssl許可權驗證相關的內容:
註釋掉相關節點之後,繼續執行,仍然報錯:
錯誤顯示配置中指定的log的路徑設定有問題,繼續修改配置如下:
再次執行,顯示執行成功,介面如下:
推流到crtmpserver
編譯成功crtmpserver之後,我們試著將直播流推送到伺服器上,然後直播。沒有攝像頭,我們可以使用開源的obs軟體推送直播流,下載安裝就不說了,相信做過遊戲直播的都多少了解。下面是obs開啟之後的介面:
設定視訊捕獲源:
點選主介面右下角的“設定”按鈕進入推流的引數設定,我們主要是設定“串流”選項卡中的內容,crtmpserver的配置檔案中預設配置有live這個推流點,所以我們的推流路徑是rtmp://127.0.0.1/live/ 隨便設定一個直播流名,例如這裡設定的是test,設定好之後如下圖,點選確定即可。
然後點選主介面上的“開始串流”按鈕開始 推流,可以看到推流成功之後,在我們的crtmpserver執行的控制檯視窗中會有一些日誌列印出來:
從最後兩行的日誌中我們可以看到流test已經成功註冊。
從crtmpserver播放直播流
如何播放剛才推送的流呢,我們找一個支援rtmp協議的播放器,vlc的最新版本應該是支援rtmp協議的播放的。另外flash播放器也是一個很好的選擇,在播放器中輸入地址和流名:
播放效果如下,截的是電腦桌面:
到此,我們整個crtmpserver原始碼的windows平臺的編譯,linux平臺的編譯,推流,播放就算完整了。可以看到windows的編譯要比linux複雜的多,其實很多開源軟體對linux要更加友好一點,包括編譯執行的過程都要順利一點。後面的章節中,我們將開始分析crtmpserver的架構、RTMP協議的細節,MP4檔案的格式,最後我們將實現HLS功能(原生的crtmpserver是沒有HLS的)。
如果本文對您有所幫助,您的贊,會讓我有更大的信心寫好後面的文章呢。