现在直播非常火爆,可以从PC或手机直播,然后从PC或是手机或是 支持HTML5的浏览器 收看。但是,你知道直播平台后面的技术和实现原理码?

正好去年过年的时候,一个朋友破解了AirPlay和Chromecast协议,然后开发了一套技术能够截获和播放任何手机(iOS或是Android)屏幕上的任何内容。想到的第一个应用是做一个 直播的直播服务 ( 如有感兴趣的投资人,可以联系 )。比如,通过屏幕直播,你可以邀请朋友看你正在看的直播的电影,球赛,演唱会,晚会,不管是免费的还是付费的。当初的想法是将屏幕的内容,通过AirPlay或Chromecast,推送到后台服务器,然后,受邀的朋友就可以从浏览器或是其它视频播放器观看了。为此,我们搭建和开发了一个直播平台,现在把我们实现的过程记录下来和大家共享。

首先,视频有它的播放协议。原则上,RTSP,RTMP,HTTP都可以做直播和点播,但一般做直播用RTSP和RTMP,做点播用HTTP。我们选用的是RTMP协议。

RTMP 协议

RTMP(Real Time Message Protocol/实时信息传输协议)是应用层协议,靠底层传输层协议(通常是TCP)来保证信息传输的可靠性的。在TCP链接建立后,RTMP协议也要客户端和服务器通过“握手”来建立RTMP Connection,然后在Connection上传输控制信息。RTMP协议传输时会对数据格式化,而实际传输的时候为了更好地实现多路复用、分包和信息的公平性,发送端会把Message划分为带有Message ID的Chunk,每个Chunk可能是一个单独的Message,也可能是Message的一部分,在接受端会根据Chunk中包含的data的长度,message id和message的长度把chunk还原成完整的Message,从而实现信息的收发。

我们看看两个常用的视频服务。一个是由客户端向服务器发起请求推流到服务器,这个就是直播的播放服务,流程如下。

另一个是由客户端向服务器发起请求从服务器端接受数据,可以多次调用,这就是播放服务。流程如下。

RTMP是直播后面的协议,有很多的开源软件实现了,细节我们不再细说。下面,我们看看怎么搭建后台服务系统。

安装和配置 LEMP

LEMP栈是指Linux(L), NGINX(E), MySQL(M), PHP(P),还记得LAMP吗?LEMP既是将NGINX(E)取代了Apache(A)。

首先,用以下命令安装和启动NGINX web server。

# sudo apt-get update
# sudo apt-get install nginx
# sudo service nginx start

接着,安装MySQL。

# sudo apt-get install mysql-server mysql php5-mysql

接着,安装和配置PHP。

# sudo apt-get install php5-fpm
location ~ .php$ {try_files $uri =404;fastcgi_pass unix:/var/run/php5-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;
}

最后,重新启动NGINX web server。

# sudo service nginx restart

这样,后台的web server设置好了,可以对外提供网页和PHP服务了。但是,NGINX并不支持RTMP协议,我们需要下载,编译,安装和配置RTMP模块。

安装和配置nginx-rtmp-module

首先,下载NGINX的源代码,确保环境下能正确的编译。

# git clone https://github.com/nginx/nginx.git

然后,下载RTMP模块。

# git clone https://github.com/arut/nginx-rtmp-module.git

然后,cd到NGINX的源代码目录,config,make和install 刚才下载的RTMP模块。

# ./configure --add-module=/path/to/nginx-rtmp-module make make install
# make
# make install

最后,在NGINX的配置文件中,加上RTMP相关的配置,并且重新启动NGINX server。

