Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как узнать длительность по времени flv файла? (http://www.flasher.ru/forum/showthread.php?t=122492)

nachalnik 12.03.2009 13:14

как узнать длительность по времени flv файла?
 
день добрый.
я совсем новичок в as3 . пробую написать flv-проигрыватель. никак не могу понять как мне узнать данные о длине видеофайла. нашел в хелпе в adobe flash cs3 professional пример, создал пустой fla файл и прописал для него базовый класс, куда добавил код из примера , который по их мнению должен вывести всю инфу.

Код AS3:

package
{
        import flash.net.NetConnection;
        import flash.net.NetStream;
        import flash.events.NetStatusEvent;
        import flash.media.Video;
        import flash.display.Sprite;
 
        public class test extends Sprite
        {
                public function test()
                {
// из примера
                        var nc:NetConnection = new NetConnection();
                        nc.connect(null);
                        var ns:NetStream = new NetStream(nc);
                        ns.client = this;
 
                        ns.play('video.flv');
                        var vid:Video = new Video();
                        vid.attachNetStream(ns);
                        addChild(vid);
// <<< из примера
                }
 
// из примера
                function onMetaData(infoObject:Object):void
                {
                        var key:String;
                        for (key in infoObject)
                        {
                                trace(key + ": " + infoObject[key]);
                        }
                }
// <<< из примера
        }
}

но он не работает и ошибок никаких не выдает. и вообще функция onMetaData не отрабоатывает. только видео проигрывается. есть может где нормальные рабочие примеры, а не левый хелп?

Fillini 12.03.2009 13:22

Код AS3:

private var FileSrc:String = "Video.flv";
private var videoStream:NetStream;
private var nc:NetConnection;
 
private var customClient:Object = new Object();
 
private var videoTotalSec:uint;
 
public function setFlv(src:String):void
                {
                        FileSrc = src;
 
                        removeEventListener(Event.ADDED_TO_STAGE, onAdd);
 
 
                        nc = new NetConnection();
                        nc.connect(null);
                        videoStream = new NetStream(nc);
                        videoStream.client = customClient;
                        customClient.onMetaData = onMetaDataHandler;
 
 
 
                        //trace(this.playPause);                       
                        this.videoObject.attachNetStream(videoStream);                       
                        videoStream.play(FileSrc);
                        videoStream.pause();
}
 
private function onMetaDataHandler(metadata:Object):void
                {
                        trace("MetaData length: " + metadata.duration);
                        videoTotalSec = metadata.duration;
                }

пользуйтесь ))

nachalnik 12.03.2009 13:46

Спасибо Fillini за быстрый ответ. Перебросил бебе ваш код, закомментировал только строку removeEventListener(Event.ADDED_TO_STAGE, onAdd)- вроде лишняя. Но по прежнему в окно output ничего не выводится. и ошибок тоже нет.

Fillini 12.03.2009 13:49

а видео проигрывает?

nachalnik 12.03.2009 13:52

видео проигрывает

iflamberg 12.03.2009 13:53

у меня примерно такой же код, что вы привели первым работает.


Код:

                function open (source:String) {
                        videoURL = source;
            connection = new NetConnection();
            connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            connection.connect(null);
                }
        private function netStatusHandler(event:NetStatusEvent):void {
                        //trace ("net status code: "+event.info.code);
            switch (event.info.code) {
                                case "NetStream.Play.Stop":
                                        isPlay = false;
                                break;
                case "NetConnection.Connect.Success":
                    connectStream();
                break;
                case "NetStream.Play.StreamNotFound":
                    trace("Unable to locate video: " + videoURL);
                break;
            }
        }

        private function connectStream():void {
            stream = new NetStream(connection);
            stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
                        //stream.addEventListener(flash.net., metaDataHandler);
            stream.play(videoURL);
                        //stream.client = new MetaDataClient();
                        stream.client = this;
            //addChild(video);
                        video = new Video();
                        video.attachNetStream(stream);
                        video.addEventListener (Event.ENTER_FRAME, videoEnterFrameHandler);
                        addChildAt(video, 0);
                        //video.width = 400; video.height = 300;
                        trace ("video.width=" + video.width + " video.height=" + video.height);
                        video.width = Main.cur.realWidth; video.height = Main.cur.realHeight;
                        control.x = (video.width - control.width) / 2;
                        control.y = video.height - control.height - 10;
                        isPlay = true;
        }

                public function onMetaData(info:Object):void {
                        //trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
                        duration = info.duration;
                }


nachalnik 12.03.2009 14:15

попробовал ваш код под себя переписать , но только видео проигрывается.
у меня получился вот такой код базового класса. может есть какие недоделки?
Код AS3:

package
{
        import flash.net.NetConnection;
        import flash.net.NetStream;
        import flash.events.NetStatusEvent;
        import flash.media.Video;
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class test extends Sprite
        {
                private var FileSrc:String = "Video.flv";
                private var videoStream:NetStream;
                private var nc:NetConnection;
                private var customClient:Object = new Object();
                private var videoTotalSec:uint;
                private var videoObject:Video = new Video();
 
                public function test()
                {
                        this.setFlv('video.flv');
                }
 
                public function setFlv(src:String):void
                {
                        FileSrc = src;
 
                        nc = new NetConnection();
                        nc.connect(null);
                        videoStream = new NetStream(nc);
                        videoStream.client = customClient;
                        customClient.onMetaData = onMetaDataHandler;
 
                        addChild(videoObject);
                        videoObject.attachNetStream(videoStream);                       
                        videoStream.play(FileSrc);
                        //videoStream.pause();
                }
 
                private function onMetaDataHandler(metadata:Object):void
                {
                        trace("MetaData length: " + metadata.duration);
                        videoTotalSec = metadata.duration;
                }
 
        }
}


dimarik 12.03.2009 14:23

А в видеофайле метадата вообще есть?

Jex 12.03.2009 14:31

Для кадра

Код AS3:

var nc:NetConnection = new NetConnection();
nc.connect(null);
var movie:NetStream = new NetStream(nc);
movie.play("movie.flv");
var vid:Video = new Video();
vid.attachNetStream(movie);
 
addChild(vid);
movie.client = this;
 
function onMetaData(infoObject:Object):void
{
        var key:String;
        for (key in infoObject) {
    trace(key + ": " + infoObject[key])}
 
        trace (infoObject.duration);
}


nachalnik 12.03.2009 14:33

я думал что в каждом видеофайле они полюбому быть должны. щас глянул это видео на каком-то готовом проигрывателе , а там нет бегунка на полосе времени клипа и время указано в 00:00-- получается что нет метаданных по которым, как я понимаю можно построить бегунок на шкале времени и определтить само время

Добавлено через 2 минуты
Ребята , спасибо всем за помощь . действительно метаданных не было в файлах, которые воспроизводил. скачал новых --- и пришло счастье)))) поднял я шум ни из-за чего. все работает!!!


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

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