Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1395182
  • 博文数量: 188
  • 博客积分: 1784
  • 博客等级: 上尉
  • 技术积分: 2772
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-05 22:20
个人简介

发上等愿,结中等缘,享下等福;择高处立,就平处坐,向宽处行。

文章分类

全部博文(188)

文章存档

2020年(12)

2019年(11)

2018年(4)

2017年(3)

2016年(11)

2015年(22)

2014年(19)

2013年(25)

2012年(32)

2011年(49)

分类: LINUX

2013-01-29 13:39:04

目前,由于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第一版用的就是它。地址在

下载时把Keep me informed of news, offers & updates和Include Viral, a video sharing plugin去掉。

但是jwplayer的水印还是去不掉,这个另有办法,这里不说。

下载下来的zip包,将plyaer.swf和video.mp4直接丢到webapp目录下或者index目录下,启动nginx,输入


用chrome审查元素,观察network,你发现当你seek时,是会请求一个新流过来的,这个实际上已经相当于实时流媒体了。因为普通http+mp4(flv)方式下,这个视频

文件没有完全下载下来之前,你是无法拖动到后面的(后面没有下载的地方),因此nginx这种方式称为http 伪流媒体(HTTP Pseudo-Streaming),参考jwplayer官方网站

中关于这个伪流媒体概念的介绍。

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

      
      
      
      
      
      
      
      
      
    
Loading the player ...

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

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

reload nginx ,然后输入以下代码


这个时候,你看到的是一个带有宽和高的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


浏览器输入


此时你是通过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流媒体与其他方式的比较



jwplayer官方网站

阅读(4061) | 评论(0) | 转发(0) |
0

上一篇:jw player + HTML5

下一篇: Flowplayer + Html5

给主人留下些什么吧!~~