rtmp {server {listen 1935;chunk_size 4000;# HLSapplication hls {live on;hls on;hls_path /tmp/hls;}# MPEG-DASH is similar to HLSapplication dash {live on;dash on;dash_path /tmp/dash;}}
}# HTTP can be used for accessing RTMP stats
http {server {listen      8080;# This URL provides RTMP statistics in XMLlocation /stat {rtmp_stat all;# Use this stylesheet to view XML as web page# in browserrtmp_stat_stylesheet stat.xsl;}location /stat.xsl {# XML stylesheet to view RTMP stats.# Copy stat.xsl wherever you want# and put the full directory path hereroot /path/to/stat.xsl/;}location /hls {# Serve HLS fragmentstypes {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}root /tmp;add_header Cache-Control no-cache;}location /dash {# Serve DASH fragmentsroot /tmp;add_header Cache-Control no-cache;}}
}

其中看到了服务器上视频存储的格式是HLS,下面需要介绍一下这个格式。

HLS(HTTP Live Streaming)

HLS是一个由苹果公司提出的基于HTTP的流媒体网络传输协议,它把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。开始播放时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。工作原理如下。

m3u8 playlist的文件结构,它不是一个单独的文件,而是由一系列文件组成。Index文件和很多的数据文件。

一个m3u8 playlist的index文件内容。

所有的数据文件,以.ts为后缀,存放在同一目录下面。

直播客户端(后面我们要介绍的OBS)将实时视频推送到NGINX的RTMP模块。RTMP模块会根据配置将视频流转换成HLS文件。这时,HLS文件可以使用两种模式播放。一是点播VOD模式,下载当前时间点可以获取到所有index文件和ts文件,并播放。这种模式允许客户端访问全部内容,不一定是实时内容。二是Live 模式,实时生成m3u8和ts文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载index文件,以获得最新生成的ts文件播放视频。一般来说,实况直播时,会有一些延时。下面,来看一个JS实现的HLS player,嵌入到支持HTML5的浏览器就可以播放HLS文件。

HLSPlayer

基于Javascript的HLS Player可以在PC浏览器(IE,Chrome,Firefox,Safari,等),iOS的Safari,Android的Chrome,等等支持HTML5的浏览器上播放。市面上有很多开源的,下面图中是其中的一种,对于不同浏览器的支持都很好。下载以后,按照它给的例子修改HLS的源就可以了。

除了JS的播放器,还有独立的播放器,ffmpeg是广泛使用的一种命令行播放器,支持Windows,Linux,Mac等。

ffmpeg

ffmpeg是一个非常快的视频/音频转换器,也可以现场抓取音频/视频源,并在任意采样率、尺寸之间调整视频,以及提供多种高品质的滤镜系统。ffmpeg从任意数量/形式的输入文件中进行读取,通过输入文件选项对输入文件进行设定,并写入到任意数量/形式的输出文件中。它不但可以对任何格式的音视频文件相互转化,而且可以播放任何格式的音视频文件。它的命令行选项超多,具体细节需要用到时自己去网上搜索和阅读。

例如,下面的命令将一个本地的视频文件movie.avi推送到服务器上可以生成HLS格式的文件。

# ffmpeg -loglevel verbose -re -i movie.avi -vcodec libx264 -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/hls/movie

OBS

OBS(Open Broadcaster Software/开源直播软件),它是目前世界上最火的免费开源直播软件。由于它是免费的,而且质量高,对比其它软件就有天生的优势,很多商业化的直播平台都支持和推荐使用。下面是它的基础界面。

OBS能够讲视频流推送到支持RTMP协议的服务器上,需要进行一些简单的设置。服务器的地址,和流的密钥,这样,可以区分不同的用户,也保证了不同用户的内容安全。

直播平台Demo

基于上面描述的技术和开源系统,我们用PHP实现了一个简单的支持多用户的直播平台。用户可以注册,登录,follow/unfollow,评论,标签,收看,直播(每个用户有自己的直播密钥),等等。

源代码文件目录。

注册界面。

播放和评论界面。

直播使用的是OBS,也可以使用你喜欢的直播移动App,需要设置系统给每个用户提供的密钥。收看时,直接选择用户和他正在播放视频就好了。

直播的精髓都应该讨论到了,如果将系统sharding,分层,SOA化,负载均衡,cache,就可以搭建出一个可扩展的大规模的直播平台。

http://www.open-open.com/lib/view/open1473231814360.html

如何搭建一个属于自己的直播平台?相关推荐

  1. ZEGO教程:如何快速搭建一个完整的Android直播平台

    本文来自即构SDK用户whale的投稿,她是一位资深的Android开发工程师,向我们分享了基于即构SDK,快速搭建一个安卓直播平台的过程. 移动网络的传输速度越来越快,音视频应用产品兴起,有技术实力 ...

  2. 如何快速搭建一个完整的移动直播系统?

    **如何快速搭建一个完整的移动直播系统?** 原文连接:http://toutiao.com/a6301796359717945601/ http://toutiao.com/a62784095597 ...

  3. 如何快速搭建运营级的网络直播平台

    原url: http://blog.csdn.net/bordonliu/article/details/52701204?locationNum=4 如何快速搭建运营级的网络直播平台 网络直播在近两 ...

  4. 从零开始,搭建一个简单的UVM验证平台(一)

    前言: 这篇系列将从0开始搭建一个UVM验证平台,来帮助一些学习了SV和UVM知识,但对搭建完整的验证环境没有概念的朋友. UVM前置基础: 1.UVM基础-factory机制.phase机制 2.U ...

  5. 用Ubuntu和RStudio Server搭建一个R语言的云平台

    前一段介绍过利用Windows系统的Ubuntu子系统搭建数据科学平台,此番来介绍下除了jupyter之外的另外一个数据科学神器:RStudio Server.同时基于Ubuntu和RStudio S ...

  6. 如何搭建一个自己的知识付费平台

    如何搭建一个自己的知识付费平台 近年来,知识付费网课商城项目是一种特别流行的互联网赚钱方式.从运营模式来看,适合公司.工作室.个人.越来越多的人依靠知识付费的在线课程项目,月入超过1万元. 构建知识付 ...

  7. 如何搭建一个完整的视频直播运营平台,需要的投入多大?

    原文出处:直播社区 原文地址:http://www.zhiboshequ.com/news/573.html 视频直播,可以分为"采集.前处理.编码.传输.解码.渲染"这几个环节, ...

  8. 如何搭建一个完整的手机直播系统源码?

    首先第一步,采集,iOS是比较简单的,Android则要做些机型适配工作,PC最麻烦各种奇葩摄像头驱动,出了问题特别不好处理,建议放弃PC只支持手机主播,目前几个新进的直播平台都是这样的. 第二部,前 ...

  9. java 组件化_(原创)搭建一个组件化的监控平台

    最近看到一位同事正在开发一个监控软件,要求就是通过针对服务器现有的一些接口,通过这些接口返回的数据进行分析,如果监控的值到达预先设定的范围则通过短信的方式发送给管理员. 从整个开发的功能上来看是一个比 ...

最新文章

  1. STM32 ADC 同步规则模式 ADC1与ADC2同用一个DMA
  2. 视图、存储过程、函数、游标、触发器使用
  3. VTK:平面源用法实战
  4. TensorFlow2-迁移学习
  5. 面向对象基础知识整理
  6. php怎样创建csv文件,如何使用PHP创建CSV文件?(代码示例)
  7. Promise 的四种常用方法。
  8. hihocoder 1251 Today Is a Rainy Day 2015北京区域赛C
  9. 网络安全[脚本小子] -- SSI注入
  10. 服务器dns被劫持如何修复,dns劫持,教您DNS被劫持如何修复
  11. 基于STM32单片机智能RFID刷卡汽车位锁设计(论文
  12. 数学常识--数学符号常识
  13. redis为什么快?
  14. 学习python表情包_我用Python一键保存了半佛老师所有的骚气表情包
  15. 京东、快手及其他小公司Android面试(2020)
  16. 带联网功能的RFID宿舍门禁(四)-NodeMCU网站与RC522共同控制舵机转动
  17. 服务注册中心如何选型
  18. [附源码]Python计算机毕业设计SSM基于云服务器网上论坛设计(程序+LW)
  19. fastcgi pass php-fpm,nginx: fastcgi_pass的配置
  20. DCP打包中生成KDM所需要的CA证书

热门文章

  1. linux一键安装虚拟机系统
  2. Linux下rar和unrar命令的安装使用
  3. 春招两次腾讯面试都挂二面了,分享下我失败+傻傻的面试经历
  4. JavaScript-0818
  5. 简洁好用的3个研发项目管理工具
  6. response.setContentType()与response.setHeader()
  7. OLED12864模块全屏缓冲刷新
  8. 机器学习中precision和accuracy区别
  9. Android基础——Android系统概览
  10. StrictMode.StrictMode$AndroidBlockGuardPolicy.onNetwork