1

我有一个解决方案,其中包括 2 个项目:主要项目和 PlayListFilePlayBackAgent。 在此处输入图像描述

在主项目中,在 MainPage 中有一个 listBox,它显示不同的内容。某些内容具有音频格式,当我在列表框的项目中看到标题和表演者时 - 我单击此列表框项目中的“播放”按钮。此按钮进行一些操作(从某个服务器获取曲目的 url),然后转到页面 AudioPage。在 AudioPage 中,一些方法从这些 url 中创建一个播放列表,而不是以 xml 格式(序列化)保存在 isolatedStorage 中。这是 PlayList.cs

 public class Playlist
{
    public Playlist()
    {
        Tracks = new List<PlaylistTrack>();
    }

    [XmlElement(ElementName = "Track")]
    public List<PlaylistTrack> Tracks { set; get; }
    [XmlElement(ElementName = "TrackCount")]
    public int TrackCount { set; get; }

    public static Playlist Load(string filename)
    {
        Playlist playlist = null;

        using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = storage.OpenFile(filename, FileMode.Open))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
                playlist = xmlSerializer.Deserialize(stream) as Playlist;
            }
        }
        return playlist;
    }

    public void Save(string filename)
    {
        using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = storage.CreateFile(filename))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
                xmlSerializer.Serialize(stream, this);
            }
        }
    }
}

并且 PlayBackAgent 将此 xml 反序列化为播放列表,并播放它。

这一切都很好,但是当我想听那些不在列表框中的曲目时,我遇到了问题。我回到我的列表框,然后选择一些曲目并按下“播放”按钮。在按钮处理程序中,.Clear();我的收藏,获取新曲目的新网址,转到 AudioPage 并制作一个新的播放列表。但是在模拟器中,我看到了我以前听过的相同音乐。我认为问题在于 PlayListFilePlayBackAgent 没有从isolatedStorade 更新播放列表。但是当我单击不同的按钮“播放”时 - 字段 TrackCount 发生变化(不要介意它的名称,它只是说明播放列表中必须播放播放器的曲目数),我可以在写入时在输出中看到Debug.WriteLine(Convert.ToString(playlist.TrackCount));AudioPlayer.cs. 所以我有:一个音频播放器,它只播放我给他的第一个播放列表中的音乐。当我想收听另一个播放列表时 - 在 AudioPage 中,我看到了旧的播放列表,并且只能从那些旧的播放列表中收听音乐。我想要的是一个音频播放器,每次按下“播放”按钮时都可以更改播放列表,并且可以播放此音乐。

PS:我使用 PlayListFilePlayBackAgent 因为即使我关闭这个应用程序它也可以播放音乐。如果您需要更多代码 - 请告诉我。谢谢。

更新:按钮处理程序

        private void Audio_Button_Click(object sender, RoutedEventArgs e)
    {
        string uri = null;
        TextBox tb = null;
        var grid = (Grid)((Button)sender).Parent;
        foreach (var child in grid.Children)
        {
            if (child is TextBox && (string)((TextBox)child).Tag == "URL")
            {
                tb = (TextBox)child;
            }
        }
        uri = tb.Text;
        BackgroundAudioPlayer.Instance.SkipNext();

        //MessageBox.Show(uri);

        string url = string.Format("https://api.vk.com/method/audio.getById.xml?audios={0}&access_token={1}", uri, App.AccessToken);

        var c = new WebClient();
        c.OpenReadCompleted += (sender1, e1) =>
        {
            XDocument xml = XDocument.Load(e1.Result);
            MessageBox.Show(xml.ToString());
            var inf = from u in xml.Descendants("audio")
                      select u;
            AudioPage.audios.Clear();
            foreach (var item in inf)
            {
                AudioPage.audios.Add(new AudioAttachment((string)item.Element("url"), (string)item.Element("title"), (string)item.Element("artist")));
            }
            string destination = string.Format("/AudioPage.xaml");
            NavigationService.Navigate(new Uri(destination, UriKind.Relative));
            AudioPage.count = 0;

        };
        c.OpenReadAsync(new Uri(url));
    }

