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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.03.2013, 16:03
Newfag вне форума Посмотреть профиль Отправить личное сообщение для Newfag Найти все сообщения от Newfag
  № 11  
Ответить с цитированием
Newfag

Регистрация: Mar 2013
Сообщений: 10
Какие путешествия в будущее? Я просто хочу узнать длительность ролика в секундах. И всего лишь использовать это значение в простом математическом выражении.

Старый 04.03.2013, 16:06
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 12  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Какого ролика? Какой формат, как вы его загружаете?

Старый 04.03.2013, 16:11
Newfag вне форума Посмотреть профиль Отправить личное сообщение для Newfag Найти все сообщения от Newfag
  № 13  
Ответить с цитированием
Newfag

Регистрация: Mar 2013
Сообщений: 10
dimensb, загружаю так:

Код AS3:
var nc:NetConnection = new NetConnection(); 
nc.connect(null);
var ns:NetStream = new NetStream(nc); 
ns.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler); 
 
function netStatusHandler(event:NetStatusEvent):void 
{ 
    // handle netStatus events, described later 
}
 
 
ns.client = customClient; 
 
 
ns.play("video.flv");
vid.attachNetStream(ns);
Формат - flv.

Старый 04.03.2013, 16:32
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 14  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Да, вы действительно путешествуете в будущее

Дело в том что ns вызовет обработчик onMetaData объекта customClient только когда получит метаданные.
Когда вы пытаетесь вызвать его самостоятельно, таких данных у вас нет, поэтому вы и получали сообщение об ошибке. Ниже приведен рабочий пример (нарезан из разных примеров из интернет)

Код AS3:
package
{
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
 
	public class Test extends Sprite
	{
		public function Test()
		{
                        var vid:Video = new Video(320, 240);
			addChild(vid);
 
			var nc:NetConnection = new NetConnection();
			nc.connect(null);
 
			var ns:NetStream = new NetStream(nc);
			vid.attachNetStream(ns);
 
			var listener:Object = new Object();
			listener.onMetaData = onMetaData;
			ns.client = listener;
 
                        // Первое попавшееся видео в формате flv 
 
			ns.play("http://www.mediacollege.com/video-gallery/testclips/barsandtone.flv");
		}
 
                // Будет вызвана автоматически
 
		function onMetaData(metadata:Object):void 
		{
			var lengthOfVideo:Number = int(metadata.duration * 1000)+1;
			trace("Length of flv from metadata = " + lengthOfVideo);
		}
      }
}

Старый 04.03.2013, 16:50
Newfag вне форума Посмотреть профиль Отправить личное сообщение для Newfag Найти все сообщения от Newfag
  № 15  
Ответить с цитированием
Newfag

Регистрация: Mar 2013
Сообщений: 10
Спасибо за код, но я все равно не могу использовать metadata.duration. Понимаете, мне нужно использовать это число в другой функции.

Добавлено через 2 минуты
кстати, еще в пакете добавил
Код AS3:
 	import flash.display.*;
и
Код AS3:
public class Test extends MovieClip
(вместо Sprite). Это если у кого код будет ошибки выдавать.

Старый 04.03.2013, 16:56
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 16  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Вы можете:

1. Вызвать функцию непосредственно в обработчике onMetaData
Код AS3:
function yourProcedure(duration:Number):void
{
	trace(duration);
}
 
function onMetaData(metadata:Object):void 
{
	var lengthOfVideo:Number = int(metadata.duration * 1000)+1;
	trace("Length of flv from metadata = " + lengthOfVideo);
        yourProcedure(lengthOfVideo);
}
2. Сохранить значение в этой функции и использовать его позднее (или добавить его в массив, если нужна история значений)
Код AS3:
 
private var lastDuration:Number;
 
function onMetaData(metadata:Object):void 
{
	var lengthOfVideo:Number = int(metadata.duration * 1000)+1;
	trace("Length of flv from metadata = " + lengthOfVideo);
        lastDuration = lengthOfVideo;
}
Как бы то ни было, вы должны понимать что это значение будет доступно только после того, как выполнится обработчик onMetaData.

Старый 04.03.2013, 17:12
Newfag вне форума Посмотреть профиль Отправить личное сообщение для Newfag Найти все сообщения от Newfag
  № 17  
Ответить с цитированием
Newfag

Регистрация: Mar 2013
Сообщений: 10
А как понять когда метаданные пришли и обработчик уже выполнился? Пробовал:
Код AS3:
if(isPlaying){
trace(lastDuration);
}
 
NaN
Добавлено через 7 минут
Однако первый способ, с вызовом функции в обработчике работает, но очень, очень хотелось бы второй, с выводом в переменную.

Старый 04.03.2013, 17:30
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 18  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Это асинхронный вызов и с этим ничего не поделать. Ваша процедура должна реагировать на изменение этого значения. То есть общая логика, используя словесное описание, должна быть такой:

Основная часть
1. Создать компоненты для загрузки flv, подключить обработчики.
2. Запросить flv.
Все, дальше надо ждать.

Обработчик
1. Получить длительность
2. Выполнить необходимый код

Если вам по какой-то причине не подходит вызов внутри onMetaData, то вы можете послать свое сообщение, например так (впрочем это масло масляное)

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
 
	public class TestNc extends Sprite
	{
		private static const METADATA_OBTAINED_EVENT_STR:String = "METADATA_OBTAINED";
 
		private var duration:Number;
 
		public function TestNc()
		{
			var vid:Video = new Video(320, 240);
			addChild(vid);
 
			var nc:NetConnection = new NetConnection();
			nc.connect(null);
 
			var ns:NetStream = new NetStream(nc);
			vid.attachNetStream(ns);
 
			var listener:Object = new Object();
			listener.onMetaData = onMetaData;
			ns.client = listener;
 
			addEventListener(METADATA_OBTAINED_EVENT_STR, onMetaDataObtained);
 
			// Первое попавшееся видео в формате flv 
 
			ns.play("http://www.mediacollege.com/video-gallery/testclips/barsandtone.flv");
		}
 
		// Будет вызвана автоматически
 
		private function onMetaData(metadata:Object):void 
		{
			duration = metadata.duration;
			dispatchEvent(new Event(METADATA_OBTAINED_EVENT_STR));
		}
 
		private function onMetaDataObtained(e:*)
		{
			trace(duration);
		}
	}
}

Старый 04.03.2013, 17:46
Newfag вне форума Посмотреть профиль Отправить личное сообщение для Newfag Найти все сообщения от Newfag
  № 19  
Ответить с цитированием
Newfag

Регистрация: Mar 2013
Сообщений: 10
Большое спасибо всем, кто отписался в этом топике за помощь, отдельная благодарность dimensb.

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

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

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


 


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


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