搭建Nginx+RTMP/HLS视频直播服务器

安装环境,macos-10.13.4
nginx-1.12.2

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

 sudo brew install nginx

2. 查看 nginx 版本

 nginx -v

3. 启动 nginx

 sudo nginx  

也可以使用下面的命令启动,但是配置文件nginx.conf修改后用这个命令执行不生效,故不建议使用:

 sudo brew services start nginx

4. 查看 nginx 是否启动成功

在浏览器中访问 http://localhost:8080,如果出现如下界面,则说明启动成功.

这里写图片描述

备注:端口号是在配置文件 nginx.conf 里面配置的,默认端口是 8080 ,配置文件的位置 /usr/local/etc/nginx

5. 关闭nginx

 sudo nginx -s stop

也可以使用下面的命令启动,但是配置文件nginx.conf修改后用这个命令执行不生效,故不建议使用:

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 文件里的端口号

  • 权限不够

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

    解决方法:在命令前加上 sudo,这时可能会要求输入密码,密码就是电脑的开机密码啦~

补充

安装 homebrew ,将以上命令粘贴至terminal,然后回车即可

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

一些问题的处理

如果你输入http://localhost:8080后能看到nginx配置的首页那说明OK。

或nginx -v看下版本号。都能确保装上.

下面是在挂装rtmp模块时出现的问题处理。

安装命令见:https://blog.csdn.net/leonpengweicn/article/details/44917943

安装tap时:brew tap homebrew/nginx 报was deprecated.

报下面这个错

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.

并不那么顺利,根查原因是因为homebrew/nginx的git路径变了。因此后面找到一个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)

装好这个本以为就可以直接装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?详细看错误有一句 please 'brew unlink nginx ' before continuing.

因此在执行装rtmp时先执行 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配置开始,这个配置为了`客户端`能够以http协议获取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配置结束  

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支持结束  
89.  }  
90.  }  

有关rtmp的配置项看这个:https://www.cnblogs.com/lidabo/p/7099501.html

配置好之后要记得 nginx -s reload 重新加载配置。

之后就可以使用ffmpeg+vlc 进行推流测试了。(经试推流过一段时间会有Broken pipe)还在百度中,希望能找到吧。

安装FFmpeg

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

brew install ffmpeg

2)当命令结束之后,输入以下命令(查看你的安装ffmpeg的信息):

brew info ffmpeg

输出的结果如下:

image.png

图片中有好多库,例如ffac,fontconfig,freetype等等,有红叉的代表是没有这个库,有绿色的对勾的表示此库已经安装上了。想要知道怎么安装其他的依赖库吗?就看下面命令行。

更新ffmpeg,输入以下命令行:

brew update 

或者:

brew upgrade ffmpeg

安装某一个特定的库如下格式:

brew install [FORMULA...]

例如:安装openssl 库输入以下命令:

brew install openssl

image.png

卸载某个特定的库如下格式:

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

输入命令行后,暂时先不要点回车,等设置好本地拉流后,再进行推流。

2.本地拉流MP4文件

  • 打开VLC播放器
image
  • 设置播放地址
image
  • 设置拉流地址

    rtmp://localhost:1935/rtmplive/home
    
    image
  • 开始推流,点击open后开始播放。

image

推流成功!

三、用ffmpeg推流桌面以及推流摄像头进行直播

1.如果希望将桌面录制或者分享,可以使用命令行如下:

ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/rtmplive/home
  • 这个只能够推桌面。

2.如果需要桌面+麦克风,比如一般做远程教育分享 命令行如下:

ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/home
  • 这个可以推桌面+麦克风。

3.如果需要桌面+麦克风,并且还要摄像头拍摄到自己,比如一般用于互动主播,游戏主播,命令行如下

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
  • 这个可以推桌面+麦克风,并且摄像头把人头放在界面下面
image

四、FFmpeg常用基本命令

1.分离视频音频流

ffmpeg -i input_file -vcodec copy -an output_file_video  //分离视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio  //分离音频流

2.视频解复用

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

3.视频转码

ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //转码为封装文件
  • -bf B帧数目控制
  • -g 关键帧间隔控制
  • -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 开始时间
  • -t 持续时间

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序列转AVI

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

9.常用参数说明:

主要参数:
i 设定输入流
f 设定输出格式
ss 开始时间
视频参数:
b 设定视频流量,默认为200Kbit/s-r 设定帧速率,默认为25
s 设定画面的宽与高-aspect 设定画面的比例
vn 不处理视频-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
ar 设定采样率
ac 设定声音的Channel数
acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器an 不处理音频

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容