OnUseraction.cs

        protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
    {
        switch (action)
        {
            case UserAction.Play:
                if (player.Track == null)
                {
                    // Load playlist from isolated storage
                    if (playlist == null)
                        playlist = Playlist.Load("playlist.xml");
                 //   Debug.WriteLine(playlist.Tracks[0].Title);
                    Debug.WriteLine(Convert.ToString(playlist.TrackCount));
                    currentTrack = playlist.TrackCount;
                    player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
                }
                else
                {
                    player.Play();
                }
                break;

            case UserAction.Pause:
                player.Pause();
                break;

            case UserAction.SkipNext:
                if (currentTrack < playlist.Tracks.Count - 1)
                {
                    currentTrack += 1;
                    player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
                }
                else
                {
                    player.Track = null;
                }
                break;

            case UserAction.SkipPrevious:
                if (currentTrack > 0)
                {
                    currentTrack -= 1;
                    player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
                }
                else
                {
                    player.Track = null;
                }
                break;

            case UserAction.Seek:
                player.Position = (TimeSpan)param;
                break;
        }
        NotifyComplete();
    }
4

3 回答 3

0

如果您在 UI 中更改播放列表,您将需要某种方式向代理发出信号,告知其需要更改正在播放的内容,否则它将继续播放当前曲目。

当用户点击播放按钮时,BackgroundAudioPlayer.Instance.SkipNext从您的应用程序调用,当您OnUserAction在代理代码中获得事件时,您将能够重新检查您的播放列表 XML 文件。

于 2012-12-15T11:50:47.920 回答
0
if (playlist == null)
    playlist = Playlist.Load("playlist.xml");

您在哪里将播放列表设置回 Null?

伙计,我感觉到你的痛苦。我有完全相同的情况并使用完全相同的方法(除了我使用了 IsolatedStorageSettings.ApplicationSettings 集合而不是写入文件)。

它非常适合第一次运行。

这种行为真的很奇怪。我在前台应用程序上看到了数据更新,但是从播放器读取相同的设置不会给我新的数据。我还尝试使用新的设置键进行编写(以防 BAP 缓存结果或其他内容),但我得到了一些不稳定的结果,它适用于 2-5 次更新,然后就停止在集合中看到新的设置键。让我发狂...

我还注意到音轨的 Tag 属性似乎被正确复制了,所以我尝试序列化我的播放列表并通过标签作为字符串值传递,但得到了一些内存不足或其他错误的错误。看起来像他们在那里有自己的限制。

如果你在这个问题上找到了运气,请告诉我。

于 2013-01-03T13:11:44.357 回答
0

也许是有关在 Windows Phone 上播放音频的最详细信息之一。在此处查看项目http://developer.nokia.com/community/wiki/Streaming_MP3_player_in_WP7

但是我必须说,在我的情况下,我必须加载数据库并通过在不使用 JSON 的情况下循环遍历列表来提取信息。下面是代码;

private void LoadPlayListFromIsolatedStorage(BackgroundAudioPlayer player)
    {
        // clear previous playlist
        _playList.Clear();
        // access to isolated storage
        IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("AlbumsData.dat", FileMode.OpenOrCreate, isoStore))
        {
            if (stream.Length > 0)
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(List<Album>));
                List<Album> strm = serializer.ReadObject(stream) as List<Album>;
                List<Song> _songs = strm[0].Songs;
                for (int i = 0; i < _songs.Count; i++)
                {
                    AudioTrack audioTrack = new AudioTrack(
                            new Uri(_songs[i].Directory, UriKind.Absolute), // URL
                            _songs[i].Title,         // MP3 Music Title
                            "Artist",        // MP3 Music Artist
                            "Album",         // MP3 Music Album name
                            new Uri(_songs[i].AlbumArt, UriKind.Absolute)    // MP3 Music Artwork URL
                            );

                    _playList.Add(audioTrack);
                }
            }
            else
            {
                // no AudioTracks from Isolated Storage
            }
            // start playing
            PlayTrack(player);

        }
于 2014-10-22T17:19:56.197 回答