![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2013
Сообщений: 10
|
Какие путешествия в будущее? Я просто хочу узнать длительность ролика в секундах. И всего лишь использовать это значение в простом математическом выражении.
|
|
|||||
|
Регистрация: Jun 2012
Сообщений: 16
|
Какого ролика? Какой формат, как вы его загружаете?
|
|
|||||
|
Регистрация: Mar 2013
Сообщений: 10
|
dimensb, загружаю так:
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); |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 16
|
Да, вы действительно путешествуете в будущее
![]() Дело в том что ns вызовет обработчик onMetaData объекта customClient только когда получит метаданные. Когда вы пытаетесь вызвать его самостоятельно, таких данных у вас нет, поэтому вы и получали сообщение об ошибке. Ниже приведен рабочий пример (нарезан из разных примеров из интернет) 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); } } } |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 10
|
Спасибо за код, но я все равно не могу использовать metadata.duration. Понимаете, мне нужно использовать это число в другой функции.
Добавлено через 2 минуты кстати, еще в пакете добавил и (вместо Sprite). Это если у кого код будет ошибки выдавать. |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 16
|
Вы можете:
1. Вызвать функцию непосредственно в обработчике onMetaData 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); } Как бы то ни было, вы должны понимать что это значение будет доступно только после того, как выполнится обработчик onMetaData. |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 10
|
А как понять когда метаданные пришли и обработчик уже выполнился? Пробовал:
Добавлено через 7 минут Однако первый способ, с вызовом функции в обработчике работает, но очень, очень хотелось бы второй, с выводом в переменную. |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 16
|
Это асинхронный вызов и с этим ничего не поделать. Ваша процедура должна реагировать на изменение этого значения. То есть общая логика, используя словесное описание, должна быть такой:
Основная часть 1. Создать компоненты для загрузки flv, подключить обработчики. 2. Запросить flv. Все, дальше надо ждать. Обработчик 1. Получить длительность 2. Выполнить необходимый код Если вам по какой-то причине не подходит вызов внутри onMetaData, то вы можете послать свое сообщение, например так (впрочем это масло масляное) 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); } } } |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 10
|
Большое спасибо всем, кто отписался в этом топике за помощь, отдельная благодарность dimensb.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 21:43. |
|
|
« Предыдущая тема | Следующая тема » |
|
|