PHP写在线视频直播技术详解
2016年7月22日 22:26:45
废话一句,如果你要做高性能服务器服务,请去读底层的东西 http tcp/ip socket 了解基础协议,你对如何建造高性能服务器会有一个深度的了解
目前楼主专注php开发,最直接的方法就是使用lnmp去直接做,搜索以下资料,发现还是行得通的,先把基础架构列出来
前端页面 php
弹幕flash+js 数据来源是redis集群
及时聊天 redis集群 +js长连接
礼物系统
在线调用ffmpeg对流媒体进行转码
服务器流媒体 nginx-rtmp-module 的支持
基于HTTP的FLV/MP4 VOD点播
HLS (HTTP Live Streaming) M3U8的支持
基于http的操作(发布、播放、录制)
可以很好的协同现有的流媒体服务器以及播放器一起工作
在线调用ffmpeg对流媒体进行转码
H264/AAC音视频编码格式的支持
服务器端的并发和负载是很大的问题,在兼顾服务器数量+宽带的,后面在详解
视频加速 cdn
支持的pc 安卓 ios需要优化 因为 nginx-rtmp也是支持HLS
视频源支持 obs 目前这个是pc开源的比较好的
安卓或者ios目前没有发现比较好的开源视频源推送的,欢迎推荐
背景和资料
目前流行的流媒体服务器
http://www.oschina.net/project/tag/111/streaming
进行综合对比,发现就PHP作为开发语言来说,nginx肯定是比较方便,因为大部分需要的东西都可以直接配置而且配置也不是很麻烦
又花了很多时间去搜索性能对比,发现nginx-rtmp的性能还是不错的,而且后期做负载和水平扩展,都是很方便的
开发文档
https://github.com/arut/nginx-rtmp-module/wiki/Directives
http://blog.csdn.net/defonds/article/details/9274479/
http://blog.csdn.net/cccallen/article/details/8440191/
所以最后决定是nginx-rtmp作为流媒体服务器,数据库上5.6+因为5.6+的版本把主从的日志复制变成了多线程复制,性能更好,配置更方便
http://www.ttlsa.com/mysql/summary-of-the-new-features-of-mysql5_6/
建议上5.7 QPS 更强,最新版,因为是全新项目,编译 的时候可以把 memory存储引擎加上,在测试服在测试比较方便
5.7版本新特性说明
http://www.oschina.net/translate/whats-new-in-mysql-5-7-generally-available?cmp&p=4
作为需要高并发的网站,建议最好上php7,因为官方鸟哥早就说了,性能增加30%左右,如果你需要超高并发,请上golang,就并发来说,php的资源消耗是很大的
php的并发扩展来说,多进程,虽然也有多线程,但是7以上的版本的扩展不知道是否已经更新,这个也是个问题,如果你了解go语言就会发现go在并发方面做得很好
协程比多线程的资源消耗更小,而且nginx也是支持go的,但是性能怎么样,目前没有测试过
http://blog.csdn.net/win_lin/article/details/41379799
内存数据库目前大部分都是redis集群,我也是选的这个
整体下来作为一个php来说,这样的开发成本是最低的
目前基于php7的框架目前没有,所示自己开发一个小的耦合性低,方便可以扩展的标准mvc框架,模仿CI,目前3.X系列没有说明支持php7
据说CI 4 .x版本会支持
http://codeigniter.org.cn/forums/thread-22318-1-1.html
网站开发测试
测试服搭建
vmware
服务器 centos 6.5 和 centos 7.2
php7.1 mysql 5.7 nginx 1.9
组件基本都是最新版
user nginx;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 10240;
}
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp {
server {
listen 1935;
application mytv { //千万不能使用myapp作为名字 ,不知道为什么就是始终无法播放 访问路径是rtmp://ip/mytv/ 可以使用vlc播放器播放,作为测试
live on;
}
application hls {
live on;
hls on;
hls_path /usr/local/nginx/hls; //这个地址最好和
hls_fragment 5s;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
access_log on;
access_log /usr/local/nginx/html/rtmp_access.log;
server {
listen 8081;
server_name localhost 192.168.1.70 127.0.0.1;
location /hls {
types {
application/vnd.apple.mpegurl m3u8; 请注意是加上on_public url/x.php 在这个php文件做权限和id对应播放房间的判断,是根据传入的id进行生产id.m3u8文件的
video/mp2t ts; 访问url是http://ip/id.m3u8
}
root /usr/local/nginx/hls;
}
}
server {
listen 8080;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /usr/local/nginx/html/; #在nginx-rtmp-module源码根目录 查看当前服务器推流情况的xsl统计
}
}
server {
listen 8082;
location / {
root /usr/local/nginx/html/;
}
}
server {
listen 80;
location / {
root /usr/local/nginx/html/;
}
}
}
网页测试播放器hls可以直接使用h5直接播放
rtmp可以使用 ckplayer的flash进行播放,安卓手机端目前没有测试,因为手机uc默认是没有flash,但是使用hls就可以,因为ios默认就是支持的
obs 推流地址 :rtmp://ip/mytv/ 播放也是这个
这个配置文件会再次更新,仅供参考
./configure \
--prefix=/usr/local/nginx \
--add-module=/usr/local/src/nginx-rtmp-module-master \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ 这个编译其实已经把hls包含进去了
2016年8月16日16:46:20 今天下午测试,使用腾讯云作为服务器端的,rtmp测试效果延迟6-10s,本地串流到服务器,hls还没有测试
还有一个问题就是腾讯云的安全组,你需要把你的机器加入开放所有端口,默认只开放80端口,可以直接IP访问
user nginx;
worker_processes 1; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 10240;
} rtmp_auto_push on;
rtmp_auto_push_reconnect 1s; rtmp {
server {
listen 1935; application mytv {
live on;
} application hls {
live on;
hls on;
hls_path /usr/local/nginx/hls;
hls_fragment 5s;
}
}
} http {
include mime.types;
default_type application/octet-stream; sendfile on; access_log on; access_log /usr/local/nginx/html/rtmp_access.log; server {
listen 8081;
server_name localhost 192.168.1.170 127.0.0.1; location /hls { types {
# application/vnd.apple.mpegurl m3u8;
application/x-mpegurl m3u8;
video/mp2t ts;
}
alias /usr/local/nginx/hls; } } server { listen 8080;
location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /usr/local/nginx/html/; #在nginx-rtmp-module源码根目录 } } server { listen 80;
server_name localhost 192.168.1.170 127.0.0.1;
location / { root /usr/local/nginx/html/;
index index.php;
} location ~ \.php$ {
root /usr/local/nginx/html/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} }
}
播放地址 http://192.168.1.170:8081/hls/.m3u8
实际开发就会根据用户ID.m3u8 来播放,所以需要一些nginx的知识,推流地址 rtmp://192.168.1.170/hls/ 在加密的串流码 里面带上用户ID,是否是大主播,等等的标识,来分流服务器,pull push cdn等
所以nginx和nginx-rtmp的详细知识很重要
PHP写在线视频直播技术详解的更多相关文章
- 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型
关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- 红帽Linux故障定位技术详解与实例(3)
红帽Linux故障定位技术详解与实例(3) 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行 ...
- 红帽Linux故障定位技术详解与实例(1)
红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...
- CDN学习笔记二(技术详解)
一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...
- 各大公司广泛使用的在线学习算法FTRL详解
各大公司广泛使用的在线学习算法FTRL详解 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据 ...
- CDN技术详解及实现原理
CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...
随机推荐
- 实现统一用户体验的BaseActivity
对一个规模较大的App开发团队来说,保持统一的代码规范是个好的事情,同时,保持统一的用户体验规范也是个好的事情. 当用户进入一个页面时,一般会有以下交互场景:场景1, 初始化loading,页面从se ...
- Hbuilder MUI 选择器(Picker)设置默认选项
mui 联动选择初始化很多人都遇到问题,就是setselectedvalue 不好用,实际上这个地方应该是有bug的 所以只能用setselectedindex 来实现 下面我是我的实现方式供大家参考 ...
- OC编程之道-创建对象之单例模式
一 何为单例singleton模式?(what) 保证一个类只有一个实例,并提供一个访问它的全局访问点. 二 何时使用单例模式?(where) 1类只能有一个实例,而且必须从一个为人熟知的访问点对其访 ...
- .NET 获取客户端的操作系统版本、浏览器版本和IP地址
我们在使用.NET做网站的时候,很多情况下需要需要知道客户端的操作系统版本和浏览器版本,怎样获取客户端的操作系统和浏览器版本呢?我们可以通过分析UserAgent来获取. .NET 获取客户端的操作系 ...
- linux xorddos样本分析2
逆向分析 之后我们通过ida对该样本进行更深入的分析样本的main函数中,一开始会调用函数dec_conf对样本中的大量加密的字符串进行解密,如下图所示.
- 七月十三号CSS3总结《2D的转换》
/*2D的转换*/ 位移 -webkit-transform: translate(10px, 10px) 缩放 -webkit-transform: scale(.5, .5)重置原点 ...
- (iOS) __block和__weak认识
果然还是对最基础的知识了解不透彻,今天看一看iOS中的两个修饰符:__block和__weak .也是做一下温习吧. 1.先说weak,<弱引用> 我们知道weak的使用,比如声明一个控件 ...
- 【MongoDB初识】-增删改
1.切换数据库 admin数据库:use admin test数据库:use test 2.新增: 方法一(首选) c} db.class.save(c) 或者db.class.insert(c) 方 ...
- iOS 遍历AutoLayout约束
//遍历footerview约束(一般高,宽) NSArray* constrains = self.footerView.constraints; for (NSLayoutConstraint* ...
- React的双向绑定
以前对于双向绑定概念来自于Angular.js,现在我用我感兴趣的react.js来实现这样的方式.有2种方式分析,1:不用插件,2:用插件 (引入react.js操作省略...) 不用插件: 先创建 ...