Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.04.2012, 21:07
fifa_sibir вне форума Посмотреть профиль Отправить личное сообщение для fifa_sibir Найти все сообщения от fifa_sibir
  № 1  
Ответить с цитированием
fifa_sibir
 
Аватар для fifa_sibir

Регистрация: Apr 2011
Адрес: Новосибирск
Сообщений: 103
Отправить сообщение для fifa_sibir с помощью ICQ
По умолчанию Полоса прогресса на видеоплеер.

Здравствуйте. Такая проблема, пишу свой видеоплеер для сайта. При выкладке на сервер оказалось что не совсем корректно работает прогрессбар,при щелчке по полосе прогресса место проигрывания видеоролика сдвигается намного ранее, только при 100 процентной загрузке начинает работать нормально. вот код:

Код AS3:
function progressFunction(e:MouseEvent):void{ // при щелчке..
	offset = Math.round(((durat*loaded) * e.currentTarget.mouseX)/200);
	ns.pause();
	ns.seek(offset);
	ns.resume();
}
ширина прогрессбара 200 пикселей.
durat - длина видеоролика
loaded - число загруженных байт (ns.bytesLoaded/ns.bytesTotal)

Подскажите пожалуйста где может быть ошибка? или может у кого есть рабочий вариант формулы?


Последний раз редактировалось fifa_sibir; 08.04.2012 в 21:11.
Старый 08.04.2012, 21:14
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
И что там за переменные? Мне вот не понятно, почему у вас offset зависит от loaded.

Старый 09.04.2012, 07:29
fifa_sibir вне форума Посмотреть профиль Отправить личное сообщение для fifa_sibir Найти все сообщения от fifa_sibir
  № 3  
Ответить с цитированием
fifa_sibir
 
Аватар для fifa_sibir

Регистрация: Apr 2011
Адрес: Новосибирск
Сообщений: 103
Отправить сообщение для fifa_sibir с помощью ICQ
Более подробно.
Код AS3:
var ns:NetStream;
var offset:int;
var loaded:Number = 0;
addEventListener(Event.ENTER_FRAME, Progress);
progress_mc.addEventListener(MouseEvent.CLICK, progressFunction);
 
function Progress(e:Event):void{
	loaded = ns.bytesLoaded/ns.bytesTotal; 
        progressfill_mc.x = Math.round(200*(ns.time/(durat * loaded)))-200;
}
 
public function onMetaData(Metadata:Object):void{
			var key:String;
			for (key in Metadata){
				trace(key + ": " + Metadata[key]);
				durat = Metadata.duration;
			}}
 
function progressFunction(e:MouseEvent):void{
	offset = Math.round(((durat / loaded) * e.currentTarget.mouseX)/200);
	ns.pause();
	ns.seek(offset);
	ns.resume();
}


Последний раз редактировалось fifa_sibir; 09.04.2012 в 08:47.
Старый 09.04.2012, 10:45
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 4  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Ну хорошо. Только нужно бы уточнить, что loaded - это "доля" загруженного ролика в интервале 0.0-1.0, не количество байт.

Теперь наводящие вопросы.
  • Что такое ns.time / durat? (какой у него физический смысл)?
  • Почему у вас индикатор прогресса зависит от того, какая часть файла загружена? Он показывает проигрывание? Или он показывает процесс загрузки? Или он показывает температуру на Марсе?
  • Какой физический смысл имеет ns.bytesTotal / ns.bytesLoaded? Вы offset ведь вычисляете по формуле (durat * (e.currentTraget.mouseX / 200) * (ns.bytesTotal/ns.bytesLoaded)). Два множителя я поинмаю, третий - нет.
Если вы ответите на вопросы (или хотя бы честно попытаетесь на них ответить), то вы поймете, почему при loaded=1 все работает нормально, а в других случаях - не работает.

Если что - да, я знаю ответ и правку. Но по коду вы или совсем не понимаете, что делает код (и пишете его методом тыка), либо плохо понимаете, что же он делает. Вот во втором случае вопросы и помогут понять, что же на самом деле вы написали в коде и что должно быть. Если не получится - жду ответов на вопросы, подскажу дальше. Ответы должны быть текстом, не кодом.

P.S. К проблеме оно отношения не имеет, но зачем присваивание durat = Metadata.duration в цикле? Это чтобы совсем надежно присвоилось?

Старый 09.04.2012, 13:14
fifa_sibir вне форума Посмотреть профиль Отправить личное сообщение для fifa_sibir Найти все сообщения от fifa_sibir
  № 5  
Ответить с цитированием
fifa_sibir
 
Аватар для fifa_sibir

Регистрация: Apr 2011
Адрес: Новосибирск
Сообщений: 103
Отправить сообщение для fifa_sibir с помощью ICQ
1. я как понимаю доля проигранного
2. Это полоса, показывающая место проигрывания видеоролика. Возможно да, я не подумала, переменная loaded тут не к чему
3. тут до меня вообще туго доходит)) если вы сказали что loaded это доля загруженного ролика, то надо поменять переменные местами (ns.bytesLoaded/ns.bytesTotal), я как поняла это нужно для поправки, потому как повторюсь, при 100% загрузки ролика место проигрывания начинается точно с того места где я щелкнула по прогрессбару, а при неполной загрузке он почему то косячит( т.е длина видеоролика получается как то зависит от загруженного процента?
может так уже ближе?)
Код AS3:
offset = Math.round(((durat * loaded) * e.currentTarget.mouseX)/200);

Старый 09.04.2012, 14:02
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 6  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Ага, так гораздо лучше. 1 - все правильно. Это действительно доля прогиранного. 2. Ну да, все правильно. duration - это приблизительное время всего файла. Не "уже загруженной части", а именно всего файла. Если умножить долю загруженного на долю проигранного, получится непонятная штука. Возможно, вы duration в метаданных неправильно трактуете.

По третьему пункту я всего лишь более строго переформулировал "loaded". В новой версии поправка уже лучше. Но не понятно, зачем она вам... у вас же есть соотношение progress_position = 200 * ns.time / durat (это из правильного п.2). Теперь простейшими математическими преобразованиями получаем, что ns.time = durat * (progress_position / 200). Ну и подставьте вместо progress_position ваш желаемый position (e.currentTarget.mouseX), получите то, что вам нужно для offset.

При полной загрузке loaded у вас равно единице. Посмотрите, как тогда выглядит формула (парой строчек выше я ее уже написал). Вот она вам и нужна.

P.S.
Цитата:
т.е длина видеоролика получается как то зависит от загруженного процента?
Ну да... Вы же сами в формуле зачем-то на загруженный процент умножаете. Вот и зависит А так зависеть не должно (время у вас отдельно в метаданных есть).

Старый 10.04.2012, 09:59
fifa_sibir вне форума Посмотреть профиль Отправить личное сообщение для fifa_sibir Найти все сообщения от fifa_sibir
  № 7  
Ответить с цитированием
fifa_sibir
 
Аватар для fifa_sibir

Регистрация: Apr 2011
Адрес: Новосибирск
Сообщений: 103
Отправить сообщение для fifa_sibir с помощью ICQ
maxkar, ура ура ура спасибо вам огромное, все заработало)

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:09.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:09.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.