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

來源:互聯網
上載者:User

標籤:images   hub   std   openssl   console   ++   object   xmlparse   txt   

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

 

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

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.