[实战]利用RTMP实现直播系统

一,目标:

利用开源或者免费工具实现一个直播系统;同时支持在浏览器、播放器和嵌入到PC应用或者移动APP中观看直播。

 

二,技术选型:

视音频源端:: 

Adobe Flash Media Live Encoder 3.2,可以在windows和mac安装;

如果你已有一些支持RTMP的采集设备,那是最好了;

或许你想在自己的应用中实现,这样你就必须自己开发处理采集,编码和协议传输了(以后再表;

 

RTMP Server:

FMS -- Adobe公司出品的服务器,价格昂贵,当然是最正宗的,因为RTMP就是Adobe公司的私有协议;

Wowza -- 同样需要授权费, 大概是$55 per month/instance,效率和稳定性都还不错;

Red5 -- 一个开源实现, 效率和稳定性都稍微差些,由于它是java实现的,所以天生支持跨平台运行;

Nignx-rtmp-module - -nginx的一个第三方模块,如果你熟悉nginx那是不错的选择,当然它也是免费的,不过功能就没有其他几个丰富了;

这里我选择nginx+nginx-rtmp-module作为服务器,这是我认为最容易上手的一种方式了(如果你把windows作为服务器那可能麻烦些, 官方提供的windows二进制版本是没有nignx-rtmp-module的,而且nginx在windows下的性能比linux就差太多了)

 

客户端:

Flash Player VLC  也可以安装其他支持rtmp的播放器;

JW Media Player 一个开源的flash视音频播放器,利用它我们可以直接在浏览器观看直播;(移动端的浏览器是不知道flash的)

ffmpge/librtmp  如果你希望在自己的应用中实现播放器,或者希望在移动端直接接收RTMP流,那就要自己开发了(以后再表)

 

最后选型是: Adobe Flash Media Live Encoder 3.2 + Nignx-rtmp-module + JW Media Player

 

三,实现

(本文将nginx 安装到Centos 6.5 下,IP 为192.168.0.51)

1,下载安装 Adobe Flash Media Live Encoder 3.2

2,编译安装配置nginx + nginx-rtmp-module (nginx 1.7 无法编译通过)

#wget http://nginx.org/download/nginx-1.6.2.tar.gz

#tar -zxvf nginx-1.6.2.tar.gz

#git clone https://github.com/arut/nginx-rtmp-module.git (如果没有安装git则直接下载zip包)

#cd nginx-1.6.2

#./configure --add-module=../nginx-rtmp-module --with-http_ssl_module

#make

#make install

 

配置(详细查看https://github.com/arut/nginx-rtmp-module), 编辑nginx/nginx.conf,增加rtmp模块:

rtmp {

     server {

listen 1935;

chunk_size 4000;

#可以将mylive改成你想要的名字

application mylive {

live on;

}

    }

}

 

在http模块增加:

location /stat{

    rtmp_stat all;

    rtmp_stat_stylesheet stat.xsl;

}

 

location /stat.xsl{

     root html;

}

同时需要将nginx-rtmp-module源码目录下的stat.xsl拷贝到nginx/html下,这样就可以通过网页查看服务器的RTMP状态了。

 

启动nginx

 

3,下载免费版本JW player: https://account.jwplayer.com/static/download/jwplayer-6.10.zip (需要注册登录后才可以下载),将其解压到nginx/html下;

 

4,编写live.html,保存到nginx/html下;

 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

  4. <head>

  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />

  6. <title>live-player</title>

  7. <style type="text/css">

  8. </style>

  9. </head>

  10. <body>

  11. <script type='text/javascript' src='jwplayer/jwplayer.js'></script>

  12. <center>

  13. <b>RTMP直播系统</b>

  14. <div id='mediaspace'>This text will be replaced</div>

  15. <script type='text/javascript'>

  16. var server = window.location.hostname;

  17. // mylive 对应nginx.conf配置项application的名字

  18. // live_stream 对应Adobe Flash Stream Media Live Encoder配置的stream名称

  19. var live_url = 'rtmp://' + server + '/mylive' + '/live_stream';

  20. jwplayer('mediaspace').setup({

  21. 'flashplayer': 'jwplayer/jwplayer.flash.swf',

  22. 'file': live_url,

  23. 'controlbar': 'bottom',

  24. 'width': '760',

  25. 'height': '428',

  26. //autostart: true, //如果打开此标志,在打开网页时会自动播放直播流

  27. });

  28. </script>

  29. </body>

  30. </html>

 

这时候我们在浏览器输入http://192.168.0.51/live.html:

 

5, Adobe Flash Media Live Encoder使用

 

A, 在FMS URL填写RTMP服务器地址,mylive则是我们在nginx.conf配置的rtmp application的名字(根据自己的配置填写);

B,  在Stream填写流的名字,这个名字相当是一个文件的名字,填写好后必须修改live.html的配置;

这时候我们按“Connect”,如果没有提示错误则表示连接服务器成功了,如果提示错误,则要检查服务器是否运行,是否已配置了rtmp模块相关属性,尤其是application名字是否相对应。

C, 在Video 栏配置视频相关属性

Device: 表示摄像头信息,如果有多个摄像头,则可以通过选择切换;

Format: 视频编码格式,只支持H264和VP6,我们选择H264就好;

Frame Rate: 帧率,如果越大则视频会更流畅和清晰,但同时也会对码流有影响;

Input Size: 摄像头采集的分辨率,我们最好是按摄像头最好的分辨率设置;

BitRate: 码流,越大占的带宽就越多,最好根据输出分辨率和网络来调节,如果分辨率大,而码流小则图像就会比较模糊,如果在网络不好的状况可以降低码流来保证流畅度;

Output Size: 编码输出分辨率,这个会影响码流和图像质量;

D,在Audio栏配置音频相关属性

Device: 麦克风

Format: 音频编码格式,一般有MP3和AAC,在不同平台不一样,我在windows下只有MP3,在mac下MP3和AAC都有;

Channels: 声道,Mono 单声道,Stereo 双声道,根据自己的采集设备进行选择;

Sample Rate: 声音采样率,一般是越大采集出来的声音会越清晰,但同时会影响到码流;

Bit Rate: 码流,类似视频的Bit Rate;

 

但我们都设置好了就可以点击“start”进行直播了,此时我们再点击http://192.168.0.51/live.html 页面的播放按钮,在3s左右后就会看到直播画面;

 

在我的实测中(局域网和Intenet都有测试),一般都在1-3s之间的延迟;

 

 

四,问题和解决

1,在你检查了N遍参数都正确后,视频一直在loading状态或者失败了,那请你检查一下服务器的防火墙是否开放1935端口;

2,视频很卡,则可以将video 参数BitRate和Output Size,相应调小些,同时也可以将Audio的Sample Rate和Bit Rate调小;

3,没有声音,可以通过切换audio参数的Format试试;

 

五,后续

通过现有的工具,然后几行代码,我们就可以实现一个简单的直播系统了,但离我们的生产环境还是有差距的,也许我们有那么几个疑问:

服务器可以支持多少并发,性能如何?

如何在移动端观看直播?

如何在自己的应用程序支持像Adobe Media Live Encode一样的功能?

如何在自己的应用程序直接接收RTMP流?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值