W10 Universal: как воспроизвести песню с диска с помощью Backgroundaudio?

Образец фонового аудио приложений Microsoft W10 Universal может воспроизводить список файлов.wma, хранящихся в /// ресурсах, например:

var song2 = new SongModel();
song2.Title = "Ring 2";
song2.MediaUri = new Uri("ms-appx:///Assets/Media/Ring02.wma");
song2.AlbumArtUri = new Uri("ms-appx:///Assets/Media/Ring02.jpg");
playlistView.Songs.Add(song2);

Но я не могу заставить программу воспроизводить файлы.wma, хранящиеся на диске. Я попытался выбрать файл с помощью FileOpenPicker, назначить его файлу StorageFile и затем:

if (file != null)
{
Uri uri = new Uri(file.Path);
song2.MediaUri = uri;
}

или (временно) поместив его в библиотеку изображений (которую я проверил в возможностях), к которой, как я думал, я мог получить доступ, как это, но либо это не тот случай, либо он не работает (и, скорее всего, оба):

string name = "ms-appdata:///local/images/SomeSong.wma";
Uri uri = new Uri(name, UriKind.Absolute);
song1.MediaUri = uri;

Слышен только оригинальный /// Актив WMA.

Что я должен изменить? И как я могу преобразовать каталог KnownFolders в Uri?

1 ответ

Образец Background Audio использует метод MediaSource.CreateFromUri для создания источника мультимедиа. При использовании этого метода для параметра можно задать только Унифицированный идентификатор ресурса (URI) файла, который включен в приложение, или URI файла в сети. Чтобы установить в качестве источника файл, полученный из локальной системы с помощью объекта FileOpenPicker, мы можем использовать метод MediaSource.CreateFromStorageFile. И всякий раз, когда наше приложение обращается к файлу или папке через средство выбора, мы можем добавить его в FutureAccessList или MostRecentlyUsedList приложения, чтобы отслеживать его.

Например, после того, как мы получим StorageFile от FileOpenPickerмы можем добавить его в FutureAccessList и сохраните токен, который приложение может использовать позже для извлечения элемента хранения в локальных настройках приложения, таких как:

if (file != null)
{
    var token = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(file);

    ApplicationData.Current.LocalSettings.Values["song1"] = token;
}

Для получения дополнительной информации о FutureAccessListсм. Отслеживание недавно использованных файлов и папок.

Затем в BackgroundAudioTask, Я изменился CreatePlaybackList способ замены оригинала вроде:

private async void CreatePlaybackList(IEnumerable<SongModel> songs)
{
    // Make a new list and enable looping
    playbackList = new MediaPlaybackList();
    playbackList.AutoRepeatEnabled = true;

    // Add playback items to the list
    foreach (var song in songs)
    {
        MediaSource source;
        //Replace Ring 1 to the song we select
        if (song.Title.Equals("Ring 1"))
        {
            var file = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFileAsync(ApplicationData.Current.LocalSettings.Values["song1"].ToString());
            source = MediaSource.CreateFromStorageFile(file);
        }
        else
        {
            source = MediaSource.CreateFromUri(song.MediaUri);
        }
        source.CustomProperties[TrackIdKey] = song.MediaUri;
        source.CustomProperties[TitleKey] = song.Title;
        source.CustomProperties[AlbumArtKey] = song.AlbumArtUri;
        playbackList.Items.Add(new MediaPlaybackItem(source));
    }

    // Don't auto start
    BackgroundMediaPlayer.Current.AutoPlay = false;

    // Assign the list to the player
    BackgroundMediaPlayer.Current.Source = playbackList;

    // Add handler for future playlist item changes
    playbackList.CurrentItemChanged += PlaybackList_CurrentItemChanged;
}

Это простой пример, вам может потребоваться изменить SongModel и некоторый другой код для реализации вашего собственного плеера. Для получения дополнительной информации о фоновом аудио вы также можете обратиться к Основам фонового аудио. Кроме того, в Windows 10 версии 1607 были значительно улучшены API-интерфейсы воспроизведения мультимедиа, включая упрощенный однопроцессный дизайн для фонового звука. Вы можете увидеть Play media в фоновом режиме, чтобы проверить новую функцию.

Другие вопросы по тегам