`
wangguorui89
  • 浏览: 320370 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论
阅读更多

源文地址:http://www.cnblogs.com/wayne23/archive/2010/07/15/1778077.html

AS3 CookBook学习整理(十三)

1. 控制视频声音

使用NetStream对象的soundTransform属性

package {
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import flash.media.SoundTransform;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 public class Sample0623 extends Sprite
 {
  private var ns:NetStream;
  
  public function Sample0623()
  {
   var nc:NetConnection = new NetConnection();
   nc.connect(null);
   ns = new NetStream(nc);
   ns.client = this;
   var video:Video = new Video();
   video.attachNetStream(ns);
   ns.play("demo.flv");
   stage.addEventListener(MouseEvent.CLICK,onClick);
   this.addChild(video);
  }
  
  private function onClick(event:MouseEvent):void
  {
   var transform:SoundTransform = ns.soundTransform;
   transform.volume = .2;
   ns.soundTransform = transform;
  }
  
  public function onMetaData(infoObject:Object):void
  {
   for(var proName:String  in  infoObject)
   {
    trace(proName+":"+infoObject[proName]);
   }
  }
 }
}

2. 获得播放时间(播放头)

使用NetStream对象的time属性,单位为秒。

textField.text = netStream.time + " seconds";

注意其值没有经过四舍五入,也就是说有时候得到数可能诸如5.235,如果需要整数,可使用Math.round(), Math.floor(), 或Math.ceil()

time属性是只读的

3. 获得视频总时间

使用onMetaData()回调函数读取duration源数据值,单位为秒

NetStream类没有定义一个属性指明视频长度,不过大多数情况,可以从flv文件的元数据获得长度值

当一个NetStream对象载入一个flv文件,它会自动调用onMetaData( )回调方法,该回调模型不同于ActionScript 3.0 API 中的一般事件模型,一般情况下我们通过使用addEventListener( ). 对一个事件进行监听,但是元数据事件必须为一个对象定义一个叫onMetaData( )方法,然后把这个对象赋值给NetStream对象的client属性。该方法自动传递一个类型为Object的关联数组,其包含flv文件的元数据信息

package {
 import flash.display.Sprite;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 public class Sample0623 extends Sprite
 {
  private var ns:NetStream;
  
  public function Sample0623()
  {
   var nc:NetConnection = new NetConnection();
   nc.connect(null);
   ns = new NetStream(nc);
   var client:Object = new Object();
   client.onMetaData = onMetaData;
   ns.client = client;
   var video:Video = new Video();
   video.attachNetStream(ns);
   ns.play("demo.flv");
   this.addChild(video);
  }
  private function onMetaData(data:Object):void
  {
   trace(data.duration);
  }
 }
}

4. 控制播放时间(播放头位置)

使用NetStream的seek()方法

当使用seek()时,Flash播放器将搜寻最接近于指定位置(从流的开始位置算起的偏移量,以秒为单位)的关键帧。到达该位置时,流将恢复播放

视频搜寻的确切位置取决于导出视频时的帧频率 (fps) 设置。 因此,如果以 6 fps 和 30 fps 的帧频率导出同一个视频,并对两个视频对象都使用myStream.seek(15),则这两个视频将搜寻两个不同的位置

如要返回到该流的开始处,请seek(0)

package {
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 public class Sample0623 extends Sprite
 {
  private var ns:NetStream;
  
  public function Sample0623()
  {
   var nc:NetConnection = new NetConnection();
   nc.connect(null);
   ns = new NetStream(nc);
   var client:Object = new Object();
   client.onMetaData = onMetaData;
   ns.client = client;
   var video:Video = new Video();
   video.attachNetStream(ns);
   ns.play("demo.flv");
   
   stage.addEventListener(MouseEvent.CLICK,onClick);
   this.addChild(video);
  }
  
  private function onClick(event:MouseEvent):void
  {
   ns.seek(ns.time + 15);
  }
  private function onMetaData(data:Object):void
  {
  }
 }
}

5. 改变视频的显示尺寸

设置Video对象的width和height属性

Video类定义了两个只读属性:videoWidth和videoHeight,他们返回视频编码时的尺寸,可以用这两个属性设置Video的width和height值

video.width = video.videoWidth;

video.height = video.videoHeight;

需要注意的是,flv还没下载之前这两个属性是不可用的,因此必须等两个属性可用时才行,可以监听netStatus事件达到目的:

PS: NetConnection、NetStream对象报告其状态时,将调度NetStatusEvent对象。只有一种类型的状态事件:NetStatusEvent.NET_STATUS

package {
 import flash.display.Sprite;
 import flash.events.NetStatusEvent;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 public class Sample0623 extends Sprite
 {
  public function Sample0623()
  {
   var nc:NetConnection = new NetConnection();
   nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
   nc.connect(null);
  }
  
  private function onNetStatus(event:NetStatusEvent):void
  {
   if(event.info.code=="NetConnection.Connect.Success")
   {
    var ns:NetStream = new NetStream(event.target  as  NetConnection);
    ns.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
    ns.client = this;
    ns.play("demo2.flv");
    
    var video:Video = new Video();
    video.attachNetStream(ns);
    if(video.videoWidth>0 && video.width!=video.videoWidth)
    {
     video.width = video.videoWidth;
     video.height = video.videoHeight;  
    }
    this.addChild(video);
   }
  }
  
  public function onMetaData(infoObject:Object):void
  {
  }
 }
}

6. 管理和监视缓冲及下载进度

利用NetStream的以下属性:

bufferTime -- 缓冲区大小。可设置(单位为秒),默认为0.1秒

bufferLength -- 已进入缓冲区的秒数

bufferLength / bufferTime -- 已缓冲的百分比

bytesLoaded -- 已下载的字节数

bytesTotal -- 总字节数

bytesLoaded / bytesTotal -- 已下载的百分比

package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 import flash.text.TextField;
 import flash.text.TextFieldAutoSize;
 public class Sample0623 extends Sprite
 {
  private var textBox:TextField;
  private var ns:NetStream;
  
  public function Sample0623()
  {
   //Video 
   var nc:NetConnection = new NetConnection();
   nc.connect(null);
   ns = new NetStream(nc);
   ns.client = this;
   ns.bufferTime = 5;
   ns.play("demo.flv");
   var video:Video = new Video();
   video.attachNetStream(ns);
   this.addChild(video);
   
   //Text 
   textBox = new TextField();
   textBox.autoSize = TextFieldAutoSize.CENTER;
   textBox.multiline = true;
   textBox.x = 100;
   textBox.y = 250;
   this.addChild(textBox);
   
   stage.addEventListener(Event.ENTER_FRAME,onEnterFrame);
  }
  
  private function onEnterFrame(event:Event):void
  {
   textBox.text = "";
   textBox.appendText("缓冲区大小是:"+ns.bufferTime+"\n");
   textBox.appendText("已进入缓冲区的秒数:"+ns.bufferLength+"\n");
   textBox.appendText("已缓冲的百分比:"+ Math.round((ns.bufferLength/ns.bufferTime)*100) +"%\n");
   textBox.appendText("已下载的字节数:"+ns.bytesLoaded+"\n");
   textBox.appendText("总字节数:"+ns.bytesTotal+"\n");
   textBox.appendText("已下载的百分比:"+ Math.round((ns.bytesLoaded/ns.bytesTotal)*100) +"%\n");
  }
  
  public function onMetaData(infoObject:Object):void
  {
  }
 }
}

7. 监听flv的提示点

使用onCuePoint( )回调函数

和onMetaData( ) 一样onCuePoint( )方法定义为Object,然后赋值给NetStream对象的client属性。onCuePoint( )方法接受一个参数,类型为object,属性有:

name -- 提示点的名称

time -- 提示点所在位置的时间

type -- 无论是"event"或"navigation," 都由编码时所选择的类型决定

parameters -- key/value 对组成的关联数组

package {
 import flash.display.Sprite;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 public class Sample0623 extends Sprite
 { 
  public function Sample0623()
  {
   var nc:NetConnection = new NetConnection();
   nc.connect(null);
   var ns:NetStream = new NetStream(nc);
   
   var client:Object = new Object( );
   client.onCuePoint = onCuePoint;
   ns.client = client;
   ns.play("demo2.flv");
   
   var video:Video = new Video();
   video.attachNetStream(ns);
   this.addChild(video);
  }
  
  public function onCuePoint(cuePoint:Object):void
  {
   trace(cuePoint.name + ":" + cuePoint.time);
  }
 }
}

8. 暂停和继续播放视频

使用NetStream对象的pause()和resume()方法

package {
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 public class Sample0624 extends Sprite
 {
  private var ns:NetStream;
  private var isPause:Boolean = false;
  
  public function Sample0624()
  {
   var nc:NetConnection = new NetConnection();
   nc.connect(null);
   
   ns = new NetStream(nc);
   var client:Object = new Object();
   client.onMetaData = onMetaData;
   ns.client = client;
   ns.play("demo.flv");
   
   var video:Video = new Video;
   video.attachNetStream(ns);
   this.addChild(video);
  
   stage.addEventListener(MouseEvent.CLICK,onClick);
  }
  
  private function onClick(event:MouseEvent):void
  {
   if(isPause)
   {
    ns.resume();
    isPause = false;
   }
   else
   {
    ns.pause();
    isPause = true;
   }
  }
  
  private function onMetaData(infoObject:Object):void
  {
   trace(infoObject.duration);
  }
 }
}

9. 停止播放视频

使用NetStream类的close()方法

pause()方法只是暂停播放,flv数据还是在继续下载,如果要完全停止视频下载,必须使用close()方法

当调用close()方法后,Flash Player删除内存中的flv数据,要想播放需要重新下载一遍。但是浏览器可能已经缓存了flv数据,因此第二次播放可能会快一些,但是这可能导致不适最新的数据,如果想每次都是播放最新的数据,可以再url上加上唯一字符串,如下面的代码:

netStream.play("video.flv?uniqueIndex=" + (new Date()).getTime());

如果因为数字版权问题不想视频数据被缓存,就不能使用渐进式下载视频,这种情况可使用流播放,例如可使用Flash Media Server

10. 快进或快退播放(滑块控制)

package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.geom.Rectangle;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 
 public class Sample0624 extends Sprite
 {
  private var ns:NetStream;
  private var timeLine:Sprite;
  private var bar:Sprite;
  private var videoTime:Number;
  private var barIsUp:Boolean = true;
  private var barIsMove:Boolean = false;
  
  public function Sample0624()
  {
   //Video 
   var nc:NetConnection = new NetConnection();
   nc.connect(null);
   ns = new NetStream(nc);
   var client:Object = new Object();
   client.onMetaData = onMetaData;
   ns.client = client;
   ns.play("demo.flv");
   var video:Video = new Video();
   video.attachNetStream(ns);
   this.addChild(video);
   
   timeLine = new Sprite;
   timeLine.graphics.beginFill(0x000000);
   timeLine.graphics.drawRect(0,0,200,3);
   timeLine.graphics.endFill();
   timeLine.x = 50;
   timeLine.y = 250;
   this.addChild(timeLine);
   
   bar = new Sprite();
   bar.graphics.beginFill(0xFFFF00);
   bar.graphics.drawRect(0,0,8,15);
   bar.graphics.endFill();
   bar.y = -6;
   bar.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
   bar.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
   timeLine.addChild(bar);
   
   stage.addEventListener(Event.ENTER_FRAME,onEnterFrame);
  }
  
  private function onEnterFrame(event:Event):void
  {
   if(barIsUp)
   {
    var percent:Number = bar.x / 200;
    ns.seek(bar.x / timeLine.width * videoTime);
    barIsUp = false;
   }
   else 
   {
    if(!barIsMove)
    {
     bar.x = ns.time / videoTime * 200;
    }
   }
  }
  
  private function onMouseDown(event:MouseEvent):void
  {
   var rectangle:Rectangle = new Rectangle(0,-6,timeLine.width-8,0);
   bar.startDrag(false,rectangle);
   barIsMove = true;
  }
  
  private function onMouseUp(event:MouseEvent):void
  {
   bar.stopDrag();
   barIsUp = true;
   barIsMove = false;
  }
  
  private function onMetaData(infoObject:Object):void
  {
   videoTime = infoObject.duration;
  }
 }
}
分享到:
评论

相关推荐

    boilsoft_video_joiner 5.32(含注册码)

    Boilsoft Video Joiner将琐碎影片按顺序作结合整理,这个软件可以帮助你把零散的影片文件组合成为一个大的影片文件,它可以将不同格式的影片组合。你可以任意组合或者排列这些片段。 可以合并多个 AVI、MPEG(MPG)...

    ASF_Specificatio1.0

    因此,本文档旨在整理从不同来源获取的关于ASF 1.0格式的信息,为非Windows和Macintosh平台的工具开发提供参考。 本规格文档是通过分析公开的媒体文件数据编写的,并未进行逆向工程或其他非法活动。作者及贡献者不...

    Microsoft SQL Server 自定义函数整理大全

    知识点 3: 加强版自定义函数 虽然 `clearhtml` 函数可以去除字符串中的 HTML 标记及标记中的内容,但它仍然存在一些问题,例如无法处理 `《》` 或 `<<>>` 等标记。为了解决这个问题,可以创建一个加强版的自定义...

    H264学习资料整理

    个人整理的H264学习资料和相关源代码,文件包括: 20088110727505.doc rfc3984(For264).rar rfc3555.txt H.264_GraphShow.rar h264资料.rar h264_ch.rar rfc3984.txt ffmpeg(vc).rar mepg4coder.rar 85375528H....

    视频合并软件BoilsoftVideoJoiner

    3. **快速合并**:Boilsoft Video Joiner采用了高效的编码技术,能够在较短的时间内完成大量的视频合并任务,节省用户等待时间。 4. **预览功能**:在合并前,用户可以预览每个视频片段以及它们的排列顺序,确保...

    java音频转码

    adpcm_ea_r2 adpcm_ea_r3 adpcm_ea_xas adpcm_ima_amv adpcm_ima_dk3 adpcm_ima_dk4 adpcm_ima_ea_eacs adpcm_ima_ea_sead adpcm_ima_qt adpcm_ima_smjpeg adpcm_ima_wav adpcm_ima_ws adpcm_ms adpcm_sbpro_2 adpcm...

    MP3信息查看软件

    此外,"ASFView"这个文件可能与Advanced Systems Format (ASF)相关,这是一种由微软开发的容器格式,常用于Windows Media Audio (WMA)和Windows Media Video (WMV)文件。尽管标题提到的是MP3信息查看,但包含此文件...

    (整理)基于单片机的远程监控系统的终端设计..doc

    The peripheral circuits employed in this system include a power supply module, temperature sensing circuit, alarm circuit, video采集 module, RS-485 communication module, and an LCD display module....

    2013河北职称计算机考试基础知识整理(小字打印版).doc

    这篇文档主要整理了2013年河北省职称计算机考试的基础知识,涵盖了计算机应用、软件法律、多媒体、数码产品选购等多个方面。以下是对这些知识点的详细解释: 1. 软件分类:免费软件指的是可以无偿使用的软件,商业...

    自己利用空余时间整理出一个windows流媒体入门文档.rar

    5. **流媒体格式**:Windows Media支持多种格式,如ASF(Advanced Systems Format)、WMV(Windows Media Video)和WMA(Windows Media Audio)。这些格式在压缩效率和质量之间找到了平衡,适合在网络上传输。 了解...

    (整理)多点远程视频监控系统流媒体解决方案1..pdf

    流媒体技术方面,WMV(Windows Media Video)格式和ASF(Advanced Stream Format)都被提及。WMV是微软开发的一种流媒体视频格式,而ASF是一种流媒体文件格式,用来储存音频、视频、图像以及文件的索引信息。它们...

    海康威视监控录像专用的视频播放器(VSPlayer)

    包括但不限于MPEG-4 Part 14 (MP4)、H.264编码格式(通常用于高清监控录像)、RealMedia (RM/RMVB)、Audio Video Interleave (AVI)、Windows Media Video (WMV)以及Advanced Systems Format (ASF)。这种广泛的支持...

    整理HTML5的一些新特性与Canvas的常用属性

    向文档中添加其他类型的内容,例如audio、video、canvas和iframe等 流 在文档和应用的body中使用的元素,例如form、h1和small 标题 段落标题,例如h1、h2和hgroup等 交互 与用户交互的内容,例如音频和视频的...

    HTML input file控件限制上传文件类型_动力节点Java学院整理

    - `.3gpp` - `audio/3gpp` 或 `video/3gpp` - 3GPP音频/视频 - `.ac3` - `audio/ac3` - AC3音频 - `.asf` - `application/vnd.ms-asf` - 高级流格式 - `.au` - `audio/basic` - AU音频 - `.css` - `text/css` - 层叠...

    初二(下册)英语单词表.doc

    4. `tidy up`:收拾,整理 5. `doll`:娃娃 6. `fan`:扇子,狂热爱好者 7. `stamp`:邮票 8. `untidy`:不整洁的 9. `least`:最少的 10. `take up`:占用 11. `all the time`:一直,总是 12. `interview`:对......

    高级词汇分类

    - **例句**:We should not waste time playing video games all day. 3. **Should not speak ill of others** - **含义**:不应说别人坏话。 - **例句**:It’s important not to speak ill of others behind ...

    视屏文件缩略图不显示图片.docx

    - 如果问题仍然存在,可能需要检查硬盘驱动器是否有错误,或者运行磁盘清理和碎片整理以优化系统性能。 总之,视频缩略图不显示的问题通常可以通过调整系统设置、注册表编辑或解决播放器冲突来解决。在尝试这些方法...

    flash 教程笔记

    以上是根据给定的信息整理出的主要知识点,涵盖了Flash的基础操作、图形绘制、动画制作以及项目发布等方面的内容。这些知识点不仅适用于初学者学习Flash的基础知识,也适用于有一定基础的学习者进一步提升技能。

    ffmpeg的快速音视频开发方法

    由于提供的内容片段较多且杂乱无章,包含了大量的技术术语和配置指令,但没有明确的段落和语境,因此以下尝试基于提供的内容片段整理出关键知识点,并尽量使内容通顺。 ### FFmpeg快速音视频开发方法 FFmpeg是一个...

Global site tag (gtag.js) - Google Analytics