2016-08-02 63 views
0

微軟W10通用應用程式的背景音頻採樣可以播放存儲在///資產WMA文件的列表,像這樣:W10 Universal:如何使用Backgroundaudio從磁盤播放歌曲?

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?

回答

0

背景音頻示例使用MediaSource.CreateFromUri method來創建媒體源。使用此方法時,只能將此參數設置爲應用程序附帶的文件的統一資源標識符(URI)或網絡上文件的URI。要使用FileOpenPicker對象將源設置爲從本地系統檢索的文件,我們可以使用MediaSource.CreateFromStorageFile方法。每當我們的應用程序通過選取器訪問文件或文件夾時,我們可以將其添加到應用程序的FutureAccessListMostRecentlyUsedList以跟蹤它。

例如,在我們得到FileOpenPickerStorageFile,我們可以把它添加到FutureAccessList並存儲令牌的應用程序可以在以後使用中的應用程序的本地設置,如檢索存儲物品:

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以檢查新功能。