如果不了解原理,可以看这篇文章iOS直播app个人实践–原理。
开发一款直播app,需要流媒体服务器,本篇主要讲解直播中流媒体服务器搭建,下边介绍常用功能。
一、nginx
nginx是非常优秀的HTTP开源服务器,其特点是占有内存少,并发能力强,用它来做hls或者rtmp流媒体服务器是非常不错的选择。
1.1、安装Homebrow
查看是否已经安装
man brew
执行安装命令
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
卸载命令
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
1.2、安装nginx
先clone nginx项目到本地:
brew tap homebrew/nginx
执行安装:
brew install nginx-full --with-rtmp-module
nginx安装位置
brew info nginx-full
nginx安装所在位置
/usr/local/Cellar/nginx-full/1.10.1/bin/nginx
nginx配置文件所在位置
/usr/local/etc/nginx/nginx.conf
1.3、运行nginx
执行命令 ,测试下是否能成功启动nginx服务
nginx
在浏览器地址栏输入:http://localhost:8080 如果出现,代表nginx安装成功了
如果终端上提示,则表示8080端口被占用了
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
查看8080端口PID
lsof -i tcp:8080
kill掉占用8080端口的PID,然后重新执行nginx
kill 9603(这里替换成占用8080端口的PID)
重新加载配置文件
nginx -s reload
停止 nginx
nginx -s stop
有序退出 nginx
nginx -s quit
1.4、配置rtmp
现在我们来修改nginx.conf这个配置文件,配置rtmp。打开Finder Shift + command + G前往,用记事本工具打开nginx.conf。
在http节点后面加上rtmp配置。
rtmp {
server {
listen 1935;
#直播流配置
application rtmplive {
live on;
#为 rtmp 引擎设置最大连接数。默认为 off
max_connections 1024;
}
application hls{
live on;
hls on;
hls_path /usr/local/var/www/hls;
hls_fragment 1s;
}
}
}
1.5、推流及观看
推流地址,本机ip
rtmp://10.2.130.88/rtmplive/livestream
1.5.1、安装ffmepg进行推流(未实际操作😄)
brew install ffmpeg
抓取桌面和摄像头进行推流
ffmpeg -f avfoundation -framerate 30 -i "1:0" -f avfoundation -framerate 30 -video_size 640x480 -i "0" -c:v libx264 -preset slow -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://10.2.130.88/rtmplive/livestream
1.5.2、LFLiveKit进行推流
详情见github代码。
1.5.3、Mac播放
安装VLC开源播放器测试推流数据。
1.6、nginx转码封装问题
只实现了推流,hls播放流和flv播放流没有测试成功,很可能是我的配置问题。 后来使用了国人开源的SRS服务器方案得到很好解决。
二、SRS
SRS定位是运营级的互联网直播服务器集群,SRS提供了丰富的接入方案将RTMP流接入SRS。还支持将接入的RTMP流进行各种变换,譬如将RTMP流转码、转发给其他服务器、转封装成HTTP-FLV流、转封装成HLS、转封装成HDS、录制成FLV。
2.1、获取SRS
git clone https://github.com/ossrs/srs
cd srs/trunk
2.2、编译SRS
./configure --disable-all \
--with-hls --with-ssl --with-http-server \
--with-http-api --osx &&
make
2.3、编写SRS配置文件
将以下内容保存为文件,譬如conf/http.flv.live.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。
# conf/http.flv.live.conf
listen 1935;
max_connections 1000;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
hstrs on;
}
}
2.4、启动SRS
./objs/srs -c conf/http.flv.live.conf
生成的流地址为:
- RTMP流地址为:rtmp://10.2.9.115/live/livestream
- HTTP FLV: http://10.2.9.115:8080/live/livestream.flv
2.5、启动推流编码器
使用FFMPEG命令推流:
for((;;)); do \
./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
-vcodec copy -acodec copy \
-f flv -y rtmp://10.2.9.115/live/livestream; \
sleep 1; \
done
2.6、观看RTMP流
可以使用VLC观看,或者使用在线SRS播放器播放:srs-player 备注:请将所有实例的IP地址10.2.9.115都换成部署的服务器IP地址。
2.7、观看FLV流
HTTP FLV流地址:http://10.2.9.115:8080/live/livestream.flv, 可以使用VLC观看,或者使用在线SRS播放器播放:jwplayer-flv
备注:请将所有实例的IP地址10.2.9.115都换成部署的服务器IP地址。
2.8、LFLiveKit进行推流
详情见github代码。
三、LFLivekit捕获推流详解(重点😄😄)
LFLivekit中如何捕获视频和推流的。
3.1、LFLivekit流程
3.2、音视频捕获
开启视频捕获
开启音频捕获
美颜
视频硬编码
音频转码
3.3、rtmp传输
librtmp发送帧
librtmp发送帧2
断线重连