2016-04-03 4 views
2

Ich habe ein Problem mit MediaPlaybackList, wie wie folgt verwendet:UWP MediaPlaybackList Zugabe von Mediasource arbeitet zu langsam

playbackList = new MediaPlaybackList(); 
playbackList.AutoRepeatEnabled = true; 
for (int i = 0; i < songs.Count();i++) 
{  
    var song = songs.ElementAt(i);  
    var source = MediaSource.CreateFromStorageFile(
     await StorageFile.GetFileFromPathAsync(song.File)); 
    source.CustomProperties[TrackIdKey] = null; 
    source.CustomProperties[TitleKey] = song.Title; 
    source.CustomProperties[AlbumArtKey] = song.AlbumArtUri; 
    source.CustomProperties[AuthorKey] = song.Author; 
    source.CustomProperties[TrackNumber] = (uint)(i+1); 
    playbackList.Items.Add(new MediaPlaybackItem(source)); 
} 

Wenn ich versuche, MediaSource meiner Wiedergabeliste hinzufügen es zu viel Zeit in Anspruch nimmt. 700 Songs brauchen ungefähr 3 Minuten, um mit dem Spielen zu beginnen. Vielleicht gibt es eine andere Möglichkeit, MediaSource zu MediaPlaybackList hinzufügen, die schneller funktioniert?

+0

ich im [Hintergrund Hörprobe] gefunden (https://github.com/ Microsoft/Windows-Universal-Samples/Baum/17ab5a17cec10f3be56d7760035c80e616f40d8c/Samples/BackgroundAudio), verwenden Sie 'var source = MediaSource.CreateFromUri (song.MediaUri);', um die Songs zu erhalten. –

+0

Ich verwende dieses Beispiel, aber in diesem Beispiel Audioquelle im Paket, nicht in externen Laufwerk –

Antwort

4

Verwenden Sie eine IRandomAccessStreamReference. So muss es nur die Datei laden, wenn es zum Item kommt, das wesentlich schneller ist.

Sie müssen jedoch Ihre eigene Abstraktionsklasse schreiben. könnte ein wenig so aussehen:

public class MyStreamReference : IRandomAccessStreamReference 
{ 
    private string path; 

    public MyStreamReference(string path) 
    { 
     this.path = path; 
    } 

    public IAsyncOperation<IRandomAccessStreamWithContentType> OpenReadAsync() 
     => Open().AsAsyncOperation(); 

    // private async helper task that is necessary if you need to use await. 
    private async Task<IRandomAccessStreamWithContentType> Open() 
     => await (await StorageFile.GetFileFromPathAsync(path)).OpenReadAsync(); 
} 
1

Erstens würde ich PlaybackSource des Media gesetzt, bevor Sie Dateien, und dann würde ich nur eine Aufgabe spin up die Belastung auf einem anderen Thread zu handhaben.

Auf diese Weise wird die Wiedergabe der ersten Datei gestartet (oder kann gestartet werden), sobald diese eine Datei geladen ist, die in meinen Tests weniger als eine Sekunde betrug.

Als ein Nebenprojekt habe ich dies leicht angepasst, um alle Spuren von einem Wechsellaufwerk zu laden und abzuspielen. Der erste Teil des Codes ruft die Dateien vom Laufwerk ab, filtert sie nach Unterordnern und erstellt Song-Objekte.

Der Rest ist der gleiche, mit Ausnahme der leichten Änderung der StorageFile von KnownFolders.RemovableStorage abrufen ...

protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    IReadOnlyList<StorageFile> files = await KnownFolders.RemovableDevices.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName); 
    var songs = new List<Song>(); 
    string root = [email protected]"{Path.GetPathRoot(files.FirstOrDefault()?.Path)}Tracks\"; 
    foreach (StorageFile file in files) 
     if (file.Path.StartsWith(root)) 
      songs.Add(new Song { File = file.Path, Title = Path.GetFileNameWithoutExtension(file.Path) }); 

    var playbackList = new MediaPlaybackList(); 
    playbackList.AutoRepeatEnabled = true; 
    mediaElement.SetPlaybackSource(playbackList); 

    await Task.Run(async() => 
    { 
     for (int i = 0; i < songs.Count(); i++) 
     { 
      var song = songs.ElementAt(i); 
      var source = MediaSource.CreateFromStorageFile(await KnownFolders.RemovableDevices.GetFileAsync(song.File)); 
      source.CustomProperties["TrackIdKey"] = null; 
      source.CustomProperties["TitleKey"] = song.Title; 
      source.CustomProperties["AlbumArtKey"] = song.AlbumArtUri; 
      source.CustomProperties["AuthorKey"] = song.Author; 
      source.CustomProperties["TrackNumber"] = (uint)(i + 1); 
      playbackList.Items.Add(new MediaPlaybackItem(source)); 
      Debug.WriteLine($"[{i}] {song.Title} added to playlist"); 
     } 
    }); 
} 
Verwandte Themen