张科的技术博客

折腾是一种态度

嗨,我是张科(@GarfieldLover),搜狐视频iOS开发者。


这是我用来记录实践和填坑经验心得的地方,欢迎您的访问。


iOS直播app个人实践--推流

如果不了解原理,可以看这篇文章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安装成功了

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发送帧

librtmp发送帧2

librtmp发送帧

断线重连

断线重连