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

在文件tinyxmlparser.cpp中有一個變量ptrdiff_t沒有定義,我們打開該文件,在第407行將變量ptrdiff_t加上std的前綴即可,改為 std::ptrdiff_t,之后繼續make

之后出現下面的錯誤:
2

說有一個變量objectEncoding定義之后沒有使用,而警告被當作錯誤處理。我們只需要修改一下CMakeFileLists.txt 找到如下這一行,注釋掉即可,其實主要是去掉-Werror選項:

3

修改CMakeFileLists.txt之后需要重新cmake 這樣會重新生成Makefile文件,然后再make直到完成,最后完成之后的信息是這樣的:

4

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

程序成功運行之后的顯示如下,表示成功運行:
5

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的頭文件:

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的)。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM