搭建Nginx+RTMP/HLS視頻直播服務(wù)器

安裝環(huán)境助币,macos-10.13.4
nginx-1.12.2

1. 安裝(可以用 brew 安裝)

 sudo brew install nginx

2. 查看 nginx 版本

 nginx -v

3. 啟動 nginx

 sudo nginx  

也可以使用下面的命令啟動眉菱,但是配置文件nginx.conf修改后用這個(gè)命令執(zhí)行不生效俭缓,故不建議使用:

 sudo brew services start nginx

4. 查看 nginx 是否啟動成功

在瀏覽器中訪問 http://localhost:8080华坦,如果出現(xiàn)如下界面不从,則說明啟動成功.

這里寫圖片描述

備注:端口號是在配置文件 nginx.conf 里面配置的歹袁,默認(rèn)端口是 8080 ,配置文件的位置 /usr/local/etc/nginx

5. 關(guān)閉nginx

 sudo nginx -s stop

也可以使用下面的命令啟動枫耳,但是配置文件nginx.conf修改后用這個(gè)命令執(zhí)行不生效嘉涌,故不建議使用:

sudo brew services stop nginx

6. 重新加載nginx

sudo nginx -s reload

7. 可能遇到的問題

  • 端口被占用

    nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)

    解決方法:修改 nginx.conf 文件里的端口號

  • 權(quán)限不夠

    nginx: [alert] could not open error log file: open() “/usr/local/var/log/nginx/error.log” failed (13: Permission denied)

    解決方法:在命令前加上 sudo仑最,這時(shí)可能會要求輸入密碼警医,密碼就是電腦的開機(jī)密碼啦~

補(bǔ)充

安裝 homebrew 预皇,將以上命令粘貼至terminal婉刀,然后回車即可

 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

一些問題的處理

如果你輸入http://localhost:8080后能看到nginx配置的首頁那說明OK突颊。

或nginx -v看下版本號律秃。都能確保裝上.

下面是在掛裝rtmp模塊時(shí)出現(xiàn)的問題處理棒动。

安裝命令見:https://blog.csdn.net/leonpengweicn/article/details/44917943

安裝tap時(shí):brew tap homebrew/nginx 報(bào)was deprecated.

報(bào)下面這個(gè)錯(cuò)

Updating Homebrew...

==> **Auto-updated Homebrew!**

Updated 1 tap (homebrew/core).

==> **Updated Formulae**

abyss               docker2aci          libhttpseverywhere  subversion

amqp-cpp            emscripten          mypy                tup

chronograf          grpc                packmol             znapzend

dnscrypt-proxy      influxdb            rancher-cli

Error: homebrew/nginx was deprecated. This tap is now empty as all its formulae were migrated.

并不那么順利船惨,根查原因是因?yàn)閔omebrew/nginx的git路徑變了粱锐。因此后面找到一個(gè)denji/nginx的卜范。

把命令改為 brew tap denji/nginx

fsh-mac--00-24-D6-72-E4-6A:~ fengsh$ brew tap denji/nginx

Updating Homebrew...

==> **Tapping denji/nginx**

Cloning into '/usr/local/Homebrew/Library/Taps/denji/homebrew-nginx'...

remote: Counting objects: 72, done.

remote: Compressing objects: 100% (72/72), done.

remote: Total 72 (delta 1), reused 28 (delta 0), pack-reused 0

Unpacking objects: 100% (72/72), done.

Tapped 62 formulae (162 files, 130.2KB)

裝好這個(gè)本以為就可以直接裝rtmp模塊了。

直接裝rtmp命令 : brew install nginx-full --with-rtmp-module

fsh-mac--00-24-D6-72-E4-6A:~ fengsh$ brew install nginx-full --with-rtmp-module

==> **Installing nginx-full from denji/nginx**

Error: Cannot install denji/nginx/nginx-full because conflicting formulae are installed.

  nginx: because nginx-full symlink with the name for compatibility with nginx

Please `brew unlink nginx` before continuing.

