crtmpserver系列(二):搭建簡易流媒體直播系統

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.gzlinux

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的時候報告下面的錯誤:
1git

在文件tinyxmlparser.cpp中有一個變量ptrdiff_t沒有定義,咱們打開該文件,在第407行將變量ptrdiff_t加上std的前綴便可,改成 std::ptrdiff_t,以後繼續make

以後出現下面的錯誤:
2github

說有一個變量objectEncoding定義以後沒有使用,而警告被看成錯誤處理。咱們只須要修改一下CMakeFileLists.txt 找到以下這一行,註釋掉便可,其實主要是去掉-Werror選項:編程

3

修改CMakeFileLists.txt以後須要從新cmake 這樣會從新生成Makefile文件,而後再make直到完成,最後完成以後的信息是這樣的:ubuntu

4

運行crtmpserver,編譯完成以後此時的目錄還在crtmpserver-717/builders/cmake/目錄下,直接運行下面的命令:
./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua

程序成功運行以後的顯示以下,表示成功運行:
5windows

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編譯完成的界面以下:
6服務器

安裝完成的界面以下:架構

7

如今開始編譯windows版本的crtmpserver,打開crtmpserver的源碼目錄中的builders\VS2010\VS2010.sln 工程,直接在解決方案上面右鍵,生成解決方案。會出現錯誤提示找不到openssl的頭文件:app

9

在VS2010中crtmpserver的各個模塊被單獨作爲項目工程,不少工程都用到了openssl,因此咱們須要設置一個全局的openssl的頭文件和庫文件的路徑。在VS2010中設置全局包含沒有VC那麼方便,首先打開屬性管理器窗口:工具

9

再打開面板中隨便選擇一個項目,展開如圖的界面,雙擊如圖所示指定的項目文件,並在彈出的界面中指定包含目錄路徑:

1

用一樣的方法指定庫文件的路徑:

1

繼續編譯,發現報錯以下:

1

將上圖中所示的兩處地方,0值改爲(uint32_t)0; 繼續編譯,報告一個連接錯誤,而且還有一些intellisense錯誤,以下:

1

在crtmpserver官方源碼提供的VS2010.sln解決方案中有兩個源文件沒有添加到工程中來,咱們手工添加進來,以下圖,打開thelib工程,展開以下圖的rtp目錄,右鍵添加現有項目:

 1

選擇頭文件nattraversalprotocol.h 該文件在源碼目錄的sources/thelib/include/protocols/rtp/目錄下:

1

一樣的方法添加cpp文件,cpp文件所在的目錄爲sources/thelib/src/protocols/rtp/目錄:

11

添加完成以後繼續生成解決方案,解決方案生成成功,咱們須要設置一下運行的命令行參數:--use-implicit-console-appender crtmpserver.lua 表示打印控制檯日誌,而且使用工做目錄下的crtmpserver.lua做爲配置文件,將工做目錄設置成$(OutDir)該變量對應的目錄其實是crtmpserver-717\builders\VS2010\Debug,咱們的程序最終編譯以後的執行文件和庫文件就放在這個目錄下:

1

咱們能夠打開編譯成功以後文件生成的目錄中的文件以下,目錄爲builders/VS2010/Debug/目錄:

1

直接點擊VS2010的菜單的「開始執行(不調試)」,這樣cmd輸出窗口最後輸出完成以後,會輸出一行「請按任意鍵繼續…」不然一閃而過出錯也看不清楚。

運行以後乾脆報下面的錯誤:
1

程序直接崩潰,原來openssl的相關dll沒有拷貝到咱們的程序目錄下,咱們拷貝過來:

1

繼續運行,發現報錯以下:

1

咱們去掉配置文件中的ssl權限驗證相關的內容:

1

註釋掉相關節點以後,繼續運行,仍然報錯:

1

錯誤顯示配置中指定的log的路徑設置有問題,繼續修改配置以下:

1

再次運行,顯示運行成功,界面以下:

1

推流到crtmpserver

編譯成功crtmpserver以後,咱們試着將直播流推送到服務器上,而後直播。沒有攝像頭,咱們可使用開源的obs軟件推送直播流,下載安裝就不說了,相信作過遊戲直播的都多少了解。下面是obs打開以後的界面:

1

設置視頻捕獲源:

1

點擊主界面右下角的「設置」按鈕進入推流的參數設置,咱們主要是設置「串流」選項卡中的內容,crtmpserver的配置文件中默認配置有live這個推流點,因此咱們的推流路徑是rtmp://127.0.0.1/live/ 隨便設置一個直播流名,例如這裏設置的是test,設置好以後以下圖,點擊肯定便可。

1

而後點擊主界面上的「開始串流」按鈕開始 推流,能夠看到推流成功以後,在咱們的crtmpserver運行的控制檯窗口中會有一些日誌打印出來:

1

從最後兩行的日誌中咱們能夠看到流test已經成功註冊。

從crtmpserver播放直播流

如何播放剛纔推送的流呢,咱們找一個支持rtmp協議的播放器,vlc的最新版本應該是支持rtmp協議的播放的。另外flash播放器也是一個很好的選擇,在播放器中輸入地址和流名:

1

播放效果以下,截的是電腦桌面:

1

 

到此,咱們整個crtmpserver源碼的windows平臺的編譯,linux平臺的編譯,推流,播放就算完整了。能夠看到windows的編譯要比linux複雜的多,其實不少開源軟件對linux要更加友好一點,包括編譯運行的過程都要順利一點。後面的章節中,咱們將開始分析crtmpserver的架構、RTMP協議的細節,MP4文件的格式,最後咱們將實現HLS功能(原生的crtmpserver是沒有HLS的)。

 

若是本文對您有所幫助,您的贊,會讓我有更大的信心寫好後面的文章呢。

相關文章
相關標籤/搜索