• User

    video player flv

    Ciao a tutti del forum

    Ho costruito un video player personalizzato con dei pulsanti creati con photoshop.
    In pratica manda in esecuzione un filmato spezzettato -tipo compilation- in vari files *flv

    Le azioni dei pulsanti le ho prese dal manuale ufficiale flash 8 pro.
    Ho associato il seguente codice AS2:

    **import mx.controls.MediaPlayback;
    var videoLoaderIndex:Number = 0;
    var videoPlayerIndex:Number = 0;
    var videoList:Array = new Array("uno.flv","due.flv","tre.flv","quattro.flv","cinque.flv","sei.flv);

    vidComp.contentPath = videoList[0];
    vidName.text = vidComp.contentPath;

    function eready(e:Object):Void {
    if( videoLoaderIndex < videoList.length) {
    videoLoaderIndex++;
    vidComp.activeVideoPlayerIndex = videoLoaderIndex;
    vidComp.load( videoList[videoLoaderIndex] );
    }
    }

    vidComp.addEventListener("ready", eready);
    function ecomplete(e:Object):Void {
    ++videoPlayerIndex;
    if (videoPlayerIndex>=videoList.length) {
    videoPlayerIndex = 0

    }

    vidComp.activeVideoPlayerIndex = videoPlayerIndex;
    vidComp.visibleVideoPlayerIndex = videoPlayerIndex;
    vidComp.play();
    vidName.text = e.target.contentPath;

    }

    vidComp.addEventListener("complete",ecomplete);

    vidComp.playButton = btnPlay;
    vidComp.pauseButton = btnPause;
    vidComp.stopButton = btnStop;
    vidComp.backButton = btnBack;
    vidComp.forwardButton = btnForward;
    vidComp.volumeBar = cVolumeBar;
    vidComp.seekBar = cSeekBar;

    **Funziona bene ma ho queste necessità, se si possono fare con Flash 8 pro e AS2 ovviamente:

    -premendo il pulsante BACK il video flv corrente in esecuzione riparte dall'inizio >>> io invece vorrei tornare al video immediatamente precedente e fare partire quello (se vedo il video 3 vorrei tornare al video 2 e non all'inizio del video 3)

    -il player funziona in loop, cioè alla fine dell'ultimo filmato flv riparte automaticamente con il primo filmato della serie >>> io invece vorrei che rimanesse lì fermo in standby....in attesa di comando.

    -il pulsante FORWARD invece mi soddisfa; dopo lo scaricamento totale del filmato flv dal server, se premuto passa in esecuzione il filmato successivo.

    ** In definitiva vorrei per il pulsante BACK la possibilità di tornare indietro di un filmato ogni volta che viene premuto.
    **
    Volevo associare a questo video player un file xml che funzionasse come una PLAYLIST, dove selezionare i filmati per l'esecuzione.
    Non sono ancora arrivato a questo livello....purtroppo.
    Non voglio nemmeno usare un pacchetto precompilato pronto uso (che ti dà l'swf e l'xml per la compilation), non perchè lo devo pagare ma perchè devo imparare....
    In ogni caso continuo a studiare perchè flash mi appassiona tantissimo.
    Grazie per l'attenzione e l'eventuale aiuto.
    🙂


  • Super User

    Ciao,
    basta che quando clicchi back, decrementi di uno videoLoaderIndex e assegni
    vidComp.load( videoList[videoLoaderIndex] );


  • User

    @Flep said:

    Ciao,
    basta che quando clicchi back, decrementi di uno videoLoaderIndex e assegni
    vidComp.load( videoList[videoLoaderIndex] );

    Ciao Flep, ben trovato!

    Ci capisco ancora poco nella sintassi!
    Dalla tua indicazione penso che devo dare un'azione, quindi un codice, al solo pulsante BACK.
    Mi sono concentrato su di lui e ho provato a pasticciare così:

    VideoList = ["uno.flv","due.flv","tre.flv","quattro.flv"];

    var listenerObject:Object = new Object();
    var n = 0;
    listenerObject.complete = function(eventObject:Object):Void {
    VidComp.backButton.onPress = function() {
    if(n > 0){
    n--;
    VidComp.contentPath = VideoList;
    }
    };
    VidComp.forwardButton.onPress = function() {
    if(n<VideoList.length){
    n++;
    VidComp.contentPath = VideoList;
    }
    };
    };
    listenerObject.complete = function(eventObject:Object):Void {
    n++;
    if (n<VideoList.length) {
    VidComp.contentPath = VideoList;
    }
    };
    player.addEventListener("complete",listenerObject);
    player.contentPath = VidComp[0];

    Ovviamente non funziona.


  • Super User

    Adesso dopo la riga:
    VidComp.contentPath = VideoList;
    devi far partire il video


  • User

    @Flep said:

    Adesso dopo la riga:
    VidComp.contentPath = VideoList;
    devi far partire il video

    E' miracoloso che sono riuscito ad arrivare fino a qua....
    Flep, che cosa devo scrivere in AS2 per fare partire questo accidente di player video?:?
    Help me please!

    .........................................................
    Ad ogni modo, siccome sono un caparbio :x, oggi ho finalmente pasticciato tutto il giorno in AS3 per la prima volta.
    Dopo aver consultato Macromedia ho costruito graficamente lo stesso lettore video, creato un file XML con la compilation, e e usato questo codice in un file esterno:

    **package {
    import fl.controls.*;
    import fl.events.SliderEvent;

    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.NetStatusEvent;
    import flash.events.TimerEvent;
    import flash.media.SoundTransform;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.utils.Timer;
    
    public class VideoJukebox extends Sprite {
        
        private const PLAYHEAD_UPDATE_INTERVAL_MS:uint = 10;
    
        private const PLAYLIST_XML_URL:String = "playlist.xml";
    
        private var client:Object;
    
        private var idx:uint = 0;
    
        private var meta:Object;
        private var nc:NetConnection;
        private var ns:NetStream;
        private var playlist:XML;
        private var t:Timer;
        private var uldr:URLLoader;
        private var vid:Video;
        private var videosXML:XMLList;
        
        private var volumeTransform:SoundTransform;
    
        public function VideoJukebox() {
            
        uldr = new URLLoader();
        uldr.addEventListener(Event.COMPLETE, xmlCompleteHandler);
        uldr.load(new URLRequest(PLAYLIST_XML_URL));
        }
    
        private function xmlCompleteHandler(event:Event):void {
        playlist = XML(event.target.data);
        videosXML = playlist.video;
        main();
        }
    
        
        private function main():void {
            volumeTransform = new SoundTransform();
            client = new Object();
            client.onMetaData = metadataHandler;
    
            nc = new NetConnection();
            nc.connect(null);
            ns = new NetStream(nc);
            ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            ns.client = client;
    
            vid = new Video();
            vid.x = 20;
            vid.y = 75;
            vid.attachNetStream(ns);
            addChild(vid);
    
            playVideo();
    
            t = new Timer(PLAYHEAD_UPDATE_INTERVAL_MS);
            t.addEventListener(TimerEvent.TIMER, timerHandler);
    
            positionBar.mode = ProgressBarMode.MANUAL;
    
            volumeSlider.value = volumeTransform.volume;
            volumeSlider.minimum = 0;
            volumeSlider.maximum = 1;
            volumeSlider.snapInterval = 0.1;
            volumeSlider.tickInterval = volumeSlider.snapInterval;
    
            volumeSlider.liveDragging = true;
            volumeSlider.addEventListener(SliderEvent.CHANGE, volumeChangeHandler);
    
            playButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);
            pauseButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);
            stopButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);
            backButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);
            forwardButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);
        }
        
        private function volumeChangeHandler(event:SliderEvent):void {
            
            volumeTransform.volume = event.value;
            ns.soundTransform = volumeTransform;
        }
    
        private function netStatusHandler(event:NetStatusEvent):void {
            try {
                switch (event.info.code) {
                    case "NetStream.Play.Start" :
                        t.start();
                        break;
                    case "NetStream.Play.StreamNotFound" :
                    case "NetStream.Play.Stop" :
                        t.stop();
                        playNextVideo();
                        break;
                }
            } catch (error:TypeError) {
            }
        }
    
        private function metadataHandler(metadataObj:Object):void {
            meta = metadataObj;
            vid.width = meta.width;
            vid.height = meta.height;
            positionBar.move(vid.x, vid.y + vid.height);
            positionBar.width = vid.width;
        }
    
        private function getVideo():String {
            return videosXML[idx].@url;
        }
    
        
        private function playVideo():void {
            var url:String = getVideo();
            ns.play(url);
        }
    
        private function playPreviousVideo():void {
            if (idx > 0) {
                idx--;
                playVideo();
                positionBar.visible = true;
            }
        }
    
        private function playNextVideo():void {
            if (idx < (videosXML.length() - 1)) {
                idx++;
                playVideo();
                positionBar.visible = true;
            } else {
                idx++;
                vid.clear();
                positionBar.visible = false;
            }
        }
    
        private function buttonClickHandler(event:MouseEvent):void {
    
        switch (event.currentTarget) {
        case playButton :
            ns.resume();
            break;
        case pauseButton :
            
            ns.togglePause();
            break;
        case stopButton :
            
            ns.pause();
            ns.seek(0);
            break;
        case backButton :
            playPreviousVideo();
            break;
        case forwardButton :
            
            playNextVideo();
            break;
    }
    

    }
    private function timerHandler(event:TimerEvent):void {
    try {

                positionBar.setProgress(ns.time, meta.duration);
                positionLabel.text = ns.time.toFixed(1) + " of " + meta.duration.toFixed(1) + " seconds";
            } catch (error:Error) {
                
            }
        }
    }
    

    }
    **

    Ho aggiunto i miei ormai famosi pulsanti e i componenti FLV.
    Tutto funziona alla perfezione, persino il BACK.
    In Locale funziona, devo caricare tutto nel server e vedere cosa succede....

    Anche qui però ci sono delle cosuccie che mi disturbano:(:

    -alla fine dell'ultimo video il visualizzatore scompare, e va bene, però se premo PLAY non succede niente, se premo BACK riparte l'ultimo filmato della lista, se premo STOP e poi nuovamente PLAY si riassetta il tutto.....in poche parole mi sembra poco intuitivo per l'utilizzatore a mio parere.
    Come posso ovviare ?

    Poi due problemoni, per me adesso insormontabili da neofita ignorante di AS3:bho::

    1- Nella pagina ho 4 pulsanti con altrettanti link a pagine web.
    La sintassi AS2 di Flash8pro:
    on (release) {
    getURL("http://www.pincopallino.html","_self");
    Non va più bene e non viene accettata in AS3 tramite il pannello comportamenti.

    2 - Non so assolutamente come ripristinare la casella di testo dinamico che evidenziava il -nome del file *FLV in esecuzione e stava bene un casino.
    In AS2 usavo:
    vidComp.contentPath = videoList[0];
    vidName.text = vidComp.contentPath;
    Che ovviamente fon funziona più in AS3.

    Lo so che rompo all'inverosimile ma....Flep e Onsitus potreste darmi una mano (anzi due?).....sia nell'uno che nell'altro caso, cioè in AS2 e in AS3.
    Troppo complicato per il mio livello di conoscenza; va bene il lavoro grosso ma sono le sfumature che fanno la differenza nel lavoro.
    Grazie in ogni caso per l'attenzione.:)


  • User

    OK, mi sembra adesso che il videoplayer in AS3 funziona come deve; è decisamente più funzionale del medesimo programmato in AS2.

    Vorrei solo aggiungere un altro pulsante nello stage che mi permetta se cliccato il collegamento a una pagina Web.

    Ho fatto un esperimento in un nuovo documento flash cs3 con un pulsante e provato la seguente funzione AS3, dove -mioBottone- è l'istanza del pulsante:

    function gotoGoogle(event:MouseEvent):void
    {
    var adobeURL:URLRequest = new URLRequest("http://www.google.it/");
    navigateToURL(googleURL);
    }
    mioBottone.addEventListener(MouseEvent.CLICK, gotoGoogle);

    Funziona, nel senso che si apre la pagina di Google.

    Bene, se inserisco il pulsante in un nuovo livello del videoplayer con la medesima sintassi in AS3 però NON FUNZIONA!:(
    Dov'è l'errore?

    Grazie per l'attenzione.


  • Super User

    @gabs said:

    function gotoGoogle(event:MouseEvent):void
    {
    var adobeURL:URLRequest = new URLRequest("http://www.google.it/");
    navigateToURL(googleURL);
    }
    mioBottone.addEventListener(MouseEvent.CLICK, gotoGoogle);

    Ma l'hai scritto come l'hai postato? C'e l'adobeURL' in mezzo che non c'entra nulla.:bho:


  • User

    @Onsitus said:

    Ma l'hai scritto come l'hai postato? C'e l'adobeURL' in mezzo che non c'entra nulla.:bho:

    Ciao Onsitus, grazie per la risposta.

    Ho sbagliato la trascrizione, nel mio file flash cs3 la sintassi è giusta.

    Il comando al videoplayer avviene tramite file ActionScript Flash esterno: credo che sia lì che bisogna scrivere e non nel livello del file *fla.
    Credo manchi qualcosa da associare all'azione di cui sopra....

    Mi aiuti?
    :bho:


  • Super User

    Ciao Gabs,
    mi dispiace ma sono alle base con as3 (sono flash designer e non developer). Come punto di studio per as3 ti racommando flepstudio.org.;)