<div id="content_views" class="markdown_views"> <!-- flowchart 箭頭圖標 勿刪 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg> <h2 id="背景介紹"><a name="t0"></a>背景介紹</h2>nginx
<blockquote> <p>本文使用的流媒體服務器的搭建是基於rtmp(Real Time Message Protocol)協議的,rtmp協議是應用層的協議,要依靠底層的傳輸層協議,好比tcp協議來保證信息傳輸的可靠性。最後提供了一個不錯的測試方案。</p>c++
<p>流媒體服務器依賴的服務,1.nginx 服務器;2.nginx服務器安裝須要依賴的服務 OpenSSL、pcre、zlib、 c++、gcc等。</p>git
<p>服務器環境是Centos 7.3 64 位,本地操做系統 win7 旗艦版</p> </blockquote>github
<h2 id="注意事項"><a name="t1"></a>注意事項</h2>web
<blockquote> <p>須要資源:1.一臺雲服務器;2.一臺能上網的電腦 <br> 須要注意的是本機搭建使用的是Centos 7.X的版本,iptables命令等使用方式有變更,如需修改參照<a href="http://blog.csdn.net/qzcsu/article/details/72547861#t1" rel="nofollow" target="_blank">3.I 中修改防火牆操做方式</a> <br> 因爲本機上先安裝的Apache,而nginx和Apache都是默認的80端口,因此防止衝突本文修改了nginx的默認端口</p> </blockquote>windows
<h2 id="安裝nginx"><a name="t2"></a>安裝nginx</h2>安全
<blockquote> <p>首先須要注意的是雖然nginx可使用yum安裝,可是yum安裝使用的都是編譯後的文件進行安裝,而且後面所須要的rtmp模塊通常在yum源裏面是找不到的,因此要想將rtmp也安裝進來,咱們選擇源碼安裝,通過步驟配置,編譯,安裝。 <br> 本文是使用nginx源碼,自行編譯安裝。首先是下載源碼,因爲nginx的代碼是開源託管在github上,咱們先用yum 將git下載下來,而後使用git將源碼從github上clone下來</p> </blockquote>ruby
<pre class="prettyprint" name="code"><code class="hljs bash has-numbering" onclick="mdcp.signin(event)"><span class="hljs-built_in">cd</span> mkdir <span class="hljs-built_in">source</span> <span class="hljs-comment">#建立源碼目錄 後面的源碼都放在這個目錄</span> <span class="hljs-built_in">cd</span> <span class="hljs-built_in">source</span> yum -y install git <span class="hljs-comment">#安裝git</span> git clone https://github.com/nginx/nginx.git <span class="hljs-comment">#從github服務器上將nginx的源代碼下載下來</span> git clone https://github.com/arut/nginx-rtmp-module.git <span class="hljs-comment">#將rtmp模塊的源碼下載下來</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>bash
<p>下載依賴模塊源碼pcre、OpenSSL、zlib 若是機器上已經安裝了這些模塊就不須要了</p>服務器
<pre class="prettyprint" name="code"><code class="hljs perl has-numbering" onclick="mdcp.signin(event)">rpm -qa|<span class="hljs-keyword">grep</span> 模塊名字 <span class="hljs-comment">#查詢安裝的模塊的包信息</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering" onclick="mdcp.signin(event)">wget https://www<span class="hljs-preprocessor">.openssl</span><span class="hljs-preprocessor">.org</span>/source/openssl-<span class="hljs-number">1.1</span><span class="hljs-number">.0</span><span class="hljs-preprocessor">.tar</span><span class="hljs-preprocessor">.gz</span> <span class="hljs-preprocessor">#下載OpenSSL源碼包</span> wget https://ftp<span class="hljs-preprocessor">.pcre</span><span class="hljs-preprocessor">.org</span>/pub/pcre/pcre-<span class="hljs-number">8.39</span><span class="hljs-preprocessor">.tar</span><span class="hljs-preprocessor">.gz</span> <span class="hljs-preprocessor">#下載pcre源碼包</span> wget http://www<span class="hljs-preprocessor">.zlib</span><span class="hljs-preprocessor">.net</span>/zlib-<span class="hljs-number">1.2</span><span class="hljs-number">.11</span><span class="hljs-preprocessor">.tar</span><span class="hljs-preprocessor">.gz</span> <span class="hljs-preprocessor">#下載zlib包源碼</span><div class="hljs-button signin" data-title="登陸後複製"></div></code>/pre> <pre class="prettyprint" name="code"><code class="hljs bash has-numbering" onclick="mdcp.signin(event)">tar -zxvf 包名 <span class="hljs-comment">#解壓各個包源碼</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<p>附一張目錄結構圖 <br> <img src="https://img-blog.csdn.net/20170527122342724?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="目錄結構" title=""></p>
<p>找到nginx源碼包中 configure 所在的目錄,如下腳本就是基於configure來實現的,在本機上configure 命令就在auto 目錄下,當前目錄 /root/source/nginx 就在這個目錄下編寫腳本vi config.sh 加入如下內容</p>
<pre class="prettyprint" name="code"><code class="hljs lasso has-numbering" onclick="mdcp.signin(event)"><span class="hljs-built_in">.</span>/auto/configure <span class="hljs-subst">--</span>prefix<span class="hljs-subst">=</span>/usr/<span class="hljs-built_in">local</span>/nginx <span class="hljs-subst">\</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-pcre</span><span class="hljs-subst">=</span><span class="hljs-built_in">..</span>/pcre<span class="hljs-subst">-</span><span class="hljs-number">8.39</span> <span class="hljs-subst">\</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-openssl</span><span class="hljs-subst">=</span><span class="hljs-built_in">..</span>/openssl<span class="hljs-subst">-</span><span class="hljs-number">1.1</span><span class="hljs-number">.0</span> <span class="hljs-subst">\</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-zlib</span><span class="hljs-subst">=</span><span class="hljs-built_in">..</span>/zlib<span class="hljs-subst">-</span><span class="hljs-number">1.2</span><span class="hljs-number">.11</span> <span class="hljs-subst">\</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-http_v2_module</span> <span class="hljs-subst">\</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-http_flv_module</span> <span class="hljs-subst">\</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-http_mp4_module</span> <span class="hljs-subst">\</span> <span class="hljs-subst">--</span>add<span class="hljs-attribute">-module</span><span class="hljs-subst">=</span><span class="hljs-built_in">..</span>/nginx<span class="hljs-attribute">-rtmp</span><span class="hljs-attribute">-module</span><span class="hljs-subst">/</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<p>保存後給文件賦予操做權限,再執行</p>
<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering" onclick="mdcp.signin(event)">chmod <span class="hljs-number">777</span> config<span class="hljs-preprocessor">.sh</span> <span class="hljs-preprocessor">#賦予權限</span> ./config<span class="hljs-preprocessor">.sh</span> <span class="hljs-preprocessor">#執行腳本</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<p>檢查配置沒有問題 <br> <img src="https://img-blog.csdn.net/20170527152759817?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="配置檢查經過" title=""></p>
<pre class="prettyprint" name="code"><code class="hljs cmake has-numbering" onclick="mdcp.signin(event)">yum -y <span class="hljs-keyword">install</span> gcc <span class="hljs-comment">#確保依賴的gcc安裝</span> yum -y <span class="hljs-keyword">install</span> gcc-c++ <span class="hljs-comment">#確保依賴的c++已經安裝</span> make <span class="hljs-comment">#編譯</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<p>顯示以下則編譯成功 <br> <img src="https://img-blog.csdn.net/20170527153253829?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="編譯成功" title=""></p>
<pre class="prettyprint" name="code"><code class="hljs cmake has-numbering" onclick="mdcp.signin(event)">make <span class="hljs-keyword">install</span> <span class="hljs-comment">#安裝</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<blockquote> <p>安裝成功 <br> <img src="https://img-blog.csdn.net/20170527153345674?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="安裝成功" title=""></p>
<p>一樣須要 1.雲服務器控制檯對相應的端口開放;2.而且Linux機器對默認端口80開放(若是想修改默認端口自行百度),因爲本機80端口被Apache 服務器佔用了,因此將nginx默認端口改成8084 </p> </blockquote>
<pre class="prettyprint" name="code"><code class="hljs perl has-numbering" onclick="mdcp.signin(event)">iptables -I INPUT -p tcp -<span class="hljs-keyword">m</span> <span class="hljs-keyword">state</span> --<span class="hljs-keyword">state</span> NEW --dport <span class="hljs-number">8084</span> -j ACCEPT <span class="hljs-comment">#放行8084端口的 NEW狀態請求(本機的RELATED,ESTABLISHED狀態是默認放行的)</span> service iptables save <span class="hljs-comment">#保存規則</span> service iptables restart <span class="hljs-comment">#重啓防火牆保證新的規則加載進來</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<p><img src="https://img-blog.csdn.net/20170527144413013?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="防火牆規則鏈" title=""></p>
<blockquote> <p>測試nginx是否安裝成功 ip:port 若是出現如下界面說明安裝成功 <br> <img src="https://img-blog.csdn.net/20170527154230295?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="nginx配置成功" title=""></p> </blockquote>
<h2 id="配置rtmp"><a name="t3"></a>配置rtmp</h2>
<blockquote> <p>在nginx配置文件中配置rtmp服務,記住rtmp服務是和http服務是平級的,因此咱們須要在和http配置平級的位置另起rtmp服務</p> </blockquote>
<pre class="prettyprint" name="code"><code class="hljs livecodeserver has-numbering" onclick="mdcp.signin(event)">vi /usr/<span class="hljs-built_in">local</span>/nginx/conf/nginx.conf <span class="hljs-comment">#修改配置文件</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<blockquote> <p>在配置文件末尾加入如下內容(括號嵌套切記不要弄混)</p> </blockquote>
<pre class="prettyprint" name="code"><code class="hljs coffeescript has-numbering" onclick="mdcp.signin(event)"><span class="hljs-comment"># rtmp config</span> rtmp { server { listen <span class="hljs-number">1935</span>; chunk_size <span class="hljs-number">4096</span>; application live { live <span class="hljs-literal">on</span>; record <span class="hljs-literal">off</span>; } application live2 { live <span class="hljs-literal">on</span>; record <span class="hljs-literal">off</span>; } application vod { play /<span class="hljs-reserved">var</span>/flvs; } application vod_http { play <span class="hljs-attribute">http</span>:<span class="hljs-regexp">//</span>服務器的ip/vod; } application hls { live <span class="hljs-literal">on</span>; hls <span class="hljs-literal">on</span>; hls_path /tmp/hls; } } }<div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<pre class="prettyprint" name="code"><code class="hljs bash has-numbering" onclick="mdcp.signin(event)">/usr/local/nginx/sbin/nginx <span class="hljs-operator">-s</span> reload <span class="hljs-comment">#修改配置文件重啓nginx服務</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<h3 id="測試rtmp端口是否通"><a name="t4"></a>測試rtmp端口是否通</h3>
<blockquote> <p>端口放行須要有三個條件,1.雲服務的安全組放行;2.防火牆iptables放行;3.服務自己放行</p> </blockquote>
<p><strong><em>安全組</em></strong> </p>
<blockquote> <p>登陸雲服務器控制檯進行設置 <br> <img src="https://img-blog.csdn.net/20170527160627321?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="雲服務器放行的端口" title=""></p> </blockquote>
<p><strong><em>防火牆</em></strong></p>
<pre class="prettyprint" name="code"><code class="hljs perl has-numbering" onclick="mdcp.signin(event)">iptables -I INPUT -p tcp -<span class="hljs-keyword">m</span> <span class="hljs-keyword">state</span> --<span class="hljs-keyword">state</span> NEW --dport <span class="hljs-number">1935</span> -j ACCEPT <span class="hljs-comment">#放行1935端口的 NEW狀態請求</span> service iptables save <span class="hljs-comment">#保存規則</span> service iptables restart <span class="hljs-comment">#重啓防火牆保證新的規則加載進來</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<p><img src="https://img-blog.csdn.net/20170527160936526?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="新加入的規則" title=""></p>
<p><strong><em>服務自己</em></strong></p>
<blockquote> <p>因爲nginx服務咱們已經配置過1935端口,因此是放行狀態的,咱們能夠在windows本地使用telnet 命令測試端口是否通</p> </blockquote>
<p><img src="https://img-blog.csdn.net/20170527161232667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="telnet測試端口" title=""></p>
<blockquote> <p>若是出現一下界面說明端口已經通了 <br> <img src="https://img-blog.csdn.net/20170527161607638?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="這裏寫圖片描述" title=""></p> </blockquote>
<hr>
<h2 id="使obs推流"><a name="t5"></a>使OBS推流</h2>
<blockquote> <p>OBS(Open Broadcaster Software) 是以互聯網流媒體直播內容爲目的免費和開放源碼軟件。須要下載這個軟件,藉助這個軟件進行推流(電腦沒有攝像頭的貌似安裝不了。。。)</p>
<p>就長這個樣子 <br> <img src="https://img-blog.csdn.net/20170527162301459?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="這裏寫圖片描述" title=""></p>
<p>打開後咱們須要有一個場景,而且在這個場景下有一個流的來源(能夠是窗口,若是選的是視頻則會自動識別攝像頭),接下來就是設置了</p> </blockquote>
<p><img src="https://img-blog.csdn.net/20170527162713622?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="這裏寫圖片描述" title=""></p>
<blockquote> <p>在配置中最須要關注的就是流的配置了,因爲是自建的流媒體服務器因此咱們照這樣配置</p> </blockquote>
<pre class="prettyprint" name="code"><code class="hljs ruby has-numbering" onclick="mdcp.signin(event)"><span class="hljs-symbol">rtmp:</span>/<span class="hljs-regexp">/你的服務器ip:端口(1935)/live</span> <span class="hljs-comment">#URL填寫流的地址</span><div class="hljs-button signin" data-title="登陸後複製"></div></code></pre>
<p><img src="https://img-blog.csdn.net/20170527163036334?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="這裏寫圖片描述" title=""></p>
<blockquote> <p>設置完成咱們就能夠 開始推流了</p> </blockquote>
<h3 id="拉流測試地址"><a name="t6"></a>拉流測試地址</h3>
<blockquote> <p>推薦一個拉流的測試地址,裏面針對各類協議都能測試<a href="https://www.wowza.com/testplayers" rel="nofollow" target="_blank">拉流測試</a>,須要注意圖中幾個地方,因爲咱們使用的rtmp協議,咱們選擇這一欄,底下填寫咱們推流的地址和咱們在上面obs的設置裏面配置的流的名稱,start, ok搞定!!!!</p> </blockquote>
<p><img src="https://img-blog.csdn.net/20170527163539696?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXpjc3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="這裏寫圖片描述" title=""></p>
<hr>
<h2 id="總結"><a name="t7"></a>總結</h2>
<blockquote> <p>本文用nginx做爲服務器,使用rtmp協議簡述了的搭建了一個流媒體服務器的過程,而且描述了一個簡單的測試流程。其中調試端口的可用性,安裝過程服務的依賴處理,修改配置須要重啓服務,是常見的問題,須要特別注意。</p>
<p>筆者也是第一次搭建,不足之處,歡迎留言,一塊兒交流!</p> </blockquote> </div>