PHP寫在線視頻直播技術詳解


廢話一句,如果你要做高性能服務器服務,請去讀底層的東西 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的詳細知識很重要


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM