La partie SLMedia du projet SLExtensions contient tout le nécessaire pour réaliser un player video. Contrairement à un projet comme SMF qui vous fourni un contrôle tout prêt, SLMedia vous fourni des classes “Controller” vous permettant de développer votre player à base de MVVM. Si un player packagé est simple à templater, il trouve vite ses limites lorsque vous voulez intégrer des comportements spécifiques.
Il y a quelque temps sur ce blog j’avais commencé la création d’un player video ici et ici. SLMedia a évolué je vais donc mettre à jour mes exemples.
Affichage de la vidéo
La classe principale de gestion reposant sur la notion de playlist, le passage d’un élément smoothstreaming à un élément video normal n’était pas aisé. Le conteneur affichant la vidéo (le MediaElement ou le SmoothStreamingMediaElement) et maintenant déterminé en fonction du IMediaElement courrant. Pour être plus facilement modulaire et pour permettre de séparer la librairie affichant du smoothstreaming, les éléments video reposent sur des VideoAdapters qui se chargent de la création et de s’attacher aux différents événements des composants videos.
Le design de l’application n’a plus qu’à créer un ContentControl et récupérer le contrôle d’affichage à partir du VideoController.
<ContentControl Content="{Binding VideoAdapter.Content}"
VerticalContentAlignment="Stretch"
HorizontalContentAlignment="Stretch" />
Etats visuels
Grâce à Silverlight 4 qui permet maintenant de faire du binding sur des objets de type DependencyObject, l’écriture d’un MapState est un peu simple. Il suffit de binder la propriété Value sur l’objet à surveiller. Et lorsque la valeur change, en fonction des différents mappings définis, l’état visuel correspondant sera déclenché.
<i:Interaction.Behaviors>
<slint:MapState Value="{Binding IsPlaying}">
<slint:MapStateMapping StateName="Playing"
Value="true" />
<slint:MapStateMapping StateName="Paused"
Value="false" />
</slint:MapState>
</i:Interaction.Behaviors>
StringFormat
De même, grâce à Silverlight 4, exit le StringFormatConverter. Il est maintenant possible de directement spécifier la conversion en string dans l’objet Binding.
<TextBlock Text="{Binding Path=BufferingProgress, Mode=TwoWay, StringFormat=p}" />
La playlist
Le MediaController fournit maintenant des commandes permettant de naviguer dans la playlist. Il suffit de relier deux boutons Précédent / Suivant à ces commandes pour passer d’un élément à l’autre. De même, pour enchainer les éléments à la fin de la lecture, il suffit d’activer la propriété IsChaining.
<slvideo:VideoController x:Name="controller"
AutoPlay="True"
IsChaining="True">
<slvideo:VideoController.Playlist>
<slvideo:VideoItem Source="http://labs.ucaya.com/lake.wmv" />
<slvideoSmooth:SmoothVideoItem Source="http://mediadl.microsoft.com/mediadl/iisnet/smoothmedia/Experience/BigBuckBunny_720p.ism/Manifest" />
<slvideo:VideoItem Source="http://labs.ucaya.com/butterfly.wmv" />
<slvideo:VideoItem Source="http://labs.ucaya.com/bear.wmv" />
</slvideo:VideoController.Playlist>
</slvideo:VideoController>
Navigation :
<Button Content="Previous"
Command="{Binding PreviousItem}" />
<Button Content="Next"
Command="{Binding NextItem}" />
Les sources