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功能。
- ./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
- make && make install
http_flv_module和http_mp4_module即为对应的解析和seek功能支持。
2,conf/nginx.conf支持
- http{
- include mime.types;
- default_type application/octet-stream;
- sendfile on;
- keepalive_timeout 65;
- server {
- listen 8000;
- server_name localhost;
- location / {
- root /home/webapp;
- uwsgi_pass 127.0.0.1:9000;
- include uwsgi_params;
- limit_rate_after 1m;
- limit_rate 100K;
- index index.html index.htm;
- uwsgi_param UWSGI_CHDIR /home/webapp;
- uwsgi_param UWSGI_SCRIPT apprun;
- location ~ \.flv$ {
- flv;
- }
- location ~ \.mp4${
- mp4;
- }
- }
- location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
- root /home/webapp;
- break;
- }
- }
- }
上面要注意一点: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
下载时把Keep me informed of news, offers & updates和Include Viral, a video sharing plugin去掉。
但是jwplayer的水印还是去不掉,这个另有办法,这里不说。
下载下来的zip包,将plyaer.swf和video.mp4直接丢到webapp目录下或者index目录下,启动nginx,输入
- http://192.168.1.106:8000/player.swf?type=http&file=video.mp4
用chrome审查元素,观察network,你发现当你seek时,是会请求一个新流过来的,这个实际上已经相当于实时流媒体了。因为普通http+mp4(flv)方式下,这个视频
文件没有完全下载下来之前,你是无法拖动到后面的(后面没有下载的地方),因此nginx这种方式称为http 伪流媒体(HTTP Pseudo-Streaming),参考jwplayer官方网站
中关于这个伪流媒体概念的介绍。
但是这个地址的输入太死板了,你在浏览器中看到的是一个全屏幕的SWF播放器界面。如何在HTML中定制呢?参考以下HTML代码
- <html>
- <head>
- <script type="text/javascript" src="/static/jwplayer.js"></script>
- </head>
- <body>
- <div id="container">Loading the player ...</div>
- <script type="text/javascript">
- jwplayer("container").setup({
- flashplayer: "/static/player.swf",
- file: "/static/video.mp4",
- height: 622,
- width:1104,
- stretching : 'fill',
- streamer:"start",
- provider:"http",
- });
- </script>
- </body>
- </html>
上文中:provider和streamer是关键词。如果将此关键词去掉,你得到的仅仅是普通http+mp4功能,没有seek功能
将此HTML代码(假设文件名为Index.html)丢到和webapp或者index目录下,新建static目录,将jwplayer.js,player.swf以及video.mp4放在此目录下。
reload nginx ,然后输入以下代码
- http://192.168.1.106:8000/index
这个时候,你看到的是一个带有宽和高的swf初始页面。当然你可以写更多的css代码来美化。这个是另一个话题
4,UWSGI+WEBPY
上述ip输入方式仍然不够方便。我想拥有一个简单易行的网页渲染系统,那么就采用uwsgi+webpy这种方式代替nginx自身的html渲染。
通用部署见我的另一篇博客。这里针对这个应用举例
项目处于/home/webapp目录下,此目录下依次为apprun.py, template文件夹(用于存放index.html代码文件),static文件夹(用于存放js,swf,mp4等静态文件),
apprun.py代码如下
- import psycopg2
- import web
- import codecs
- urls=(
- '/','index'
- )
- render = web.template.render('template/')
- app = web.application(urls, globals())
- class index:
- def GET(self):
- return render.index();
- if __name__ == "__main__":
- print "everything from here"
- app.run()
- else :
- application = app.wsgifunc()
重启reload nginx。启动uwsgi,代码如下
- ./uwsgi -s 127.0.0.1:9000 -w apprun
浏览器输入
- http://192.168.1.106:8000
此时你是通过webpy页面渲染播放的流媒体。媒体文件和css,js文件一样,都属于静态文件,通过nginx提供server,
当然,你可以通过webpy框架,将页面做的美观一些,这个是另一个话题。
注:不经过nginx,直接输入python apprun.py ,同样可以访问播放,但是此时用的是普通Http方式,不支持seek。
参考博客:
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
nginx+webpy+uswgi+jwplayer组合搭建流媒体服务器的更多相关文章
- Ubuntu下使用nginx和nginx-rtmp-module搭建流媒体服务器的正确姿势
之前在使用nginx和nginx-rtmp-module搭建流媒体服务器的时候遇到一个很尴尬的问题,就是在把nginx-rtmp-module模块添加到nginx中去的时候,我最开始采取的做法是先卸载 ...
- nginx + rtmp 搭建流媒体服务器
一.安装nginx服务器 1.路径说明: 路径:/usr/local/src 2.下载nginx-rtmp-module (我这里的目录是在/usr/local/src/下面) cd /usr/loc ...
- centos7+nginx+rtmp+ffmpeg搭建流媒体服务器(保存流目录与http目录不要随意配置,否则有权限问题)
搭建nginx-http-flv-module升级代替rtmp模块,详情:https://github.com/winshining/nginx-http-flv-module/blob/master ...
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器
参考: 1,使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(一)http://blog.csdn.net/xdwyyan/article/details/4319 ...
- nginx的rtmp搭建流媒体服务器实现直播流
最近自己搞了一个用nginx的rtmp来搭建流媒体服务器,从而实现直播的过程,参考了网上很多资料,有些资料对于初学者来说比较难以理解,在此将我搭建的过程记录下来,分享给大家. 1.下载nginx-rt ...
- Linux-Nginx+rtmp+ffmpeg搭建流媒体服务器
Nginx+rtmp+ffmpeg搭建流媒体服务器 说明: nginx搭建流媒体服务需要用到 nginx-rtmp-module 模块 具体操作步骤: 安装nginx (1)下载第三方扩展模块ngin ...
- obs nginx-rtmp-module搭建流媒体服务器实现直播 ding
接下来我就简单跟大家介绍一下利用nginx来搭建流媒体服务器. 我选择的是腾讯云服务器 1.下载nginx-rtmp-module: nginx-rtmp-module的官方github地址:http ...
- 使用 Live555 搭建流媒体服务器
最近因为工作需要,需要搭建流媒体服务器,所以研究了一下,在此分享我的搭建过程. 搭建过程还是非常简单的! 搭建环境为Centos 7.2 64bit 一.安装gcc编译器 yum install gc ...
- Linux 下搭建流媒体服务器
http://blog.csdn.net/huangtaishuai/article/details/9836581 ----------------------------------------- ...
随机推荐
- 最短路径问题 3.Bellman-Ford算法
简要:Bellman-Ford算法计算的仍然是从一个点到其他所有点的最短路径算法,其时间复杂度是O(NE),N表示点数,E表示边数,不难看出,当一个图稍微稠密一点,边的数量会超过点数那么实际上效率是低 ...
- docker学习(一) 安装
一.什么是docker 参见https://baike.baidu.com/item/Docker/13344470?fr=aladdin 个人的理解是,通俗来说,就是相当于一个方便携带且个体独立的虚 ...
- LeetCode:27. Remove Element(Easy)
1. 原题链接 https://leetcode.com/problems/remove-element/description/ 2. 题目要求 给定一个整数数组 nums[ ] 和一个整数 val ...
- Java中的IO流体系
Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流,如图10-7所示,为Java中IO流类的体系. 注:这里只列出常用的类,详情可以参考JDK API文档.粗体标注 ...
- Entity Framework + WCF 远程调用出错
在使用Entity Framework中使用WCF,在程序中调用服务一直报错,我一直以为是WCF的哪个地方的配置有问题,找来找去,一直没有解决. 最后在网上找到一篇文章 ...
- How to find your web part
When we deploy a web part, we can find it on any pages through the follow steps: Firstly, ...
- Android中通过拨号调起应用的实现方式及特殊情况处理
Android中有时我们会有这样的需求:通过拨号调起我们的程序.这个需求如何实现呢? 思路当然是在我们的应用中实现一个广播接收器(BroadcastReceiver),对打电话时系统发出的广播进行拦截 ...
- day-10 sklearn库实现SVM支持向量算法
学习了SVM分类器的简单原理,并调用sklearn库,对40个线性可分点进行训练,并绘制出图形画界面. 一.问题引入 如下图所示,在x,y坐标轴上,我们绘制3个点A(1,1),B(2,0),C(2,3 ...
- linux学习(一)——学习之路
首先,要学Linux编程,你得会用Linux,也就是得在命令行环境下生存下来.什么叫生存下来呢?就是我现在给你一台主机,键盘,显示器啥的,然后给你一个服务器版的Linux系统的光盘或者其他什么安装盘, ...
- 【PHP】- 全局变量global和$GLOBALS的区别
1.global global关键字的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件. 但是在函数体内定义的global变量, ...