Unlinking removes a formula's symlinks from /usr/local. You can

link the formula again after the install finishes. You can --force this

install, but the build may fail or cause obscure side-effects in the

resulting software.

又出問題了舱殿,denji的git下沒有nginx-full沪袭?詳細(xì)看錯(cuò)誤有一句 please 'brew unlink nginx ' before continuing.

因此在執(zhí)行裝rtmp時(shí)先執(zhí)行 brew unlink nginx 再來安裝冈绊,最后成功了死宣。

fsh-mac--00-24-D6-72-E4-6A:~ fengsh$ brew unlink nginx

Unlinking /usr/local/Cellar/nginx/1.13.12... 2 symlinks removed

fsh-mac--00-24-D6-72-E4-6A:~ fengsh$ brew install nginx-full --with-rtmp-module

Updating Homebrew...

==> **Installing nginx-full from denji/nginx**

==> **Installing dependencies for denji/nginx/nginx-full: ****rtmp-nginx-module**

==> **Installing denji/nginx/nginx-full dependency: ****rtmp-nginx-module**

==> **Downloading https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/archive**

==> **Downloading from https://codeload.github.com/sergey-dryabzhinsky/nginx-rtmp-**

######################################################################## 100.0%

==> **Downloading https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/compare**

######################################################################## 100.0%

==> **Patching**

==> **Applying v1.1.7.10...d25c56f.diff**

patching file .gitignore

patching file README.md

patching file config

patching file dash/ngx_rtmp_dash_module.c

patching file doc/README.md

patching file doc/directives.md

patching file hls/ngx_rtmp_hls_module.c

patching file hls/ngx_rtmp_mpegts.c

patching file hls/ngx_rtmp_mpegts.h

patching file hls/ngx_rtmp_mpegts_crc.c

patching file hls/ngx_rtmp_mpegts_crc.h

patching file ngx_rtmp.c

patching file ngx_rtmp_auto_push_module.c

patching file ngx_rtmp_cmd_module.h

patching file ngx_rtmp_codec_module.c

patching file ngx_rtmp_core_module.c

patching file ngx_rtmp_exec_module.c

patching file ngx_rtmp_handshake.c

patching file ngx_rtmp_live_module.c

patching file ngx_rtmp_live_module.h

patching file ngx_rtmp_netcall_module.c

patching file ngx_rtmp_notify_module.c

patching file ngx_rtmp_record_module.c

patching file ngx_rtmp_record_module.h

patching file ngx_rtmp_shared.c

patching file ngx_rtmp_version.h

配置文件 open /usr/local/etc/nginx 下的nginx.conf

