Lecture, pause et arrêt
Créez deux boutons sur votre scène :
lecture et
arret. Le bouton lecture permettra aussi de faire pause si on clique dessus, alors que la vidéo est déjà en cours de lecture.
Le code pour le bouton
lecture va être très simple, car il existe une méthode
pause() dans la classe NetStream.
Si on ne passe aucun argument à cette méthode, elle mettra la vidéo en pause si elle est en lecture, et en lecture si elle est en pause : exactement ce qu'on veut.
Code : Actionscript | lecture.onRelease = function() {
flux_video.pause();
};
|
Un brin plus compliqué, voyons maintenant le code pour le bouton
arret. Ce bouton a pour rôle de remettre la vidéo au début. Mais la classe ne possède pas de méthode "stop()".
Il va donc falloir ruser !

Il existe une méthode
seek(), qui permet de se positionner à un endroit de la vidéo en transmettant l'instant en secondes comme argument, un peu l'équivalent de la méthode
play() de la classe Sound.
On va donc positionner la vidéo à l'instant
0, et la mettre en pause immédiatement après. Le problème, c'est que
pause() ne met en pause que si la vidéo était en lecture ; or, nous on veut que la vidéo s'arrête à tous les coups ! Heureusement, on peut passer un argument à
pause() :
true si on veut arrêter la vidéo et
false, si on veut reprendre la lecture. Ce qui nous fait :
Code : Actionscript | arret.onRelease = function() {
flux_video.seek(0);
flux_video.pause(true);
};
|
Curseur de lecture
Comme pour le son, nous allons créer un curseur de lecture tout simple. Dessinez un rectangle plein, foncé, horizontal, et convertissez seulement l'intérieur en clip qu'on nommera :
curseur. Faites attention à bien placer le centre du clip en haut à gauche du rectangle !
Vous allez voir qu'on va retrouver le même problème que pour le son : on connaît la position actuelle de la tête de lecture en secondes avec la propriété
time de NetStream. Par contre, on ne connaît pas la durée totale. Alors, on pourrait utiliser la même astuce avec approximation de la durée totale, mais il existe une autre technique. Si les tags ID3 sont peu répandus pour les mp3, la plupart des vidéos FLV possèdent des métadonnées plus complètes.
La classe NetStream incorpore un événement
onMetaData qui va nous permettre de récupérer facilement la donnée qui nous intéresse. Cette méthode possède un argument, que nous appellerons
metadata, et qui contient justement les métadonnées du clip vidéo. Il ne reste plus qu'à savoir que la métadonnée qui contient la durée s'appelle
duration, et le tour est joué. On stockera la durée totale de notre vidéo dans la variable
tduration :
Code : Actionscript | flux_video.onMetaData = function(metadata) { // On donne un nom à la variable fournie par onMetaData
tduration = metadata.duration; // Et on récupère la valeur de cette variable
}
|
Je ne vous représente pas le principe de la proportionnalité

; pour faire avancer notre curseur, nous rajouterons donc :
Code : Actionscript | curseur.onEnterFrame = function() {
this._xscale = (flux_video.time/tduration)*100;
}
|
Dupliquez maintenant le clip
curseur pour faire un clip
selecteur de même taille et de même position, mais plus clair de couleur, et positionné en-dessous (au niveau des calques) de
curseur.
Nous allons ajouter du code pour pouvoir positionner la vidéo facilement, en cliquant sur
selecteur. Encore une fois, le code est très ressemblant à celui du son, il faut juste enlever la division par mille, puisqu'ici tout est donné en
secondes, et ne pas oublier que la méthode pour se placer dans une vidéo est
seek(). Si on reprend tout le code depuis le début, on aura donc :
Code : Actionscript 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | var connection:NetConnection = new NetConnection();
connection.connect(null);
var flux_video:NetStream = new NetStream(connection);
video.attachVideo(flux_video);
flux_video.play("ztele.flv");
lecture.onRelease = function() {
flux_video.pause();
};
arret.onRelease = function() {
flux_video.seek(0);
flux_video.pause(true);
};
flux_video.onMetaData = function(metadata) {
tduration = metadata.duration;
}
curseur.onEnterFrame = function() {
this._xscale = (flux_video.time/tduration)*100;
}
selecteur.onRelease = function() {
flux_video.seek((this._xmouse*tduration)/this._width);
}
|
Des fois, quand je clique pour changer la position, la vidéo se place un peu plus loin, il y a un bug ?
Non, c'est le comportement normal. En effet,
seek() ne place pas la tête de lecture exactement à un instant donné en secondes, mais à l'image clé de la vidéo la plus proche. Alors, si les images-clés de votre vidéo sont très espacées, il y aura un petit décalage, imperceptible la plupart du temps.
Chargeur
Il ne nous reste plus qu'à rendre la taille de
selecteur proportionnelle à l'état de chargement de la vidéo.
Bizarrement, les méthodes
getBytesLoaded() et
getBytesTotal() n'existent pas dans la classe NetStream...

Les développeurs ont préféré utiliser les propriétés
bytesLoaded et
bytesTotal, on se demande bien pourquoi...
Le code pour la barre de chargement sera donc le suivant :
Code : Actionscript | selecteur.onEnterFrame = function() {
this._xscale = (flux_video.bytesLoaded/flux_video.bytesTotal)*100;
if (this._xscale == 100) {
delete this.onEnterFrame;
}
};
|
Mais, comme pour le son, la taille de
selecteur étant devenue variable, il va falloir la stocker dans la variable, et utiliser
largeur à la place de
this._width par la suite.
En bref, voici le code complet et fonctionnel :
Code : Actionscript 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | var connection:NetConnection = new NetConnection();
connection.connect(null);
var flux_video:NetStream = new NetStream(connection);
video.attachVideo(flux_video);
flux_video.play("ztele.flv");
var largeur:Number = selecteur._width;
// On stocke la largeur maximale
lecture.onRelease = function() {
flux_video.pause();
};
arret.onRelease = function() {
flux_video.seek(0);
flux_video.pause(true);
};
flux_video.onMetaData = function(metadata) {
tduration = metadata.duration;
};
curseur.onEnterFrame = function() {
this._xscale = (flux_video.time/tduration)*100;
};
selecteur.onRelease = function() {
flux_video.seek((this._xmouse*tduration)/largeur);
};
selecteur.onEnterFrame = function() {
this._xscale = (flux_video.bytesLoaded/flux_video.bytesTotal)*100;
if (this._xscale == 100) {
delete this.onEnterFrame;
}
};
|