MediaElement
MediaElement
est un contrôle permettant de lire les éléments vidéo et audio. Les médias pris en charge par la plateforme sous-jacente peuvent être lus à partir des sources suivantes :
- Le web, à l’aide d’un URI (HTTP ou HTTPS).
- Une ressource incorporée à l’application de plateforme, à l’aide du schéma d’URI
embed://
. - Des fichiers provenant du système de fichiers local de l’application, à l’aide du schéma d’URI
filesystem://
.
MediaElement
peut utiliser les contrôles de lecture de la plateforme, connus sous le nom de contrôles de transport. Toutefois, ils sont désactivés par défaut et peuvent être remplacés par vos propres contrôles de transport. Les captures d’écran suivantes montrent MediaElement
lisant une vidéo avec les contrôles de transport de la plateforme :
Remarque
MediaElement
est disponible sur iOS, Android, Windows, macOS et Tizen.
MediaElement
utilise les implémentations de plateforme suivantes.
Plateforme | Implémentation du lecteur multimédia de la plateforme |
---|---|
Android | ExoPlayer, un grand merci aux chargés de maintenance ExoPlayerXamarin ! |
iOS/macOS | AVPlayer |
Windows | MediaPlayer |
Mise en route
Pour utiliser la fonctionnalité MediaElement
du kit d’outils de la communauté .NET MAUI, vous devez effectuer les étapes suivantes.
Installer le package NuGet
Avant de pouvoir utiliser MediaElement
au sein de votre application, vous devez installer le package NuGet CommunityToolkit.Maui.MediaElement
et ajouter une ligne d’initialisation dans votre fichier MauiProgram.cs, comme suit :
Nom du package :CommunityToolkit.Maui.MediaElement
URL du package : https://www.nuget.org/packages/CommunityToolkit.Maui.MediaElement
Initialisation du package
Tout d’abord, vous devez ajouter l’instruction « using » en haut de votre fichier MauiProgram.cs.
using CommunityToolkit.Maui.MediaElement;
Pour utiliser MediaElement
correctement, la méthode UseMauiCommunityToolkitMediaElement
doit être appelée sur la classe MauiAppBuilder
lors de l’amorçage du fichier MauiProgram.cs d’une application. L’exemple suivant montre comment effectuer cette opération.
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkitMediaElement()
Pour plus d’informations sur la procédure à suivre, reportez-vous à la page Prise en main.
Initialisation spécifique à la plateforme
Pour accéder à la fonctionnalité MediaElement
, vous devez appliquer la configuration spécifique à la plateforme suivante.
Quand vous utilisez MediaElement
, il est essentiel d’effectuer les étapes suivantes :
1. Ajoutez ResizableActivity
et Launchmode
à l’activité
[Activity(Theme = "@style/Maui.SplashTheme", ResizeableActivity = true, MainLauncher = true, LaunchMode = LaunchMode.SingleTask)]
public class MainActivity : MauiAppCompatActivity
{
}
2. Ajoutez ce qui suit à AndroidManifest.xml
dans la balise <application>
.
<service android:name="communityToolkit.maui.media.services" android:exported="false" android:enabled="true" android:foregroundServiceType="mediaPlayback">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
3. Ajoutez les autorisations suivantes à AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
Voici un exemple de paramètres obligatoires dans AndroidManifest.xml
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:enableOnBackInvokedCallback="true" android:supportsRtl="true">
<service android:name="communityToolkit.maui.media.services" android:exported="false" android:enabled="true" android:foregroundServiceType="mediaPlayback">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
Remarque
Cette modification du manifeste Android permet l’affichage des métadonnées durant la lecture d’une vidéo. Elle prend en charge les notifications, et est essentielle à leur fonctionnement dans toutes les API appropriées. Le changement introduit un service et octroie les autorisations nécessaires.
Pour obtenir un exemple complet de cette méthode incluse dans une application, reportez-vous à l’Exemple d’application du kit d’outils de la communauté .NET MAUI.
Formats pris en charge
Les formats multimédias pris en charge peuvent différer selon la plateforme. Dans certains cas, ils peuvent même dépendre des décodeurs disponibles ou installés sur le système d’exploitation utilisé lors de l’exécution de votre application. Pour plus d’informations sur les formats pris en charge sur chaque plateforme, reportez-vous aux liens ci-dessous.
Plateforme | Lien | Notes |
---|---|---|
Android | Formats pris en charge par ExoPlayer | |
iOS/macOS | Formats pris en charge par iOS/macOS | Aucune documentation officielle sur ce sujet n’existe. |
Windows | Formats pris en charge par Windows | Sur Windows, les formats pris en charge dépendent beaucoup des codecs installés sur l’ordinateur de l’utilisateur |
Tizen | Formats pris en charge par Tizen |
Important
Si l’utilisateur utilise une édition Windows N, aucune lecture vidéo n’est prise en charge par défaut. Par conception, les éditions Windows N n’ont aucun format de lecture vidéo installé.
Scénarios courants
Les sections suivantes couvrent les scénarios d’utilisation courants pour MediaElement
.
Lire le média distant
MediaElement
peut lire des fichiers multimédias distants à l’aide des schémas d’URI HTTP et HTTPS. Pour ce faire, définissez la propriété Source
sur l’URI du fichier multimédia :
<toolkit:MediaElement Source="https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
ShouldShowPlaybackControls="True" />
Important
Lors de la lecture de sources distantes à partir de points de terminaison HTTP, vous devrez probablement désactiver les mesures de sécurité du système d’exploitation qui empêchent l’accès aux points de terminaison web non sécurisés. Cela s’applique au moins à iOS et Android.
Par défaut, le média défini par la propriété Source
ne démarre pas immédiatement après l’ouverture du média. Pour activer la lecture automatique du média, définissez la propriété ShouldAutoPlay
sur true
.
Par défaut, les contrôles de lecture multimédia fournis par la plateforme sont activés. Ils peuvent être désactivés en définissant la propriété ShouldShowPlaybackControls
sur false
.
Utilisation des métadonnées
Un MediaElement
peut utiliser des métadonnées pour MediaElement.MetadataTitle
, MediaElement.MetadataArtist
et MediaElement.MetadataArtworkUrl
. Vous pouvez définir le titre ou l’artiste afin d’afficher ce qui est en cours de lecture sur les contrôles de l’écran de verrouillage pour Windows, Mac Catalyst, iOS et Android. Vous pouvez définir une URL locale ou distante avec des illustrations pour l’écran de verrouillage. La résolution doit être d’au moins 1080P pour obtenir la meilleure qualité d’affichage possible. Il doit s’agir d’une URL. Celle-ci doit correspondre à un fichier .jpg
ou .png
<toolkit:MediaElement
MetadataTitle="Title"
MetadataArtist="Artist"
MetadataArtworkUrl="http://www.myownpersonaldomain.com/image.jpg" />
MediaElement.MetadataTitle="Title";
MediaElement.MetadataArtist="Artist";
MediaElement.MetadataArtworkUrl="http://www.myownpersonaldomain.com/image.jpg";
Important
Vous pouvez définir les métadonnées en XAML ou dans du code-behind. Si vous les définissez dans du code-behind, vous devez définir la source dans le code-behind. La source doit être définie en dernier. Si vous définissez les métadonnées en XAML ou dans le constructeur, vous pouvez ignorer cette note sans problème.
Lire les médias locaux
Les médias locaux peuvent être lus à partir des sources suivantes :
- Une ressource incorporée à l’application de plateforme, à l’aide du schéma d’URI
embed://
. - Des fichiers provenant du système de fichiers local de l’application, à l’aide du schéma d’URI
filesystem://
.
Remarque
Les raccourcis embed://
et filesystem://
fonctionnent uniquement à partir de XAML. Dans le code, utilisez MediaSource.FromResource()
et MediaSource.FromFile()
respectivement. Avec ces méthodes, vous pouvez omettre les préfixes embed://
et filesystem://
. Le reste du chemin doit être le même.
Lire le média incorporé dans le package d’application
MediaElement
peut lire des fichiers multimédias incorporés dans le package d’application à l’aide du schéma d’URI embed://
. Pour incorporer les fichiers multimédias dans le package d’application, placez-les dans le projet de plateforme.
Pour activer un fichier multimédia pour la lecture à partir des ressources locales, ajoutez le fichier au dossier Resources/Raw
de votre projet .NET MAUI. Lorsqu’un fichier est ajouté à la racine, l’URI est embed://MyFile.mp4
.
Vous pouvez également placer des fichiers dans les sous-dossiers. Si MyFile.mp4
est dans Resources/Raw/MyVideos
, alors l’URI pour l’utiliser avec MediaElement
est embed://MyVideos/MyFile.mp4
.
Vous trouverez ci-dessous un exemple d’utilisation de cette syntaxe au format XAML.
<toolkit:MediaElement Source="embed://MyFile.mp4"
ShouldShowPlaybackControls="True" />
Comprendre les types MediaSource
MediaElement
peut lire les médias en définissant sa propriété Source
sur un fichier multimédia distant ou local. La propriété Source
est de type MediaSource
, et cette classe définit trois méthodes statiques :
FromFile
, retourne une instanceFileMediaSource
à partir d’un argumentstring
.FromUri
, retourne une instanceUriMediaSource
à partir d’un argumentUri
.FromResource
, retourne une instanceResourceMediaSource
à partir d’un argumentstring
.
En outre, la classe MediaSource
a également des opérateurs implicites qui retournent des instances MediaSource
à partir des arguments string
et Uri
.
Remarque
Lorsque la propriété Source
est définie au format XAML, un convertisseur de type est appelé pour retourner une instance MediaSource
à partir de string
ou Uri
.
La classe MediaSource
dispose également de ces classes dérivées :
FileMediaSource
, qui est utilisé pour spécifier un fichier multimédia local à partir destring
. Cette classe a une propriétéPath
qui peut être définie surstring
. En outre, cette classe a des opérateurs implicites pour convertirstring
en objetFileMediaSource
et un objetFileMediaSource
enstring
.UriMediaSource
, qui est utilisé pour spécifier un fichier multimédia distant à partir d’un URI. Cette classe a une propriétéUri
qui peut être définie surUri
.ResourceMediaSource
, qui est utilisé pour spécifier un fichier incorporé fourni via les fichiers de ressources de l’application. Cette classe a une propriétéPath
qui peut être définie surstring
.
Remarque
Lorsqu’un objet FileMediaSource
est créé au format XAML, un convertisseur de type est appelé pour retourner une instance FileMediaSource
à partir de string
.
Modifier les proportions vidéo
La propriété Aspect
détermine la façon dont le média vidéo sera mis à l’échelle pour s’adapter à la zone d’affichage. Par défaut, cette propriété est définie sur le membre d’énumération AspectFit
, mais elle peut être définie sur l’un des membres d’énumération Aspect
:
AspectFit
indique que la vidéo sera cadrée, si nécessaire, pour s’adapter à la zone d’affichage, tout en préservant les proportions.AspectFill
indique que la vidéo sera découpée pour remplir la zone d’affichage, tout en conservant les proportions.Fill
indique que la vidéo sera étirée pour remplir la zone d’affichage.
Déterminer l’état MediaElement
La classe MediaElement
définit une propriété pouvant être liée en lecture seule nommée CurrentState
et de type MediaElementState
. Cette propriété indique l’état actuel du contrôle, par exemple si le média est lu ou mis en pause, ou s’il n’est pas encore prêt à lire le média.
L’énumération MediaElementState
définit les membres suivants :
None
indique queMediaElement
ne contient aucun média.Opening
indique queMediaElement
valide et tente de charger la source spécifiée.Buffering
indique queMediaElement
charge le média pour la lecture. Sa propriétéPosition
n’avance pas pendant cet état. SiMediaElement
lisait la vidéo, il poursuit l’affichage du dernier cadre affiché.Playing
indique queMediaElement
lit la source multimédia.Paused
indique queMediaElement
n’avance pas sa propriétéPosition
. SiMediaElement
lisait la vidéo, il poursuit l’affichage du cadre actuel.Stopped
indique queMediaElement
contient le média, mais qu’il n’est pas lu ou qu’il est mis en pause. Sa propriétéPosition
est réinitialisée sur 0 et n’avance pas.Failed
indique queMediaElement
n’a pas pu charger ou lire le média. Cela peut se produire lorsque vous essayez de charger un nouvel élément multimédia, lorsque vous essayer de lire l’élément multimédia ou lorsque la lecture du média est interrompue en raison d’un échec. Utilisez l’événementMediaFailed
pour récupérer davantage d’informations.
Il n’est généralement pas nécessaire d’examiner la propriété CurrentState
lorsque vous utilisez les contrôles de transport MediaElement
. Toutefois, cette propriété devient importante lorsque vous implémentez vos propres contrôles de transport.
Implémenter des contrôles de transport personnalisés
Les contrôles de transport d’un lecteur multimédia incluent les boutons qui effectuent les fonctions Lecture, Pause et Arrêt. Ces boutons sont habituellement identifiés par des icônes familières plutôt que du texte, et les fonctions Lecture et Pause sont généralement combinées en un seul bouton.
Par défaut, les contrôles de lecture MediaElement
sont désactivés. Cela vous permet de contrôler MediaElement
par programmation ou en fournissant vos propres contrôles de transport. Afin de prendre cela en charge, MediaElement
inclut les méthodes Play
, Pause
et Stop
.
L’exemple XAML suivant montre une page qui contient MediaElement
et des contrôles de transport personnalisés :
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="MediaElementDemos.CustomTransportPage"
Title="Custom transport">
<Grid>
...
<toolkit:MediaElement x:Name="mediaElement"
ShouldAutoPlay="False"
... />
<HorizontalStackLayout BindingContext="{x:Reference mediaElement}"
...>
<Button Text="Play"
HorizontalOptions="Center"
Clicked="OnPlayPauseButtonClicked">
<Button.Triggers>
<DataTrigger TargetType="Button"
Binding="{Binding CurrentState}"
Value="{x:Static toolkit:MediaElementState.Playing}">
<Setter Property="Text"
Value="Pause" />
</DataTrigger>
<DataTrigger TargetType="Button"
Binding="{Binding CurrentState}"
Value="{x:Static toolkit:MediaElementState.Buffering}">
<Setter Property="IsEnabled"
Value="False" />
</DataTrigger>
</Button.Triggers>
</Button>
<Button Text="Stop"
HorizontalOptions="Center"
Clicked="OnStopButtonClicked">
<Button.Triggers>
<DataTrigger TargetType="Button"
Binding="{Binding CurrentState}"
Value="{x:Static toolkit:MediaElementState.Stopped}">
<Setter Property="IsEnabled"
Value="False" />
</DataTrigger>
</Button.Triggers>
</Button>
</HorizontalStackLayout>
</Grid>
</ContentPage>
Dans cet exemple, les contrôles de transport personnalisés sont définis en tant qu’objets Button
. Toutefois, il n’existe que deux objets Button
, le premier Button
représentant Lecture et Pause, et le deuxième Button
représentant Arrêt. Les objets DataTrigger
servent à activer et désactiver les boutons, ainsi qu’à basculer le premier bouton entre Lecture et Pause. Pour plus d’informations sur les déclencheurs de données, consultez Déclencheurs .NET MAUI.
Le fichier code-behind contient les gestionnaires pour les événements Clicked
:
void OnPlayPauseButtonClicked(object sender, EventArgs args)
{
if (mediaElement.CurrentState == MediaElementState.Stopped ||
mediaElement.CurrentState == MediaElementState.Paused)
{
mediaElement.Play();
}
else if (mediaElement.CurrentState == MediaElementState.Playing)
{
mediaElement.Pause();
}
}
void OnStopButtonClicked(object sender, EventArgs args)
{
mediaElement.Stop();
}
Une fois activé, il est possible d’appuyer sur le bouton Lecture pour commencer la lecture. Appuyer sur le bouton Pause suspend la lecture. Appuyer sur le bouton Arrêt interrompt la lecture et rembobine le fichier multimédia jusqu’au début.
Implémenter un contrôle de volume personnalisé
Les contrôles de lecture multimédia implémentés par chaque plateforme incluent une barre de volume. Cette barre ressemble à un curseur et affiche le volume du média. En outre, vous pouvez manipuler la barre de volume pour augmenter ou diminuer le volume.
Comme l’illustre l’exemple suivant, une barre de volume personnalisée peut être implémentée à l’aide de Slider
:
<StackLayout>
<toolkit:MediaElement ShouldAutoPlay="False"
Source="{StaticResource AdvancedAsync}" />
<Slider Maximum="1.0"
Minimum="0.0"
Value="{Binding Volume}"
Rotation="270"
WidthRequest="100" />
</StackLayout>
Dans cet exemple, les données Slider
lient leur propriété Value
à la propriété Volume
de MediaElement
. Cela est possible, car la propriété Volume
utilise une liaison TwoWay
. Par conséquent, modifier la propriété Value
entraîne la modification de la propriété Volume
.
Remarque
La propriété Volume
a un rappel de validation qui garantit que sa valeur est supérieure ou égale à 0,0, et inférieure ou égale à 1,0.
Pour plus d’informations sur l’utilisation de Slider
, consultez Curseur .NET MAUI.
Nettoyer les ressources MediaElement
Pour éviter les fuites de mémoire, vous devrez libérer les ressources MediaElement
. Pour ce faire, déconnectez le gestionnaire.
L’emplacement où vous devez le faire dépend de la manière dont vous utilisez MediaElement
et à quel endroit dans votre application, mais, de façon générale, si vous avez un MediaElement
sur une seule page et ne lisez pas le média en arrière-plan, il est recommandé de libérer les ressources lorsque l’utilisateur quitte la page.
Vous trouverez ci-dessous un extrait d’exemple de code qui montre comment procéder. Tout d’abord, veillez à raccorder l’événement Unloaded
sur votre page.
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="MediaElementDemos.FreeResourcesPage"
Title="Free Resources"
Unloaded="ContentPage_Unloaded">
<toolkit:MediaElement x:Name="mediaElement"
ShouldAutoPlay="False"
... />
</ContentPage>
Ensuite, dans le code-behind, appelez la méthode pour déconnecter le gestionnaire.
public partial class FreeResourcesPage : ContentPage
{
void ContentPage_Unloaded(object? sender, EventArgs e)
{
// Stop and cleanup MediaElement when we navigate away
mediaElement.Handler?.DisconnectHandler();
}
}
Pour en savoir plus sur les gestionnaires, consultez la documentation .NET MAUI sur les Gestionnaires.
Propriétés
Propriété | Type | Description | Valeur par défaut |
---|---|---|---|
Aspect | Aspect | Détermine le mode de mise à l’échelle du média (visuel) actuellement chargé. Il s’agit d’une propriété pouvant être liée. | Aspect.AspectFit |
CurrentState | MediaElementState |
Indique l’état actuel du contrôle. Il s’agit d’une propriété en lecture seule et pouvant être liée. | MediaElementState.None |
Durée | TimeSpan |
Indique la durée du média actuellement ouvert. Il s’agit d’une propriété en lecture seule et pouvant être liée. | TimeSpan.Zero |
Position | TimeSpan |
Décrit la progression actuelle par le biais du temps de lecture du média. Il s’agit d’une propriété en lecture seule et pouvant être liée. Si vous souhaitez définir Position , utilisez la méthode SeekTo() . |
TimeSpan.Zero |
ShouldAutoPlay | bool |
Indique si la lecture du média commence automatiquement lorsque la propriété Source est définie. Il s’agit d’une propriété pouvant être liée. |
false |
ShouldLoopPlayback | bool |
Décrit si la source multimédia actuellement chargée doit reprendre la lecture du début une fois terminée. Il s’agit d’une propriété pouvant être liée. | false |
ShouldKeepScreenOn | bool |
Détermine si l’écran de l’appareil doit rester activé pendant la lecture du média. Il s’agit d’une propriété pouvant être liée. | false |
ShouldMute | bool |
Détermine si l’audio est actuellement désactivé. Il s’agit d’une propriété pouvant être liée. | false |
ShouldShowPlaybackControls | bool |
Détermine si les contrôles de lecture de la plateforme sont affichés. Il s’agit d’une propriété pouvant être liée. Notez que sur iOS et Windows, les contrôles sont affichés pendant une courte durée suivant l’interaction avec l’écran. Il est impossible de garder les contrôles visibles en tout temps. | true |
Source | MediaSource? |
Source du média chargée dans le contrôle. | null |
Vitesse | double |
Détermine la vitesse de lecture du média. Il s’agit d’une propriété pouvant être liée. | 1 |
MediaHeight | int |
Hauteur du média chargé en pixels. Il s’agit d’une propriété en lecture seule et pouvant être liée. Non signalé pour les médias non visuels et risque de ne pas toujours être renseigné sur iOS/macOS pour le contenu diffusé en direct. | 0 |
MediaWidth | int |
Largeur du média chargé en pixels. Il s’agit d’une propriété en lecture seule et pouvant être liée. Non signalé pour les médias non visuels et risque de ne pas toujours être renseigné sur iOS/macOS pour le contenu diffusé en direct. | 0 |
Volume | double |
Détermine le volume du média, qui est représenté sur une échelle linéaire comprise entre 0 et 1. Il s’agit d’une propriété pouvant être liée. | 1 |
Événements
Événement | Description |
---|---|
MediaOpened | Se produit lorsque le flux multimédia a été validé et ouvert. |
MediaEnded | Se produit lorsque MediaElement termine la lecture du média. |
MediaFailed | Se produit lorsqu’une erreur associée à la source multimédia survient. |
PositionChanged | Se produit quand la valeur de propriété Position a été modifiée. |
SeekCompleted | Se produit lorsque le point de recherche d’une opération de recherche demandée est prêt pour la lecture. |
Méthodes
Event | Description |
---|---|
Lire | Commence à lire le média chargé. |
Pause | Suspend la lecture du média actuel. |
Stop | Arrête la lecture et réinitialise la position du média actuel. |
SeekTo | Prend une valeur TimeSpan pour définir la propriété Position et une valeur CancellationToken pour annuler Task . |
Exemples
Vous trouverez des exemples de ce contrôle en action dans l’Exemple d’application du kit d’outils de la communauté .NET MAUI.
API
Vous pouvez trouver le code source deMediaElement
sur le référentiel du kit de ressources de la communauté .NET MAUI sur GitHub.
Liens connexes
.NET MAUI Community Toolkit