我在AIR应用程序中为流视频创建了一个擦除器。它适用于短视频,但使用较长的视频则不起作用。
问题是如何使seek()
方法转到特定时间而无需完全缓冲视频数据?
感谢:
var _duration:Number;
var _scrubbing:Boolean;
//-------------------- download and add the video ----------------------------//
var nC:NetConnection = new NetConnection ();
nC.connect(null);
var ns:NetStream = new NetStream(nC);
ns.play("")
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
vid.width = v_container.width;
vid.height = v_container.height;
vid.smoothing = true;
var client:Object = new Object();
client.onMetaData = onMetaData;
ns.client = client;
function onMetaData(metaData:Object):void
{
_duration = metaData.duration;
}
//-------------------- creat playhead and lesten to mouse event--------------------------//
drag.addEventListener(MouseEvent.MOUSE_DOWN,drag_To_Position);
stage.addEventListener(MouseEvent.MOUSE_UP,_stop_drag_To_Position);
addEventListener(Event.ENTER_FRAME,calculate_position);
function drag_To_Position(e:MouseEvent):void
{
drag.startDrag(false,new Rectangle(bar.x,bar.y,bar.width - drag.width,0));
_scrubbing = true;
}
//---------------------------------------------------------------//
function _stop_drag_To_Position(e:MouseEvent):void
{
drag.stopDrag();
_scrubbing = false ;
}
//----------------- seek method & specific time ------------------//
function calculate_position(e:Event):void
{
if ( _duration > 0 )
{
if ( _scrubbing == true )
{
ns.seek( _duration * drag.x / bar.width );
var posi:Number = Math.floor((bar.x - drag.x) / (drag.width - bar.width) * 100 );
pro.gotoAndStop(posi);
}
else
{
var seckto:Number = Math.floor((bar.x - drag.x) / (drag.width - bar.width) * 100 );
drag.x = ns.time / _duration * bar.width ;
pro.gotoAndStop(seckto)
}
}
}