**[plain]** [view plain](https://blog.csdn.net/fengsh998/article/details/79942775# "view plain")[copy](https://blog.csdn.net/fengsh998/article/details/79942775# "copy")

<embed id="ZeroClipboardMovie_1" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=16&amp;height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: break-all;">

<embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=16&amp;height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: break-all;"> 

1.  #user  nobody;  
2.  worker_processes  1;  

4.  events {  
5.  worker_connections  1024;  
6.  }  

9.  http {  
10.  include       mime.types;  
11.  default_type  application/octet-stream;  

13.  sendfile        on;  

15.  keepalive_timeout  65;  
16.  server {  
17.  listen       8080;  
18.  server_name  localhost;  

20.  #charset koi8-r;  

22.  #access_log  logs/host.access.log  main;  

24.  location / {  
25.  root   html;  
26.  index  index.html index.htm;  
27.  }  

29.  #配置rtmp stat  
30.  location /stat {  
31.  rtmp_stat all;  
32.  rtmp_stat_stylesheet stat.xsl;  
33.  }  
34.  location /stat.xsl {  
35.  root /usr/local/Cellar/rtmp-nginx-module/1.1.7.11-dev_2/share/rtmp-nginx-module;  
36.  }  

38.  location /control {  
39.  rtmp_control all;  
40.  }  

42.  #HLS配置開始,這個(gè)配置為了`客戶端`能夠以http協(xié)議獲取HLS的拉流  
43.  location /hls {  
44.  # Serve HLS fragments  
45.  types {  
46.  application/vnd.apple.mpegurl m3u8;  
47.  video/mp2t ts;  
48.  }  
49.  root html;  
50.  add_header Cache-Control no-cache;  
51.  }  
52.  #HLS配置結(jié)束  

54.  #error_page  404              /404.html;  

56.  # redirect server error pages to the static page /50x.html  
57.  #  
58.  error_page   500 502 503 504  /50x.html;  
59.  location = /50x.html {  
60.  root   html;  
61.  }  
62.  }  

66.  include servers/*;  
67.  }  

69.  rtmp {  
70.  server {  
71.  listen 1935;  
72.  ping 30s;  
73.  notify_method get;  

75.  application myapp {  
76.  live on;  
77.  record off;  
78.  max_connections 1024;  
79.  }  

81.  #增加對HLS支持開始  
82.  application hls {  
83.  live on;  
84.  hls on;  
85.  hls_path /usr/local/var/www/hls;  
86.  hls_fragment 5s;  
87.  }  
88.  #增加對HLS支持結(jié)束  
89.  }  
90.  }  

有關(guān)rtmp的配置項(xiàng)看這個(gè):https://www.cnblogs.com/lidabo/p/7099501.html

配置好之后要記得 nginx -s reload 重新加載配置眶掌。

之后就可以使用ffmpeg+vlc 進(jìn)行推流測試了朴爬。(經(jīng)試推流過一段時(shí)間會有Broken pipe)還在百度中橡淆,希望能找到吧明垢。

安裝FFmpeg

1)利用上面的homebrew安裝FFmpeg:

brew install ffmpeg

2)當(dāng)命令結(jié)束之后痊银,輸入以下命令(查看你的安裝ffmpeg的信息):

brew info ffmpeg

輸出的結(jié)果如下:

image.png

圖片中有好多庫溯革,例如ffac致稀,fontconfig抖单,freetype等等,有紅叉的代表是沒有這個(gè)庫耍休,有綠色的對勾的表示此庫已經(jīng)安裝上了羊精。想要知道怎么安裝其他的依賴庫嗎喧锦?就看下面命令行抓督。

更新ffmpeg本昏,輸入以下命令行:

brew update 

或者:

brew upgrade ffmpeg

安裝某一個(gè)特定的庫如下格式:

brew install [FORMULA...]

例如:安裝openssl 庫輸入以下命令:

brew install openssl

image.png

卸載某個(gè)特定的庫如下格式:

brew uninstall [FORMULA...]

例如:卸載openssl庫輸入以下命令:

brew uninstall openssl

推流測試

二怔昨、FFmpeg推流

1.推流MP4文件

  • 視頻文件地址:/Users/xu/Desktop/bangbangbang.mp4

  • 推流拉流地址:rtmp://localhost:1935/rtmplive/home

  • acc:RTMP的音頻格式

  • flv: RTMP的視頻格式

    ffmpeg -re -i /Users/xu/Desktop/bangbangbang.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home
    
image

輸入命令行后趁舀,暫時(shí)先不要點(diǎn)回車矮烹,等設(shè)置好本地拉流后奉狈,再進(jìn)行推流涩惑。

2.本地拉流MP4文件

  • 打開VLC播放器
image
  • 設(shè)置播放地址
image
  • 設(shè)置拉流地址

    rtmp://localhost:1935/rtmplive/home
    
    image
  • 開始推流,點(diǎn)擊open后開始播放赊级。

image

推流成功!

三理逊、用ffmpeg推流桌面以及推流攝像頭進(jìn)行直播

1.如果希望將桌面錄制或者分享挡鞍,可以使用命令行如下:

ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/rtmplive/home
  • 這個(gè)只能夠推桌面。

2.如果需要桌面+麥克風(fēng)道媚,比如一般做遠(yuǎn)程教育分享 命令行如下:

ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/home
  • 這個(gè)可以推桌面+麥克風(fēng)最域。

3.如果需要桌面+麥克風(fēng)镀脂,并且還要攝像頭拍攝到自己忘伞,比如一般用于互動主播氓奈,游戲主播舀奶,命令行如下

ffmpeg -f avfoundation -framerate 30 -i "1:0" \-f avfoundation -framerate 30 -video_size 640x480 -i "0" \-c:v libx264 -preset ultrafast \-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1  -f flv rtmp://localhost:1935/rtmplive/home
  • 這個(gè)可以推桌面+麥克風(fēng)育勺,并且攝像頭把人頭放在界面下面
image

四涧至、FFmpeg常用基本命令

1.分離視頻音頻流

ffmpeg -i input_file -vcodec copy -an output_file_video  //分離視頻流
ffmpeg -i input_file -acodec copy -vn output_file_audio  //分離音頻流

2.視頻解復(fù)用

ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264ffmpeg –i test.avi –vcodec copy –an –f m4v test.264

3.視頻轉(zhuǎn)碼

ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //轉(zhuǎn)碼為碼流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //轉(zhuǎn)碼為碼流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉(zhuǎn)碼為封裝文件
  • -bf B幀數(shù)目控制
  • -g 關(guān)鍵幀間隔控制
  • -s 分辨率控制

4.視頻封裝

ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file

5.視頻剪切

ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切視頻
  • -r 提取圖像的頻率
  • -ss 開始時(shí)間
  • -t 持續(xù)時(shí)間

6.視頻錄制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi

7.YUV序列播放

ffplay -f rawvideo -video_size 1920x1080 input.yuv

8.YUV序列轉(zhuǎn)AVI

ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi

9.常用參數(shù)說明:

主要參數(shù):
i 設(shè)定輸入流
f 設(shè)定輸出格式
ss 開始時(shí)間
視頻參數(shù):
b 設(shè)定視頻流量,默認(rèn)為200Kbit/s-r 設(shè)定幀速率南蓬,默認(rèn)為25
s 設(shè)定畫面的寬與高-aspect 設(shè)定畫面的比例
vn 不處理視頻-vcodec 設(shè)定視頻編解碼器纺非,未設(shè)定時(shí)則使用與輸入流相同的編解碼器
音頻參數(shù):
ar 設(shè)定采樣率
ac 設(shè)定聲音的Channel數(shù)
acodec 設(shè)定聲音編解碼器,未設(shè)定時(shí)則使用與輸入流相同的編解碼器an 不處理音頻

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓖康,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垒手,更是在濱河造成了極大的恐慌蒜焊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件科贬,死亡現(xiàn)場離奇詭異鳖悠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)优妙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門乘综,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人套硼,你說我怎么就攤上這事卡辰。” “怎么了邪意?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵九妈,是天一觀的道長。 經(jīng)常有香客問我雾鬼,道長萌朱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任策菜,我火速辦了婚禮晶疼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘又憨。我一直安慰自己翠霍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布竟块。 她就那樣靜靜地躺著壶运,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浪秘。 梳的紋絲不亂的頭發(fā)上蒋情,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音耸携,去河邊找鬼棵癣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夺衍,可吹牛的內(nèi)容都是我干的狈谊。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼沟沙,長吁一口氣:“原來是場噩夢啊……” “哼河劝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矛紫,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤赎瞎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后颊咬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體务甥,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牡辽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敞临。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片态辛。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挺尿,靈堂內(nèi)的尸體忽然破棺而出奏黑,到底是詐尸還是另有隱情,我是刑警寧澤票髓,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布攀涵,位于F島的核電站,受9級特大地震影響洽沟,放射性物質(zhì)發(fā)生泄漏以故。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一裆操、第九天 我趴在偏房一處隱蔽的房頂上張望怒详。 院中可真熱鬧,春花似錦踪区、人聲如沸昆烁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静尼。三九已至,卻和暖如春传泊,著一層夾襖步出監(jiān)牢的瞬間鼠渺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工眷细, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拦盹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓溪椎,卻偏偏與公主長得像普舆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子校读,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容