• nginx+webpy+uswgi+jwplayer组合搭建流媒体服务器


    转载自:http://blog.csdn.net/cjsafty/article/details/7892392


    目前,由于Flash的流行,网络上绝大多数的微视频网站都采用了Flv格式来播放视频。

    在互联网上播放视频,有两种方式,一种是文件方式,即通过HTTP协议访问视频文件,这种方式的缺点是不能从特定的帧开始播放,或者说要下载到本地才能实现seek动作,为了使得seek更加人性化,许多CP采用了对视频文件分片的技术来缓解。例如youku,tudou等国内CP基本都是这么做,包括youtube也是这么做;另外一种就是采用专门的流媒体服务器,例如闭源的adobe 的FMS(flash media server,功能强大,可支持RTMP,HLS,HTTP)和开源的red5,可实现随意seek,这种方式的缺点是要搭建复杂的流媒体服务器,并且fms要收取licence费用。不过,现在有了第三种方式:一种集合了以上两种方式优点的一种解决方案,即通过HTTP来实现伪流媒体(既可以实现任意seek,seek后的媒体流又只提供单纯下载)。本文描述的就是这样的一种解决方案。

    注:apple独创的HLS方案是HTTP+TS分片方案。理论山也应该归属第一种方式,只是apple分片分的好,比如有一个profile配置文件,能够根据网络状况自适应选择对应质量的视频文件,保证播放的平滑性。

    jwplayer,nginx,webpy,uwsgi的基本知识这里不介绍,只介绍本文应用如何实现。

    注:许多博客提到要用yamdi 给媒体文件单独添加关键帧到metadata,因为我用ffmpeg生成的文件已经有了这个信息,所以本文不提这个。

    1,nginx补充编译,增加FLV和MP4功能。

    [plain] view plaincopy
    1. ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_mp4_module  
    2. make && make install  

    http_flv_module和http_mp4_module即为对应的解析和seek功能支持。

    2,conf/nginx.conf支持

    [plain] view plaincopy
    1. http{    
    2.     
    3.     include       mime.types;    
    4.     default_type  application/octet-stream;    
    5.     sendfile        on;    
    6.     keepalive_timeout  65;    
    7.      
    8.     server {    
    9.     listen       8000;    
    10.         server_name  localhost;    
    11.     location / {    
    12.             root   /home/webapp;    
    13.             uwsgi_pass 127.0.0.1:9000;    
    14.             include uwsgi_params;  
    15.             limit_rate_after 1m;  
    16.             limit_rate 100K;  
    17.             index  index.html index.htm;    
    18.             uwsgi_param UWSGI_CHDIR /home/webapp;    
    19.             uwsgi_param UWSGI_SCRIPT apprun;    
    20.             location ~ .flv$ {  
    21.                flv;  
    22.              }  
    23.             location ~ .mp4${  
    24.             mp4;  
    25.              }  
    26.         }    
    27.          location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {    
    28.             root /home/webapp;    
    29.         break;    
    30.         }    
    31.     }    
    32.     
    33. }    

    上面要注意一点:flv和mp4的location要写在上面目录location的里面,不然可能会有权限问题。

    limit_rate_after,是说1M以后才限速到limit_rate=100K;

    3,下载jwplayer,这个开源代码用的比较广,据说youtube第一版用的就是它。地址在

    http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/15991/getting-started

    下载时把

    [plain] view plaincopy
    1. http://192.168.1.106:8000/player.swf?type=http&file=video.mp4  
    用chrome审查元素,观察network,你发现当你seek时,是会请求一个新流过来的,这个实际上已经相当于实时流媒体了。因为普通http+mp4(flv)方式下,这个视频

    但是这个地址的输入太死板了,你在浏览器中看到的是一个全屏幕的SWF播放器界面。如何在HTML中定制呢?参考以下HTML代码


    [html] view plaincopy
    1. <html>  
    2.   
    3. <head>  
    4. <script type="text/javascript" src="/static/jwplayer.js"></script>  
    5.   
    6. </head>  
    7.   
    8. <body>  
    9.   
    10. <div id="container">Loading the player ...</div>  
    11. <script type="text/javascript">  
    12.     jwplayer("container").setup({  
    13.         flashplayer: "/static/player.swf",  
    14.         file: "/static/video.mp4",  
    15.         height: 622,  
    16.                 1104,  
    17.                 stretching : 'fill',  
    18.                 streamer:"start",  
    19.                 provider:"http",  
    20. });  
    21. </script>  
    22. </body>  
    23. </html>  


    上文中:provider和streamer是关键词。如果将此关键词去掉,你得到的仅仅是普通http+mp4功能,没有seek功能

    将此HTML代码(假设文件名为Index.html)丢到和webapp或者index目录下,新建static目录,将jwplayer.js,player.swf以及video.mp4放在此目录下。

    reload nginx ,然后输入以下代码

    [plain] view plaincopy
    1. http://192.168.1.106:8000/index  
    这个时候,你看到的是一个带有宽和高的swf初始页面。当然你可以写更多的css代码来美化。这个是另一个话题

    项目处于/home/webapp目录下,此目录下依次为apprun.py, template文件夹(用于存放index.html代码文件),static文件夹(用于存放js,swf,mp4等静态文件),

    apprun.py代码如下

    [plain] view plaincopy
    1. import psycopg2  
    2. import web  
    3. import codecs  
    4.   
    5.   
    6. urls=(  
    7.     '/','index'  
    8. )  
    9.   
    10. render = web.template.render('template/')  
    11.   
    12. app = web.application(urls, globals())  
    13.   
    14.   
    15. class index:  
    16.     def GET(self):  
    17.         return render.index();  
    18.           
    19.           
    20.           
    21. if __name__ == "__main__":  
    22.     print "everything from here"  
    23.     app.run()  
    24. else :  
    25.     application = app.wsgifunc()  

    重启reload nginx。启动uwsgi,代码如下

    [plain] view plaincopy
    1. ./uwsgi -s 127.0.0.1:9000 -w apprun  

    浏览器输入

    [plain] view plaincopy
    1. http://192.168.1.106:8000  

    此时你是通过webpy页面渲染播放的流媒体。媒体文件和css,js文件一样,都属于静态文件,通过nginx提供server,

    参考博客:

     jw player 流媒体拖曳不成功的问题——nginx在支持flv方面不能用代理
    http://blog.csdn.net/leidengyan/article/details/7576328


     Nginx下搭建flv视频服务器且支持视频拖动进度条播放
    http://blog.csdn.net/youacai/article/details/6728013


    HLS流媒体与其他方式的比较
    http://issuu.com/andruby/docs/http_live_streaming_presentatino#download


    jwplayer官方网站
    http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/15991/getting-started


  • 相关阅读:
    html5 file 上传文件
    JavaScript数组去重—ES6的两种方式
    音频资源下载
    whistle工具全程入门
    解构赋值
    节流(Throttling)和去抖(Debouncing)详解
    HTML5实现全屏
    Vue.js 子组件的异步加载及其生命周期控制
    6个Async/Await完胜Promise的原因
    Docker容器学习与分享08
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637330.html
Copyright © 2020-2023  润新知