PDA

Просмотр полной версии : Видео плеер. Смещение ползунка при его отпускании.


Art_133
19.01.2009, 16:30
Здравствуйте.
Делаю видео плеер. За основу беру уроки с сайта gotoAndLearn.com.
Есть небольшая проблема которую я пока не знаю как решить.
Когда начинаешь перематывать видео ползунком то при его отпускании он немного смещается, а иногда даже сильно. Это можно видеть когда просто перетаскиваешь его по линие, а также это сильно видно когда его дотягиваешь до конца (и немного дальше протянуть, он останется у конца полосы а сама мышь уйдёт правее) - он не остаётся на необходимом месте, а двигается левее (иногда даже значительно левее).

Это можно глянуть по ссылке http://webtok.ru/Art/vid/

Надеюсь проблема ясна, если кто-нибудь знает прошу подсказать решение.
За ранее спасибо!
Прилагаю исходник и код

Stage.scaleMode = 'noScale';
setProperty('', _quality, 'BETS');
//
var playControl:Boolean = true;
var controll = player.controllPanel;// путь к панеле упревления видео потока
//
controll.loadStripe.loadBar.setMask(controll.loadStripe.masker);// маска для полосы загрузки

var pl:NetConnection = new NetConnection();
pl.connect(null);

var ns:NetStream = new NetStream(pl);

player.videoStream.vid.attachVideo(ns);
ns.play('vid10.flv');
//ns.play('http://webtok.ru/Art/vid/vid10.flv');
ns.pause(playControl);



// загрузчик
var loaderInterval = setInterval(loadStatus, 100);
var persentLoaded:Number;
var duration:Number;

ns.onMetaData = function(obj) {
duration = obj.duration;
};

function loadStatus() {
persentLoaded = ns.bytesLoaded / ns.bytesTotal;
controll.loadStripe.masker._width = persentLoaded * 313;
controll.loadStripe.drager._x = ns.time / duration * 313;
//controll.loadStripe.drager._x = ns.time / duration * 298 + 7;
controll.loadStripe.timeLine._x = controll.loadStripe.drager._x - 313;
}

// Полоса прокрутки
var dragerInterval;

player.controllPanel.loadStripe.drager.onPress = function() {
clearInterval(loaderInterval);
dragerInterval = setInterval(dragit, 10);
startDrag(this, false, 0, this._y, 313, this._y);
//startDrag(this, false, 7, this._y, 305, this._y);
};

player.controllPanel.loadStripe.drager.onRelease = player.controllPanel.loadStripe.drager.onReleaseOutside = function () {
clearInterval(dragerInterval);
loaderInterval = setInterval(loadStatus, 100);
this.stopDrag();
};

function dragit() {
ns.seek((player.controllPanel.loadStripe.drager._x / 313) * duration);
}

// Кнопки
//Play
controll.pl_but.onRelease = function() {
if (playControl) {
this.gotoAndStop(2);
playControl = false;
ns.pause(playControl);
} else {
this.gotoAndStop(1);
playControl = true;
ns.pause(playControl);
}
};

zzz_dmg
19.01.2009, 16:59
хм. все нормально. ползунок двигается как надо. а сильно смещается в левую сторону, когда дотягиваешь до конца в том случае, если видео до конца не загружено (т.е. смещается до загруженного фрагмента). что-то проблемы я не вижу или я не понимаю вопроса

Art_133
19.01.2009, 17:08
"а сильно смещается в левую сторону, когда дотягиваешь до конца в том случае, если видео до конца не загружено" когда полностью загружено тоже такое происходит.
Что бы точнее понять проблему нажмите пожалуйста паузу и по перетаскиваете ползунок. При отпускании его он не станет точно на то же место, а сместиться. Иногда совсем на немного иногда сильно.

zzz_dmg
19.01.2009, 18:04
насколько я поняла у вас проблема в том, что в функции loadStatus() вы перезадаете величину controll.loadStripe.drager._x
а там должна считаться величина ns.time
вместо строчки
controll.loadStripe.drager._x = ns.time / duration * 313;

пропишите в функции loadStatus()
ns.time = controll.loadStripe.drager._x * duration * 313;

Art_133
19.01.2009, 18:45
Я так понимаю что проблема из-за не соответствия вычислений
Этого
controll.loadStripe.drager._x = ns.time / duration * 313;

и
ns.seek((player.controllPanel.loadStripe.drager._x / 313) * duration);

Когда отпускаешь ползунок (запускается функция loadStatus() в которой прописано
controll.loadStripe.drager._x = ns.time / duration * 313;

Цифры координат не совпадают и происходит смещение.

Ваш совет работает, но только ползунок теперь не двигается...

Добавлено через 15 часов 59 минут
Не ужели никто не сталкивался с подобным? Может у Вас есть другой метод реализации подобной функции с перемоткой?

Stargazer
10.02.2009, 14:24
Сейчас тоже поставил себе задачу поработать с видео. Пока ничего не делал - собираю материал :), так что вполне могу сказать "не в тему", но... разве видео может проигрываться с любого кадра? Я думаю, что видео может начинаться только с определённых кадров. По-моему, на многих флешплеерах ползунок и видео играются несколько левее, чем то, что хочешь указать.

джонатан
10.02.2009, 14:40
Верно Stargazer, все зависит от колличества ключевых кадров. Если вы сконвертируете видео с 2-умя ключевыми кадрами то как бы вы не старались, видео перематываться будет, только на 2 этих ключевых кадра.

Art_133
18.02.2009, 19:51
Сегодня весь день сидел так и не нашел решения пока... Заметил что аналогичный глюк встречается часто в некоторых плеерах, а также в плеере на сайте Adobe (если найду дам ссылку позже).
Может кто глянет "свежим" взглядом и подскажет как решить проблему?

Добавлено через 3 минуты
Смещение ползунка при отпускание - чёрт с ним пусть будет. Но если резко протянуть бегунок к концу видео то ползунок вёрнётся на несколько пикселей левее и видео застопорится...

bpiter
21.10.2009, 18:39
Если известны: общее количество байт, кол-во загруженных байт и общее время воспроизведения, можно решить задачу по формуле:

ЗАГРУЖЕННЫЕ БАЙТЫ / (ОБЩЕЕ КОЛ-ВО БАЙТ / ОБЩЕЕ КОЛ-ВО СЕКУНД)

отталкиваясь от полученного общедоступного количества секунд, можно правильно организовать seek в этом диапазоне

amexdesign
22.10.2009, 00:43
попробуй вот так:
function dragit() {
ns.seek(Math.floor((player.controllPanel.loadStripe.drager._x / 313) * duration));
}