天天看點

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

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

在檔案tinyxmlparser.cpp中有一個變量ptrdiff_t沒有定義,我們打開該檔案,在第407行将變量ptrdiff_t加上std的字首即可,改為 std::ptrdiff_t,之後繼續make

之後出現下面的錯誤:

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

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

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

修改CMakeFileLists.txt之後需要重新cmake 這樣會重新生成Makefile檔案,然後再make直到完成,最後完成之後的資訊是這樣的:

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

運作crtmpserver,編譯完成之後此時的目錄還在crtmpserver-717/builders/cmake/目錄下,直接運作下面的指令:

./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua

程式成功運作之後的顯示如下,表示成功運作:

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

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編譯完成的界面如下:

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

安裝完成的界面如下:

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

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

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

在VS2010中crtmpserver的各個子產品被單獨做為項目工程,很多工程都用到了openssl,是以我們需要設定一個全局的openssl的頭檔案和庫檔案的路徑。在VS2010中設定全局包含沒有VC那麼友善,首先打開屬性管理器視窗:

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

再打開面闆中随便選擇一個項目,展開如圖的界面,輕按兩下如圖所示指定的項目檔案,并在彈出的界面中指定包含目錄路徑:

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

用同樣的方法指定庫檔案的路徑:

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

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

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

将上圖中所示的兩處地方,0值改成(uint32_t)0; 繼續編譯,報告一個連結錯誤,并且還有一些intellisense錯誤,如下:

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

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

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

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

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

同樣的方法添加cpp檔案,cpp檔案所在的目錄為sources/thelib/src/protocols/rtp/目錄:

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

添加完成之後繼續生成解決方案,解決方案生成成功,我們需要設定一下運作的指令行參數:--use-implicit-console-appender crtmpserver.lua 表示列印控制台日志,并且使用工作目錄下的crtmpserver.lua作為配置檔案,将工作目錄設定成$(OutDir)該變量對應的目錄實際上是crtmpserver-717\builders\VS2010\Debug,我們的程式最終編譯之後的執行檔案和庫檔案就放在這個目錄下:

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

我們可以打開編譯成功之後檔案生成的目錄中的檔案如下,目錄為builders/VS2010/Debug/目錄:

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

直接點選VS2010的菜單的“開始執行(不調試)”,這樣cmd輸出視窗最後輸出完成之後,會輸出一行“請按任意鍵繼續…”否則一閃而過出錯也看不清楚。

運作之後幹脆報下面的錯誤:

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

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

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

繼續運作,發現報錯如下:

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

我們去掉配置檔案中的ssl權限驗證相關的内容:

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

注釋掉相關節點之後,繼續運作,仍然報錯:

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

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

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

再次運作,顯示運作成功,界面如下:

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

推流到crtmpserver

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

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

設定視訊捕獲源:

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

點選主界面右下角的“設定”按鈕進入推流的參數設定,我們主要是設定“串流”頁籤中的内容,crtmpserver的配置檔案中預設配置有live這個推流點,是以我們的推流路徑是rtmp://127.0.0.1/live/ 随便設定一個直播流名,例如這裡設定的是test,設定好之後如下圖,點選确定即可。

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

然後點選主界面上的“開始串流”按鈕開始 推流,可以看到推流成功之後,在我們的crtmpserver運作的控制台視窗中會有一些日志列印出來:

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

從最後兩行的日志中我們可以看到流test已經成功注冊。

從crtmpserver播放直播流

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

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

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

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

到此,我們整個crtmpserver源碼的windows平台的編譯,linux平台的編譯,推流,播放就算完整了。可以看到windows的編譯要比linux複雜的多,其實很多開源軟體對linux要更加友好一點,包括編譯運作的過程都要順利一點。後面的章節中,我們将開始分析crtmpserver的架構、RTMP協定的細節,MP4檔案的格式,最後我們将實作HLS功能(原生的crtmpserver是沒有HLS的)。

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