我得到音频流:
public static Task<Stream> DownloadFile(Uri url)
{
var tcs = new TaskCompletionSource<Stream>();
var wc = new WebClient();
wc.OpenReadCompleted += (s, e) =>
{
if (e.Error != null) tcs.TrySetException(e.Error);
else if (e.Cancelled) tcs.TrySetCanceled();
else tcs.TrySetResult(e.Result);
};
wc.OpenReadAsync(url);
return tcs.Task;
}
我将它保存到 IsoStorage:
public static void SaveStreamToFile(Stream streamToRead, string fileName)
{
var file = IsolatedStorageFile.GetUserStoreForApplication();
using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Create, file))
{
byte[] buffer = new byte[1024];
while (streamToRead.Read(buffer, 0, buffer.Length) > 0)
{
stream.Write(buffer, 0, buffer.Length);
}
}
}
我将有关播放列表的序列化信息再次保存到 IsoStorage 并在后台音频播放器中反序列化它并获取有关曲目的信息。一切似乎都很好。我在 AudioPlayer 的 playList 属性中得到了所有内容。
问题是当我尝试播放曲目时。当我点击下一个曲目按钮时更准确。问题是下一首歌并不总是开始播放。例如,当我将断点添加到方法时OnPlayStateChanged(...)
:
case PlayState.Stopped:
break; <-- breakpoint is here
而我什么也没做。我只是点击继续,然后播放所有曲目。但如果没有这个,并不是每首曲目都在播放(有些曲目只是没有开始播放,只有沉默)。我知道它与那个状态无关(或者我认为)。我认为问题可能出在一些缓冲上。当我在某处放置断点时,手机可以在后台做一些事情,然后当我点击继续时,它就可以播放了。我该如何解决?谢谢
编辑:
简单跟踪类
public class TrackSimple
{
public string Title { get; set; }
public string Artist { get; set; }
public string Album { get; set; }
public string TrackLink { get; set; }
public string CoverUri { get; set; }
public TrackSimple()
{
}
public TrackSimple(string title, string artist, string album, string trackLink, string coverUri)
{
Title = title;
Artist = artist;
Album = album;
TrackLink = trackLink;
CoverUri = coverUri;
}
}
播放列表类
public class PlayList
{
public List<TrackSimple> Tracks { get; set; }
public PlayList()
{
Tracks = new List<TrackSimple>();
}
}