zoukankan      html  css  js  c++  java
  • FLV流媒体应用大攻略

    FLV格式FLASH VIDEO格式的简称,它是不仅可以轻松地导入Flash中,也可以通过rtmp 协议从Flashcom 服务器上流式播出或者通过http 协议播出。由于FLV格式在提供较高压缩比的同时也保持了较好的画面质量,而且文件加载速度也极快,因此目前国内外主流的视频网站都应用了FLV格式,它在校园网中也将大有用武之地。下面就让我们攻克FLV流媒体应用的一个个难关吧。

    一、FLV服务器端攻略——FLV的发布方式

    FLV可以通过两种方式在服务器端发布,一种是在服务器端安装Flash Media Server,通过Flash Media Server发布FLV流媒体文件;另一种是通过Web 服务器发布FLV流媒体文件。Flash Media ServerMacromedia公司开发的FLV流媒体文件发布平台,可以对发布的文件进行管理,可以定制数据带宽,监控服务器端的数据流量,但是这种模式是基于服务器端与客户端实时通信基础之上的,在网络带宽较好的情况下,客户端接受服务器数据比较及时,在客户端观看的视频也就比较流畅,一旦网络带宽不好时,客户端极易与服务器中断连接,所以在Internet这样的广域网上,一般都是采用第二种方式通过Web 服务器发布FLV流媒体文件。这种方式虽然不易于管理和监控发布的FLV流媒体文件,但是采用这种方式FLV流媒体文件是通过渐进式下载方式传输到客户端的,所以客户端与服务器通信受网络带宽影响较小,在客户端观看的视频始终流畅,给客户的体验要好于第一种方式。因为大部分学校都是以Microsoft Internet 信息服务 (IIS) 作为Web 服务器软件,所以下面介绍一下在IIS环境下发布FLV时,Web服务器端配置的方法。

    Microsoft 更改了在 Microsoft Internet 信息服务 (IIS) 6.0 Web 服务器中处理流媒体的方式,不再采用早期版本中的处理方式。早期版本的 IIS 不需要对 Flash 视频流做任何修改。在 Windows 2003 附带的默认 Web 服务器 IIS 6.0 中,服务器需要借助 MIME 类型来确认 FLV 文件为流媒体。配置 Microsoft Windows 2003 Microsoft IIS Server 6.0 以采用流式媒体的方式加载 FLV 视频的方法如下:

    1、在Windows 2003 server中,打开IIS管理器;

    2、展开本地计算机;

    3、右击网站,然后选择属性;

    4、选择HTTP标签,找到MIME映射,点击文件类型;

    5、点击新类型,

    关联扩展名:.FLV

    内容类型:flv-application/octet-stream

    6、点击确定;

    7、重启IIS

    经过这样配置,IIS 6.0就可以流式传送FLV了,当然还要在IIS建立一个目录或虚目录来存放FLV 视频文件。

    二、客户端播放器制作攻略

    采用FLV进行流媒体服务,一个好处就是可以用Flash制作出有个性的客户端播放器。不过要注意,制作播放器时要使用Flash CS3以上版本,因为一些视频控制代码在Flash Max2004中是无法测试通过的。

    1、界面的制作

    新建一个FlashActionScript2.0)空白文档,在图层1上添加几个按钮元件,用作播放/暂停按钮、停止按钮、音量按钮、全屏按钮,并排列好按钮的位置。添加两个动态文本,用来传递视频参数,并在其属性框里,分别指定其变量名为FMServer(服务器地址)、clipName(视频剪辑名称),把Flash影片的背景设为黑色。再新建一个图层2,位置在图层1上。在其上创建一个视频对象实例:

    使文档在 Flash 创作工具中保持打开状态,从“库”面板(“窗口”>“库”)的弹出菜单中选择“新建视频”。

    在“视频属性”对话框中,命名视频元件并选择“视频”(受 ActionScript 控制)。

    单击“确定”以创建一个视频对象。

    将该视频对象从“库”面板拖到舞台上,以创建视频对象实例。

    使视频对象在舞台上保持选中状态,在“属性”检查器(“窗口”>“属性”)中的“实例名称”文本框中键入 my_video

    在属性框里修改其大小和位置,并使其遮住图层1上的动态文本。

    2、添加视频控制代码

    在图层2的第一帧中添加如下脚本:

    my_video.smoothing=true;//视频开启平滑

    var clip_duration=0;//视频长度,如果使用播放进度条的话

    var my_sound = new Sound();//声音实例

    var volumenumber=50

    my_sound.setVolume(volumenumber);//设置初始音量为原始音量的50%

    var ncstatus="open"//视频结束标记,初始为打开

    var playingstatus= true; //视频播放标记

    var my_nc:NetConnection;//连接实例

    var ns:NetStream;//流实例

    function custom_nc():Void{//连接函数

         my_nc= new NetConnection();

         my_nc.connect(null);

    }

    function custom_ns():Void{//流启动函数

         ns= new NetStream(my_nc);

         my_video.attachVideo(ns); //给视频对象加载流

         ns.client=this; //指定nsclient属性为this,以便使用回调函数

         ns.play(FMServer+"/"+clipName+".flv",0,-1, false);//开始播放

         ns.onStatus=function(infoObject:Object) {//获取播放状态

                switch(infoObject.code){

                       case "NetStream.Buffer.Empty" :

                              break

                       case "NetStream.Buffer.Full" :

                              break

                       case "NetStream.Buffer.Flush" ://缓存被清空

                              playingstatus=false

                              ncstatus="close"///视频结束标记,设为关闭

                              ns.close()//关闭流

                              break

                       case "NetStream.Play.Start" :

                              break

                       case "NetStream.Play.Stop" :

                              break

                       case "NetStream.Play.StreamNotFound" :

                              break

                       case "NetStream.Seek.InvalidTime" :

                              break

                       case "NetStream.Seek.Notify" :

                              break

                }

         }

    //获取文件播放时长,如果使用播放进度条的话

         ns.onMetaData = function(infoObject:Object) {

                clip_duration=infoObject.duration;

         }

    }

    //定义回调函数获取文件头元数据其中就有视频播放的时长

    //回调函数只定义了接口,而函数行为需要应用者定义

    function onMetaData(infoObject:Object):Void

    {

        var key:String;

        for (key in infoObject)

        {

            trace(key + ": " + infoObject[key]);

        }

    }

    //监听ESC

    myListener = new Object();

    myListener.onKeyDown = function () {

    //trace ("You pressed a key.");

    }

    myListener.onKeyUp = function () {//松开ESC键退出全屏

         if(Key.getCode()==27)

                Stage.scaleMode="exactfit";

         //trace ("You released a key.");

    }

    Key.addListener(myListener);

    custom_nc();

    custom_ns();

    在播放/暂停按钮中添加如下代码:

    on(release){

         if(_level0.ncstatus=="close"){

                _level0.ncstatus=="open"

                _level0.playingstatus=true

                _level0.custom_ns()

         }

         Else{

                if(playingstatus){//如果正在播放,此时暂停

                       _level0.playingstatus=false

    _level0.ns.pause(false);

                }

    Else{//如果此时暂停,则继续播放

                       _level0.playingstatus=true

    _level0.ns.pause(false);

                }

         }

    }

    在停止按钮中添加如下代码:

    on(release){

         _level0.playingstatus=false

         _level0.ncstatus="close"

         _level0.ns.close()

    }

    在音量按钮中添加如下代码:

    on(release){

    volumenumber=volumenumber+10

    if(volumenumber<=100&& volumenumber>=0)//音量从0正加到100%

    _root.my_sound.setVolume(volumenumber)

    if(volumenumber<0&& volumenumber>=-100) //音量从100%减少到0

    _root.my_sound.setVolume(-1*volumenumber)

                if(volumenumber==100)

                       volumenumber=-100

    }

    在全屏按钮中添加如下代码:

    on(release){

         if(Stage["displayState"]=="fullScreen"){//退出全屏

                Stage.scaleMode="exactfit"

                Stage["displayState"]="normal";

         }

         else {//全屏

                Stage.scaleMode="showAll"

                Stage["displayState"]="fullScreen";

         }

    }

    //如果使用播放进度条的话

    //ns.time可以获取当前播放时间

    //ns.bytesLoaded已下载的视频字节数,ns.bytesTotal视频总字节数

    //ns.seek( )搜索前进到函数参数指定的位置

    3、将播放器嵌入网页

    Flash中,测试并发布播放器的swf文件,并保存文件名为flvplayer,将flvplayer.swf文件复制到作为播放器页面的网页的相同目录下,将下列代码加入到网页代码中。

    <objectid='flvplayer'

    classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'

    codebase='http://download.macromedia.com/pub/shockwave/

    cabs/flash/swflash.cab#version=6,0,29,0' width='286' height='256'>

    <paramname='movie' value='flvplayer.swf?FMServer=http://192.168.1.1/flv&clipName=01' />

    <!—

    http://192.168.1.1Web服务器地址

    flv是存放FLV文件的目录或虚目录

    01FLV文件名

    以上参数读者可以根据自己的实际情况更改

    -->

    <param name='quality' value='high' />

    <param name='allowFullScreen' value='true' />

    <param name='menu' value='false' />

    <param name='SCALE' value='exactfit' />

    <embed src='flvplayer.swf' width='286' height='256'

    quality='high' pluginspage='http://www.macromedia.com/go/getflashplayer'

    type='application/x-shockwave-flash' scale='exactfit'></embed>

    </object>

    这样除了进度条外,播放器就制作完成了,在这里进度条的制作和控制就不做介绍了,制作和控制进度条需要的几个关键函数在上面代码中已经提到了,读者可以利用这几个函数制作进度条。

    三、FLV文件制作攻略

    完成前两步,网友就可以享受你提供的FLV流媒体视频服务了,剩下的就准备足够的FLV流媒体视频文件了。制作FLV流媒体视频文件,可以使用Macromedia公司提供的FLV编码器——Macromedia Flash 8 Video Encoder,它支持将AVI等文件转换成FLV文件,使用起来很简单,不过在网上很难下载到,你可以到下列网址下载www.kazx.com.cn/itg/software。建议不要使用其他编码器,其他编码器可能不会提供文件元数据,没有元数据就无法获得视频时长,进度条就无法正确运行了。

    本文中的代码都是测试过的,可以到www.kazx.com.cn/itg/video看一看代码运行的效果。当然,为便于大家的理解,代码是简化过的,只保留了播放器的核心功能,有些功能如进度条等没有实现。

  • 相关阅读:
    STM32 HAL库 +freeRTOS+Keil 移植
    C# OPENGL DEMO 旋转彩色立方体OpenGL, SharpGL
    常用的user32说明
    C# emgu 多模板匹配
    c#操作Excel模板,替换命名单元格或关键字形成报表
    STM32 USB 鼠标+键盘 串口控制
    USB鼠标键盘数据格式以及按键键值
    C# Emgu 类型转换
    C#来操作Word
    Linux部署H2
  • 原文地址:https://www.cnblogs.com/radom/p/1864828.html
Copyright © 2011-2022 走看看