分享

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

 WindySky 2017-08-02

一,目标:

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


二,技术选型:

视音频源端:: 

Adobe Flash Media Live Encoder 3.2,可以在windowsmac安装;

如果你已有一些支持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的,而且nginxwindows下的性能比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:///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./static/download/jwplayer-6.10.zip (需要注册登录后才可以下载),将其解压到nginx/html下;

 

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

[html] view plain copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  2.      "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html xmlns="http://www./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: 视频编码格式,只支持H264VP6,我们选择H264就好;

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

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

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

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

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

Device: 麦克风

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

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 参数BitRateOutput Size,相应调小些,同时也可以将AudioSample RateBit Rate调小;

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

 

五,后续

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

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

如何在移动端观看直播?

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

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

 



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多