1

メイン プロジェクトと PlayListFilePlayBackAgent の 2 つのプロジェクトを含むソリューションがあります。 ここに画像の説明を入力

メイン プロジェクトの 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();私のコレクションで、新しいトラックの新しい URL を取得し、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

おそらく、Windows Phone でのオーディオ再生に関する最も詳細な情報の 1 つです。ここでプロジェクトを確認してください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 に答える
0

UI でプレイリストを変更する場合、再生中の曲を変更する必要があることをエージェントに通知する何らかの方法が必要になります。そうしないと、現在のトラックの再生が続行されます。

ユーザーが再生ボタンを押したBackgroundAudioPlayer.Instance.SkipNextときにアプリから呼び出しOnUserAction、エージェント コードでイベントを取得すると、プレイリストの XML ファイルを再確認できます。

于 2012-12-15T11:50:47.920 に答える