Добрый день! Вот уже несколько дней пишу видео плеер для проигрывания потока с сервера (wowza media server). Столкнулся с такой проблемой. Когда проигрываю поток в "режиме stream", используя метод seek() можно бегать по видео и грузить поток с любой точки (что-то похожее на ютуб), но когда видео просто лежит на винте этого делать нельзя.
Вопрос: Можно ли проигрывать (не дожидаясь его полной загрузки) и грузить видео с любой точки которое просто лежит на винте? Если да, то как это можно реализовать?
Вот мой код, он пока не доработанный но может кому-то пригодится:
Код AS3:
import flash.events.*;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
Security.LOCAL_TRUSTED;
NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;
var streamUrl:String = "mp4:sample.mp4";
var serverUrl:String = "rtmp://localhost/vod";
var streamStatus:String;
var duration:Number;
var objInfo:Object;
var tmrUpdate:Timer;
var connected:Boolean;
var connection:NetConnection = null;
var stream:NetStream = null;
function serverConnect()
{
connection = new NetConnection();
connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
connection.connect(serverUrl);
}
function streamConnect()
{
stream = new NetStream(connection);
stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
stream.bufferTime = 50;
stream.client = new Object();
stream.client.onMetaData = function(meta:Object):void
{
trace("metadata: duration=" + meta.duration + " width=" + meta.width + " height=" + meta.height + " framerate=" + meta.framerate);
duration = meta.duration
tmrUpdate.start();
};
videoHolder.attachNetStream(stream);
}
function initVideoPlayer():void
{
serverConnect();
mcVideoControls.controlsHolder.pauseBtn.visible = false;
mcVideoControls.controlsHolder.playBtn.visible = true;
mcVideoControls.controlsHolder.playProgress.scaleX = 0;
mcVideoControls.controlsHolder.downloadProgress.scaleX = 0;
mcVideoControls.controlsHolder.playProgressThin.scaleX = 0;
mcVideoControls.controlsHolder.downloadProgressThin.scaleX = 0;
mcVideoControls.controlsHolder.pauseBtn.addEventListener(MouseEvent.CLICK, Pause);
mcVideoControls.controlsHolder.playBtn.addEventListener(MouseEvent.CLICK, Play);
mcVideoControls.controlsHolder.seekBtn.addEventListener(MouseEvent.CLICK, Seek);
tmrUpdate = new Timer(100);
tmrUpdate.addEventListener(TimerEvent.TIMER, updateValues);
}
initVideoPlayer();
function Play(e:MouseEvent)
{
if (streamStatus == "pause")
{
stream.resume();
}
else
{
stream.play(streamUrl);
}
streamStatus = "play";
mcVideoControls.controlsHolder.pauseBtn.visible = true;
mcVideoControls.controlsHolder.playBtn.visible = false;
}
function Pause(e:MouseEvent)
{
streamStatus = "pause";
stream.pause();
mcVideoControls.controlsHolder.pauseBtn.visible = false;
mcVideoControls.controlsHolder.playBtn.visible = true;
}
function Seek(e:Event)
{
stream.seek(Math.round(this.mouseX * duration / 700));
}
function updateValues(e:TimerEvent):void
{
mcVideoControls.controlsHolder.playProgressThin.scaleX = mcVideoControls.controlsHolder.playProgress.scaleX = stream.time / duration;
mcVideoControls.controlsHolder.downloadProgressThin.scaleX = mcVideoControls.controlsHolder.downloadProgress.scaleX = stream.bytesLoaded / stream.bytesTotal;
}
function netStatusHandler(event:NetStatusEvent):void
{
trace("event.info.code "+event.info.code);
switch (event.info.code)
{
case "NetConnection.Connect.Success" :
streamConnect();
break;
case "NetStream.Play.Start" :
break;
case "NetStream.Play.Stop" :
initVideoPlayer();
break;
case "NetStream.Play.StreamNotFound" :
trace("Stream not found: " + streamUrl);
break;
case "NetStream.Publish.Start" :
break;
case "NetStream.Play.UnpublishNotify" :
break;
default :
}
}
Спасибо!