zoukankan      html  css  js  c++  java
  • 视频流媒体服务器

    目标用于搭建内网流媒体服务器支持视频的点播。

    背景

    用于支持培训网站中视频点拨功能,在培训网站总体方案中需要加入流媒体服务器,用于存储和传输视频资源。

    相关概念

    • 流媒体
      流媒体(Streaming Media)是一种新兴的网络传输技术,在互联网上实时顺序地传输和播放视/音频等多媒体内容的连续时基数据流。

    流媒体技术包括流媒体数据采集、视/音频编解码、存储、传输、播放等领域。

    • 流媒体系统组成
      包括编码工具、流媒体数据、服务器、网络和播放器。

    • 流媒体传输过程
      如下图所示:

    流媒体传输过程

    • 传输协议
      RSVP: 资源预留协议
      RTP: 实时传输协议
      RTCP: 实时传输控制协议
      MMS: 微软流媒体服务协议
      RTSP: 实时流协议
      RTMP: 实时消息传输协议
      MIME: 多目因特网电子邮件扩展协议

    解决方案

    商业方案

    • Real Network的Real System
    服务端软件:Helix Server
    平台:Windows or Linux
    文件格式:RealAudio, Realvideo, RealFlash
    
    • 微软的Windows Media Services
    服务端软件:Windows Media Server
    平台:Windows
    文件格式:ASF, WMV
    
    • 苹果公司的Quick Time系列
    服务端软件:QuickTime Streaming Server (开源版本为Darwin Streaming Server)
    平台:MacOS X, Linux, Windows
    文件格式:MOV, MP4
    

    三种流媒体系统比较

    在这三家公司的流媒体产品中,RealNetworks公司的免费服务端Helix Server Basic最大提供个流的并发,仅支持其专有编码RealAudio和RealVideo,基本上只能算是体验性的产品;微软公司的流媒体服务端Windows Media Server附带于其服务器产品Windows Server中,但只有最高版本的Windows Server Enterprice才具有完整的包括组播在内的所有流媒体服务器功能;苹果公司的Darwin Streaming Server(简称DSS)完全免费,没有任何功能限制,且符合国际标准。

    开源/免费解决方案

    • ffmpeg
    全平台视频转换
    开源
    
    • RED5
    Red5是一个采用Java开发开源的Flash流媒体服务器。它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能。
    开源地址:[](https://github.com/Red5/red5-server)
    
    • Darwin Streaming Server
    为苹果公司视频流解决方案的开源版本。
    
    • easyDarwin
    国内基于Darwin Streaming Server二次开发的流媒体服务器,有中文支持网站。
    

    安装配置

    RED5

    使用HTTP协议播放

    1. 首先从github下载已编译版本,因为在Linux上安装使用,直接下载 red5-server-1.0.7-RELEASE.tar.gz文件即可。
    2. Java程序,在服务器上安装jre1.7版本后即可解压运行。测试阶段可以使用./red5-debug.sh启动red5服务器。在浏览器上输入http://[serverip]:5080/可以看到red5控制主页。
    3. 在red5安装目录下的webapp/vod目录下的视频文件可以在本地VLC播放器上连接http://[serverip]:5080/[filename]进行播放。

    Darwin Streaming Server

    功能同easyDarwin,在Linux上安装比较繁琐,所以暂时只试用easyDarwin。

    easyDarwin

    使用RTSP协议播放

    1. 首先从github下载源码或者已编译版本,因为上面有centos的已编译版本,直接下载解压即可使用。
    2. 使用root账户启动执行程序,首次启动迁移开启调试模式,./easydarwin -c ./easydarwin.xml -d
    3. 启动后,可以在执行的从终端看到调试信息。同时使用http://[serverip]:8088可以登录,默认使用admin/admin登录。
      配置界面
    4. 在Movies目录下放置一些视频文件,就可以在客户端使用播放器进行播放,我测试使用的是VLC。

    连接流

    播放流

    Nginx + HLS

    HLSHTTP Live Streaming苹果公司开放的支持html5直接播放的视频流技术。
    Nginx实现http服务器功能,可以通过http访问m3u8文件实现播放。

    要使用HLS播放的第一步,是将视频文件切割成多个ts视频流,然后使用m3u8索引文件进行播放。生成m3u8和ts文件可以借助ffmpeg工具,使用如下命令就可以将一般的视频文件转换成HLS支持的文件。

    ffmpeg -i "G:video7 magic leap2.avi" -f hls "G:videoHLR	est.m3u8"
    

    对于大文件用上面这种方式有可能出现m3u8缺少索引的情况,因此也可以使用以下的方式对文件进行转换。

    ffmpeg -i bigfile.mp4 -codec:v libx264 -codec:a aac -map 0 -f ssegment -segment_format mpegts -segment_list tos.m3u8 -segment_time 10 taste_of_shanghai%04d.ts
    

    直接使用Nginx访问文件路径

    不需要多余的软件,直接将m3u8文件所在目录设置为http server的根目录。

     server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
            #    root   html;
                 root /var/www/html;
                index  index.html index.htm;
            }
    

    即可使用播放器打开远程连接。

    hlr_playback

    Nginx + jwplayer

    Nginx编译时增加mp4和flv模块,可以让Nginx支持flv和mp4格式。为了后面说明支持RMTP协议,同时在增加RTMP模块。

    • 安装依赖包
    yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel gettext-devel libtool mhash.x86_64 perl-Digest-SHA1.x86_64
    
    tar xzvf zlib-1.2.8.tar.gz
    cd zlib-1.2.8
    ./configure
    make
    make install
    
    tar xzvf pcre-8.37.tar.gz
    cd pcre-8.37
    ./configure
    make 
    make install
    
    tar xzvf yamdi-1.9.tar.gz
    cd yamdi-1.9
    ./cofigure
    gcc yamdi.c -o yamdi -O2 -Wall
    
    tar xzvf openssl-1.0.1t.tar.gz
    cd openssl-1.0.1t
    ./config
    make depend
    make install
    
    • 安装ffmpeg以及依赖包
      需要安装yasm, x264, LAME, libogg,libvorbis, libvpx, faad2, faac
    # 汇编工具
    # 请网络搜索安装包
    unzip yasm-1.2.0-1.el6.x86_64.zip
    rpm -ivh yasm-1.2.0-1.el6.x86_64.rpm
    
    # h.264编码
    # http videolan.org
    tar xjvf last_x264.tar.bz2
    cd x264-snapshot-20160718-2245
    ./configure --enable-shared
    make
    make install
    
    # LAME mp3编码器
    wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
    tar xzvf lame-3.99.5.tar.gz
    cd lame-3.99.5
    ./configure --enable-nasm
    make
    make install
    
    # libogg 音频编码器
    wget http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
    tar xzvf libogg-1.3.2.tar.gz
    cd libogg-1.3.2
    ./configure
    make
    make install
    
    # libvorbis 音频编码器
    wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
    tar xzvf libvorbis-1.3.5.tar.gz
    cd libvorbis-1.3.5
    ./configure
    make
    make install
    
    # libvpx VP8编码解码器
    # 网络搜索
    tar xjvf libvpx-1.5.0.tar.bz2
    cd libvpx-1.5.0
    ./configure --enable-shared
    make
    make install
    
    # FAAD2 MPEG-2和AAC格式的编解码器
    wget http://downloads.sourceforge.net/project/faac/faad2-src/faad2-2.7/faad2-2.7.tar.gz
    tar xzvf faad2-2.7.tar.gz
    cd faad2-2.7
    ./configure
    make
    make install
    
    # faac AAC编解码器
    wget http://downloads.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz
    tar xzvf faac-1.28.tar.gz
    cd faac-1.28
    ./configure
    make
    make install
    
    # xvid 视频编码
    wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
    tar zxvf xvidcore-1.3.2.tar.gz
    cd xvidcore/build/generic
    ./configure
    make
    make install
    
    # ffmpeg 转换工具
    wget http://ffmpeg.org/releases/ffmpeg-3.1.1.tar.bz2
    tar xjvf ffmpeg-3.1.1.tar.bz2
    cd ffmpeg-3.1.1
    ./configure  --prefix=/opt/ffmpeg/ 
    --enable-version3  
    --enable-libvpx 
    --enable-libfaac 
    --enable-libmp3lame  
    --enable-libvorbis 
    --enable-libx264 
    --enable-libxvid 
    --enable-shared 
    --enable-gpl 
    --enable-postproc 
    --enable-nonfree  
    --enable-avfilter 
    --enable-pthreads
    
    make
    # 可以忽略编译过程中的警告信息
    make install
    
    • 修改/etc/ld.so.conf
    inclue ld.so.conf.d/*.conf
    /lib
    /lib64
    /usr/lib
    /usr/lib64
    /usr/local/lib
    /usr/local/lib64
    /opt/ffmpeg/lib
    

    执行ldconfig使修改生效。

    • 编码测试
    ffmpeg -i ./a_day_with_htc_vive.avi -f hls ./htcvive.m3u8
    
    • 编译Nginx
    wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
    tar xzvf nginx_mod_h264_streaming-2.2.7.tar.gz
    
    # https://github.com/arut/nginx-rtmp-module
    unzip nginx-rtmp-module-master.zip 
    
    vi nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c 
    # 注释以下内容
    /* TODO: Win32 */
    if (r->zero_in_uri)
    {
    return NGX_DECLINED;
    
    }
    
    groupadd nginx
    useradd nginx
    usermod -G nginx nginx
    
    tar zxf nginx-1.8.0.tar.gz
    cd nginx-1.8.0
    ./configure --prefix=/usr/local/nginx 
    --add-module=/opt/video/nginx_mod_h264_streaming-2.2.7 
    --with-http_flv_module 
    --with-http_ssl_module 
    --with-http_mp4_module 
    --with-http_gzip_static_module 
    --with-http_stub_status_module 
    --with-pcre=/opt/video/pcre-8.37 
    --with-zlib=/opt/video/zlib-1.2.8 
    --user=nginx --group=nginx 
    --add-module=/opt/video/nginx-rtmp-module-master 
    --with-cc-opt=-I/opt/ffmpeg/include 
    --with-ld-opt=-L/opt/ffmpeg/lib-R/opt/ffmpeg/lib
    
    make 
    make install
    
    • 配置nginx.conf文件
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root /var/www/html;
                index  index.html index.htm;
                location ~ .flv$
                {
                    flv;
                }
                location ~ .mp4$
                {
                    mp4;
                }
            }
            location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
                root /var/www/html;
                break;
            }
    
    • 使用jwplayer实现http播放

    在网站上下载一个jwplayer,解压后上传至/var/www/html目录,然后就可以在浏览器直接访问以h264编码的mp4文件或flv文件。

    此方法的兼容性较好,在IE, Chrome, Firefox, Safari输入地址http://192.168.40.134/player.swf?type=http&file=sample_h264_100kbit.mp4,视频都可以直接打开。

    效果如下图所示:

    ie_jwplayer

    不过这样的播放方式,要求在地址栏输入一长串的地址,优雅一点的方法是写一个页面放在网站目录下,然后通过访问页面来播放嵌套其中的视频。

    如下建立一个index.html文件。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>test of nginx-http</title>
    </head>
    <body>
    <div id="myElement"></div>
    <object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="480" height="360">
      <param name="movie" value="player.swf" />
      <param name="quality" value="high" />
      <param name="wmode" value="opaque" />
      <param name="swfversion" value="6.0.65.0" />
      <EMBED SRC="player.swf" WIDTH="480" HEIGHT="360" QUALITY="high" flashvars="type=http&file=/magicleap2.flv&autostart=true" wmode="opaque" /></object>
    </body>
    </html>
    

    其中flv文件如果要支持拖动,需要对文件添加关键帧,方法如下:

    yamdi -i magicleap.flv -o magicleap2.flv
    

    然后通过浏览器访问这个地址http://192.168.40.134/index.html。可以看到视频实现在页面中的播放。

    ie_jwplayer_page

    Nginx + RMTP模块

    • 测试RTMP直播功能
      提示:测试RTMP功能可以参考nginx-rtmp-module中的test目录。
    # 写入nginx.conf文件,rtmp协议专用1935端口
    rtmp {
        server {
            listen 1935;
            chunk_size 4000;
            application vod {
                play /var/www/vod; # vod file location
            }
            application live { 
                live on;
    
             }
        access_log logs/rtmp_access.log; 
        }
    }
    

    在本地的VLC打开rtmp地址rtmp://192.168.40.134/live/mystream。
    在远程主机上使用ffmpeg命令模拟一个视频流推送给VLC。这种推流的方式实际就是所谓的直播了。

    ffmpeg -loglevel verbose -re -i /var/www/html/a_day_with_htc_vive.avi  -f flv rtmp://localhost/live/mystream
    
    ffmpeg –i/usr/local/nginx/vod/flvs/a.flv-strict -2 -c:v libx264 -c:a aac -f flv rtmp://192.168.10.4/live/test
    

    一旦远程主机上的转换开始,VLC开始缓冲几秒后就会开始播放,如下图所示。

    vlc_rtmp_receive

    • 在http模块中配置RTMP虚拟机(server)实现点播功能

    实现方法是用jwplayer调用rtmp的流实现视频播放。如下html实现对视频的嵌入播放。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>nginx-rtmp</title>
    </head>
    
    <body>
    <div id="myElement"></div>
    <object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="480" height="360">
      <param name="movie" value="player.swf" />
      <param name="quality" value="high" />
      <param name="wmode" value="opaque" />
      <param name="swfversion" value="6.0.65.0" />  <EMBED SRC="player.swf" WIDTH="480" HEIGHT="360" QUALITY="high" flashvars="streamer=rtmp://192.168.40.134:1935/vod&file=magicleap2.flv&autostart=true" wmode="o
    paque" />
    </object>
    </body>
    </html>
    

    播放效果如下:

    ie_jwplayer_rmtp_page

    通过这个RTMP流的优势是,可以避免视频文件被浏览器通过http方式进行下载。

    视频文件存储

    所有流服务器存储媒体文件的方式都是将文件放在指定目录下面,且磁盘系统绝大部分I/O都是读操作,写操作只会发生在上传和更新媒体文件过程中。对于这种I/O操作特性,建议选择RAID 5用于中小规模的视频点拨服务。这样可以提供比独立磁盘更高的数据安全性和读取速度,同时将成本控制在较小的范围内。实际可用容量为(N-1)个磁盘。

  • 相关阅读:
    Sketch Missing Fonts 页面样式混乱研究
    SFDC_01(google map)
    SFDC_02(google map)
    SFDC_04(system.debug();)
    umbraco简体中文语言包for4.5及以下版本
    7.22武汉日全食自拍留念
    IIS7(windows 2008)恐怖问题,大家谨慎,血的教训啊~~~~
    【视频】自己录制的Umbraco入门3——如何构建网站导航,推荐给玩CMS的朋友
    分享,个人代码知识管理程序
    【视频】自己录制的Umbraco入门2如果构建网页,推荐给玩CMS的朋友
  • 原文地址:https://www.cnblogs.com/shenfeng/p/nginx_rtmp_streaming_server.html
Copyright © 2011-2022 走看看