Con l'Anniversary Update di Windows 10, Microsoft ha fatto un interessante aggiunta alle capacità multimediali della piattaforma UWP, con la classe MediaPlayer del namespace Windows.Media.Playback. La classe MediaPlayer, a differenza del tipo MediaElement, non è un elmento visuale e non entra a far parte del VisualTree, ma offre una serie di opportunità che ne rendono l'utilizzo interessante. Per prima cosa creiamo un semplice Button all'interno della nostra view, e associamo un event handler per l'evento di click.
private async void OpenVideo_Click(object sender, RoutedEventArgs e) { var picker = new FileOpenPicker(); picker.SuggestedStartLocation = PickerLocationId.VideosLibrary; picker.ViewMode = PickerViewMode.Thumbnail; picker.FileTypeFilter.Add(".mp4"); picker.FileTypeFilter.Add(".avi"); var file = await picker.PickSingleFileAsync(); if (file != null) { var source = MediaSource.CreateFromStorageFile(file); var mediaItem = new MediaPlaybackItem(source); _player.Source = mediaItem; EnsureComposition(); SetSurface(); _player.Play(); } }
Alla pressione del click viene creato e impostato un FileOpenPicker per la selezione del video, in seguito creiamo gli oggetti MediaSource e MediaPlaybackItem da dare in pasto al player per la riproduzione.
Come abbiamo detto, l'oggetto MediaPlayer non entra a far parte del VisualTree: di fatto, se chiamassimo il metodo Play prima dei metodi EnsureComposition e SetSurface, saremmo in grado di sentire l'audio ma non di vedere il video.
La classe MediaPlayer espone un metodo che ci permette di specificare una superfice di 'disegno' da usare nella composition. Quindi, per prima cosa, creiamo la classe che orchestra il tutto, il Compositor:
private void EnsureComposition() { if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; _visual = _compositor.CreateSpriteVisual(); _visual.Size = new Vector2((float)ActualWidth, (float)ActualHeight); SizeChanged += (s, a) => { _visual.Size = new Vector2((float)ActualWidth, (float)ActualHeight); }; ElementCompositionPreview.SetElementChildVisual(this, _visual); } }
Una volta recuperata un'istanza della classe Compositor, creiamo un nuovo SpriteVisual e lo aggiungiamo come figlio della nostra view. In seguito, possiamo procedere con il recupero della superficie di Composition e la creazione del CompositionSurfaceBrush:
private void SetSurface() { _mediaSurface = _player.GetSurface(_compositor); var surface = _mediaSurface.CompositionSurface; _videoBrush = _compositor.CreateSurfaceBrush(surface); _visual.Brush = _videoBrush; }
Questo approccio può sembrare più complicato rispetto all'uso del MediaElement, ma offre performance nettamente migliori e visto l'utilizzo della Composition, apre inoltre la strada alla creazione di effetti e transizione estremamente interessanti.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare QuickGrid di Blazor con Entity Framework
Utilizzare WhenEach per processare i risultati di una lista di task
Miglioramenti nelle performance di Angular 16
Estrarre dati randomici da una lista di oggetti in C#
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Miglioramenti agli screen reader e al contrasto in Angular
Disabilitare automaticamente un workflow di GitHub (parte 2)
Generare una User Delegation SAS in .NET per Azure Blob Storage
Creare una libreria CSS universale - Rotazione degli elementi
Gestire i dati con Azure Cosmos DB Data Explorer
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Gestione dei nomi con le regole @layer in CSS
I più letti di oggi
- Community Days 2010: design di applicazioni in stile Metro su Windows Phone 7
- Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
- Utilizzare Front Door come CDN di contenuti statici
- Windows 8 e Windows Phone 8 Live - Online
- Disponibile la release finale di Moonlight 1.0
- Windows Phone Developer Tools October 2010 Update
- È ufficiale: Visual Studio LightSwitch 2011 sarà rilasciato il 26 luglio
- Annunciate le versioni ufficiali di Visual Studio 11
- Disponibile l'update ASP.NET and Web Tools 2013.1 per Visual Studio 2012
- Nuove pubblicazioni dal 3 Settembre