джонатан
05.06.2008, 19:18
Здравствуйте! Вот есть у меня FLV плеер, надо сделать:
1.Чтобы были одни часики, которые показывает текущее время воспроизведения.
2. Другие часики, на которых написана общая длина файла.
Вот код плеера:
// Stream FLV-player by Jonathan
// Разрешение видео - 320 x 240
var src:String = "letstalk.flv";
var flv_connect:NetConnection = new NetConnection();
flv_connect.connect(null);
var motionStream:NetStream = new NetStream(flv_connect);
var soundControll:Sound = new Sound(_level0);
var duration:Number = 0;
// длина ролика. ее мы будем получать по событию onMetaData
var seeker:Number = null;
// переменная для setInterval - для ускорения перемотки
var timePressed:Number = 0;
// таймер фиксирующий время нажатия клавиши перемотки
var onTheRun:Boolean = false;
// состояние плеера - проигрывается видео или нет
//////////Чтобы проигрывать видео необходимо создать экземпляр типа Video (Делается это в библиотеке)
motion_mc.motion_vid.attachVideo(motionStream);
motionStream.setBufferTime(2);
/// Указывает сколько секунд видео должно загрузиться чтобы началось воспроизведение. В процессе проигрывания, если первые 2 секунды уже проигрались, а вторая порция еще не подгрузилась происходит остановка, до тех пор пока не подгрузятся следубщие 2 секунды.
motionStream.onMetaData = function(meta:Object):Void {
duration = meta.duration;
/*событие возникает, когда плеер связывается с видеоФайлом, и получает от него Мета_данные в виде объекта.
Чтобы трассировать эти данные необходимо раскомментировать код.*/
//for (var prop in meta) {
// trace(prop+" = "+meta[prop]);
//}
};
motionStream.onStatus = function(motion_status:Object):Void {
//for(var prop in motion_status) {
//trace(prop + ": "+motion_status[prop]);
//};
//// Событие помогает отслеживать состояния воспроизведения - ошибки загрущки, остановку, начало, перемотку - читаем хелп, там все написано. Вот тут возможен момент - если готовить flv в Макромедиа Флеш8Видео энкодере - и подрезать там длину ролика - то это неблагоприятно сказывается на статусе СТОП. Вывод - не резать длину ролика в энкодере.
if (motion_status.code == "NetStream.Play.Stop") {
motionStream.seek(duration);
motionStream.pause(true);
play_btn._visible = true;
pause_btn._visible = false;
}
};
/*****КНОПКИ*****/
//PLAY
play_btn.onEnterFrame = function() {
if(this.direct) this.nextFrame();
else this.prevFrame();
}
play_btn.onRollOver = function() {
this.direct = true;
}
play_btn.onRollOut = function() {
this.direct = false;
}
play_btn.onRelease = function():Void {
this._visible = false;
pause_btn._visible = true;
if (onTheRun) {
if (vt_mc._width == 320) {
motionStream.seek(0);
}
motionStream.pause(false);
} else {
onTheRun = true;
motionStream.play(src);
}
};
//PAUSE
pause_btn.onEnterFrame = function() {
if(this.direct) this.nextFrame();
else this.prevFrame();
}
pause_btn.onRollOver = function() {
this.direct = true;
}
pause_btn.onRollOut = function() {
this.direct = false;
}
pause_btn.onRelease = function():Void {
this._visible = false;
play_btn._visible = true;
motionStream.pause(true);
};
//STOP
stop_btn.onEnterFrame = function() {
if(this.direct) this.nextFrame();
else this.prevFrame();
}
stop_btn.onRollOver = function() {
this.direct = true;
}
stop_btn.onRollOut = function() {
this.direct = false;
}
stop_btn.onRelease = function():Void {
motionStream.seek(0);
onTheRun = false;
pause_btn._visible = false;
play_btn._visible = true;
motionStream.close();
motion_mc.motion_vid.clear();
};
rew_btn.onPress = function():Void {
clearInterval(seeker);
timePressed = 0;
seeker = setInterval(changePos, 100, -2);
};
fwd_btn.onPress = function():Void {
clearInterval(seeker);
timePressed = 1;
seeker = setInterval(changePos, 50, 1);
};
fwd_btn.onRelease = rew_btn.onRelease=function ():Void {
clearInterval(seeker);
timePressed = 1;
};
//////////seek
function changePos(dir:Number):Void {
timePressed++;
dir *= Math.ceil(timePressed/10);
var dest:Number = motionStream.time+dir;
if (dest<0) {
dest = 0;
}
if (dest>duration) {
dest = duration;
}
motionStream.seek(dest);
}
///////////////// volume
volumes.vd_mc.onPress = function():Void {
this.startDrag(false, 1, 5, 44, 5);
this.onMouseMove = changeVolume;
};
volumes.vd_mc.onRelease = volumes.vd_mc.onReleaseOutside=function ():Void {
this.stopDrag();
delete this.onMouseMove;
};
function changeVolume():Void {
var val:Number = Math.floor((this._x-7)*2.7);
soundControll.setVolume(val);
this._parent.vi_mc._x = this._x;
updateAfterEvent();
if (this._x < 2) {
_root.vol_ico.gotoAndStop(2);
}
if (this._x > 1) {
_root.vol_ico.gotoAndStop(1);
}
}
////// инит графики
vt_mc._width = 0;
// vt - индикатор времени
vl_mc._width = 0;
// vl - индикатор загруженного контентая
motion_mc.onEnterFrame = function():Void {
var proc:Number = Math.floor(motionStream.bytesLoaded/motionStream.bytesTotal*320);
vl_mc._width = proc<320 ? proc : 320;
var timer:Number = Math.ceil(motionStream.time/duration*320);
vt_mc._width = timer<320 ? timer : 320;
};
//volumes._y = 256;
volumes.vi_mc.setMask(volumes.vm_mc);
pause_btn._visible = false;
+ Креплю исходник.
Очень надеюсь на вашу помощь! Спасибо.
///////////////// MESSAGE 2
Я немного разобрался и понял, что длинну выдает вот это:
_root.ostal.ostal_clock.text=meta.duration+ "sec";
Но оно выглядит вот так "40,464 sec", а как мне сделать, чтобы писало в формате (МИНУТЫ : СЕКУНДЫ )
Спасибо.
///////////////// MESSAGE 2
Короче разобрался с тем который Считает сколько всего времени занимает ролик. Сделал это так:
function Ocruglenie(nbr:Number):String {
if(nbr < 10) {
return "0"+Math.floor(nbr);
} else {
return Math.floor(nbr).toString();
}
};
motionStream.onMetaData = function(meta:Object):Void {
duration = meta.duration;
/*событие возникает, когда плеер связывается с видеоФайлом, и получает от него Мета_данные в виде объекта.*/
for (var prop in meta) {
_root.ostal.ostal_clock.text=Ocruglenie(duration/60)+":"+Ocruglenie(duration%60);
}
};
А как теперь мне сделать, читобы таймер показывал текущее время воспроизведения???
Я думал сначала сделать обычный тамер, который начинает считать при нажатии на кнопку play, но это не катит, т.к. если скорость медленная у юзера, а ролик большой таймер не будет останавливаться когда воспроизведение начнет обгонять состояние загрузки.
Я так понимаю, что это нужно делать гдето тут:
motionStream.onStatus = function(motion_status:Object):Void {
for(var prop in motion_status) {
А чкак не знаю...
Ну посоветуйте Вы уже мне, хочть чтонибудь! Пожааалуйста!!!
1.Чтобы были одни часики, которые показывает текущее время воспроизведения.
2. Другие часики, на которых написана общая длина файла.
Вот код плеера:
// Stream FLV-player by Jonathan
// Разрешение видео - 320 x 240
var src:String = "letstalk.flv";
var flv_connect:NetConnection = new NetConnection();
flv_connect.connect(null);
var motionStream:NetStream = new NetStream(flv_connect);
var soundControll:Sound = new Sound(_level0);
var duration:Number = 0;
// длина ролика. ее мы будем получать по событию onMetaData
var seeker:Number = null;
// переменная для setInterval - для ускорения перемотки
var timePressed:Number = 0;
// таймер фиксирующий время нажатия клавиши перемотки
var onTheRun:Boolean = false;
// состояние плеера - проигрывается видео или нет
//////////Чтобы проигрывать видео необходимо создать экземпляр типа Video (Делается это в библиотеке)
motion_mc.motion_vid.attachVideo(motionStream);
motionStream.setBufferTime(2);
/// Указывает сколько секунд видео должно загрузиться чтобы началось воспроизведение. В процессе проигрывания, если первые 2 секунды уже проигрались, а вторая порция еще не подгрузилась происходит остановка, до тех пор пока не подгрузятся следубщие 2 секунды.
motionStream.onMetaData = function(meta:Object):Void {
duration = meta.duration;
/*событие возникает, когда плеер связывается с видеоФайлом, и получает от него Мета_данные в виде объекта.
Чтобы трассировать эти данные необходимо раскомментировать код.*/
//for (var prop in meta) {
// trace(prop+" = "+meta[prop]);
//}
};
motionStream.onStatus = function(motion_status:Object):Void {
//for(var prop in motion_status) {
//trace(prop + ": "+motion_status[prop]);
//};
//// Событие помогает отслеживать состояния воспроизведения - ошибки загрущки, остановку, начало, перемотку - читаем хелп, там все написано. Вот тут возможен момент - если готовить flv в Макромедиа Флеш8Видео энкодере - и подрезать там длину ролика - то это неблагоприятно сказывается на статусе СТОП. Вывод - не резать длину ролика в энкодере.
if (motion_status.code == "NetStream.Play.Stop") {
motionStream.seek(duration);
motionStream.pause(true);
play_btn._visible = true;
pause_btn._visible = false;
}
};
/*****КНОПКИ*****/
//PLAY
play_btn.onEnterFrame = function() {
if(this.direct) this.nextFrame();
else this.prevFrame();
}
play_btn.onRollOver = function() {
this.direct = true;
}
play_btn.onRollOut = function() {
this.direct = false;
}
play_btn.onRelease = function():Void {
this._visible = false;
pause_btn._visible = true;
if (onTheRun) {
if (vt_mc._width == 320) {
motionStream.seek(0);
}
motionStream.pause(false);
} else {
onTheRun = true;
motionStream.play(src);
}
};
//PAUSE
pause_btn.onEnterFrame = function() {
if(this.direct) this.nextFrame();
else this.prevFrame();
}
pause_btn.onRollOver = function() {
this.direct = true;
}
pause_btn.onRollOut = function() {
this.direct = false;
}
pause_btn.onRelease = function():Void {
this._visible = false;
play_btn._visible = true;
motionStream.pause(true);
};
//STOP
stop_btn.onEnterFrame = function() {
if(this.direct) this.nextFrame();
else this.prevFrame();
}
stop_btn.onRollOver = function() {
this.direct = true;
}
stop_btn.onRollOut = function() {
this.direct = false;
}
stop_btn.onRelease = function():Void {
motionStream.seek(0);
onTheRun = false;
pause_btn._visible = false;
play_btn._visible = true;
motionStream.close();
motion_mc.motion_vid.clear();
};
rew_btn.onPress = function():Void {
clearInterval(seeker);
timePressed = 0;
seeker = setInterval(changePos, 100, -2);
};
fwd_btn.onPress = function():Void {
clearInterval(seeker);
timePressed = 1;
seeker = setInterval(changePos, 50, 1);
};
fwd_btn.onRelease = rew_btn.onRelease=function ():Void {
clearInterval(seeker);
timePressed = 1;
};
//////////seek
function changePos(dir:Number):Void {
timePressed++;
dir *= Math.ceil(timePressed/10);
var dest:Number = motionStream.time+dir;
if (dest<0) {
dest = 0;
}
if (dest>duration) {
dest = duration;
}
motionStream.seek(dest);
}
///////////////// volume
volumes.vd_mc.onPress = function():Void {
this.startDrag(false, 1, 5, 44, 5);
this.onMouseMove = changeVolume;
};
volumes.vd_mc.onRelease = volumes.vd_mc.onReleaseOutside=function ():Void {
this.stopDrag();
delete this.onMouseMove;
};
function changeVolume():Void {
var val:Number = Math.floor((this._x-7)*2.7);
soundControll.setVolume(val);
this._parent.vi_mc._x = this._x;
updateAfterEvent();
if (this._x < 2) {
_root.vol_ico.gotoAndStop(2);
}
if (this._x > 1) {
_root.vol_ico.gotoAndStop(1);
}
}
////// инит графики
vt_mc._width = 0;
// vt - индикатор времени
vl_mc._width = 0;
// vl - индикатор загруженного контентая
motion_mc.onEnterFrame = function():Void {
var proc:Number = Math.floor(motionStream.bytesLoaded/motionStream.bytesTotal*320);
vl_mc._width = proc<320 ? proc : 320;
var timer:Number = Math.ceil(motionStream.time/duration*320);
vt_mc._width = timer<320 ? timer : 320;
};
//volumes._y = 256;
volumes.vi_mc.setMask(volumes.vm_mc);
pause_btn._visible = false;
+ Креплю исходник.
Очень надеюсь на вашу помощь! Спасибо.
///////////////// MESSAGE 2
Я немного разобрался и понял, что длинну выдает вот это:
_root.ostal.ostal_clock.text=meta.duration+ "sec";
Но оно выглядит вот так "40,464 sec", а как мне сделать, чтобы писало в формате (МИНУТЫ : СЕКУНДЫ )
Спасибо.
///////////////// MESSAGE 2
Короче разобрался с тем который Считает сколько всего времени занимает ролик. Сделал это так:
function Ocruglenie(nbr:Number):String {
if(nbr < 10) {
return "0"+Math.floor(nbr);
} else {
return Math.floor(nbr).toString();
}
};
motionStream.onMetaData = function(meta:Object):Void {
duration = meta.duration;
/*событие возникает, когда плеер связывается с видеоФайлом, и получает от него Мета_данные в виде объекта.*/
for (var prop in meta) {
_root.ostal.ostal_clock.text=Ocruglenie(duration/60)+":"+Ocruglenie(duration%60);
}
};
А как теперь мне сделать, читобы таймер показывал текущее время воспроизведения???
Я думал сначала сделать обычный тамер, который начинает считать при нажатии на кнопку play, но это не катит, т.к. если скорость медленная у юзера, а ролик большой таймер не будет останавливаться когда воспроизведение начнет обгонять состояние загрузки.
Я так понимаю, что это нужно делать гдето тут:
motionStream.onStatus = function(motion_status:Object):Void {
for(var prop in motion_status) {
А чкак не знаю...
Ну посоветуйте Вы уже мне, хочть чтонибудь! Пожааалуйста!!!