W10 Universal:如何使用Backgroundaudio从磁盘播放歌曲?

时间:2016-08-02 17:02:09

标签: c# windows-10-universal background-audio known-folders

Microsoft W10 Universal apps Background Audio示例可以播放存储在/// Assets中的.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 个答案:

答案 0 :(得分:0)

Background Audio示例使用MediaSource.CreateFromUri method创建媒体源。使用此方法时,该参数只能设置为应用程序附带的文件的统一资源标识符(URI)或网络上文件的URI。要使用FileOpenPicker对象将源设置为从本地系统检索的文件,我们可以使用MediaSource.CreateFromStorageFile方法。每当我们的应用通过选择器访问文件或文件夹时,我们都可以将其添加到应用的FutureAccessListMostRecentlyUsedList以跟踪它。

例如,在我们从StorageFile获取FileOpenPicker后,我们可以将其添加到FutureAccessList并存储应用可以稍后用于检索应用中的存储项的令牌&# 39;本地设置如:

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

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

有关FutureAccessList的详情,请参阅Track recently used files and folders

然后在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和其他一些代码来实现您自己的播放器。有关背景音频的更多信息,您还可以参考The Basics of Background Audio。此外,在Windows 10版本1607中,对媒体播放API进行了重大改进,包括简化的背景音频单进程设计。您可以看到Play media in the background来检查新功能。