所以,我有这个应用程序,我想从曲目列表中选择一个曲目并播放它。问题是,某些曲目需要媒体流源才能播放(例如,ogg 文件)。
在后台音频代理中,我被指示将音轨的源属性保留为空,如果我希望让 MSS 为我解码而不使用内置芯片。基本上,我做什么在前台应用程序中是这样的:
创建一个音轨实例,其源设置为 null。我将标签设置为携带识别文件所需的一切,因此我可以在后台代理中使用它。
在后台音频代理中,我跟踪执行,一切似乎都很好,直到我尝试解压缩标签以找出前台应用程序想要播放的内容。此时,我得到一个 Argument Out of Range 异常,说 Source 属性不能为空。
我想我在某处做错了什么,但是当我想使用 tag 属性时,我不明白为什么 CLR 会抛出关于源的异常。
经过更多研究,我发现不需要媒体流源的轨道可以正确处理。但是,如果我将源属性设置为 null,不知何故,音轨中的所有数据都会被删除。我的轨道工厂(创建这些轨道的方法),如果我将源设置为空,则返回一个没有标签的轨道,否则工作正常。
AudioTrack GetTrack(LowMemorySongDisplay t)
{
AudioTrack track;
for (int i = 0; i < SystemSupportedFormats.Length; i++)
{
if (t.SkydriveSong.Name.ToLower().Contains(SystemSupportedFormats[i]))
{
track = new AudioTrack(new Uri("MUSIC/" + t.SkydriveSong.Name, UriKind.Relative), t.SkydriveSong.Name, t.SkydriveSong.Artist, t.SkydriveSong.Album, null, t.SkydriveSong.Compress() + "?", EnabledPlayerControls.All);
return track;
}
}
return track = new AudioTrack(null, t.SkydriveSong.Name, t.SkydriveSong.Artist, t.SkydriveSong.Album, null, t.SkydriveSong.Compress() + "?", EnabledPlayerControls.All);
}
如您所见,此方法返回 2 个不同的轨道,具体取决于文件支持的格式条件。mp3 文件将获取源作为 URI,而 OGG 将获取 null(按照音频代理中的说明)。这基本上是它们构造的唯一区别。
但是,具有空源的轨道似乎忽略了其他所有内容,并且所有其他成员也都为空......
这是调用它的方法
void SongsList_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
try
{
if (App.IsmediaLib)
{
MediaPlayer.Play(((LowMemorySongDisplay)(SongsList.SelectedItem)).associatedSong);
}
else
{
AudioTrack track;
var t= ((LowMemorySongDisplay)(SongsList.SelectedItem));
//BackgroundAudioPlayer.Instance.Track = new AudioTrack(new Uri("MUSIC/" + t.SkydriveSong.Name, UriKind.Relative), t.SkydriveSong.Name, t.SkydriveSong.Artist, t.SkydriveSong.Album, null, t.SkydriveSong.Compress()+"?", EnabledPlayerControls.All);
Collection.Clear();
Collection.Add(new LowMemorySongDisplay(t.SkydriveSong));
//PlayListCOntainer.ItemsSource = Collection;
command = "fromtag";
SaveState();
((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IconUri = new Uri("Assets/transport.pause.png", UriKind.Relative);
((ApplicationBarIconButton)ApplicationBar.Buttons[1]).Text = "pause";
BackgroundAudioPlayer.Instance.Track = GetTrack(t);
BackgroundAudioPlayer.Instance.Play();
}
}
catch (Exception te) { te.ToString(); }
}
这里抛出异常
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
try
{
if (PlaylistName == null && track.Tag != null && track.Tag.Contains('>') == false)
{
PlaylistName = track.Tag;
DeserializeSongData();
}
else if (PlaylistName == null && track.Tag == null)
{
PlaylistName = "allsongs";
DeserializeSongData();
}
else if (PlaylistName != track.Tag && track.Tag != null && track.Tag.Contains('>') == false)
{
PlaylistName = track.Tag;
DeserializeSongData();
}
else if(track.Tag.Contains('?') && Command=="fromtag")
{ **//above line throws exception**
string[] t = track.Tag.Split('?');
NowPlaying.Add(new MusicDataStorage(t[0].Split('>')));
Command = "donothing";
if (NowPlaying.Count > 1)
{
NowPlaying.RemoveAt(0);
}
}
}
catch (Exception e) { e.ToString(); }
switch (playState)
{
case PlayState.TrackEnded:
player.Track = GetPreviousTrack();
break;
case PlayState.TrackReady:
player.Play();
break;
case PlayState.Shutdown:
SaveState();
break;
case PlayState.Unknown:
break;
case PlayState.Stopped:
break;
case PlayState.Paused:
break;
case PlayState.Playing:
break;
case PlayState.BufferingStarted:
break;
case PlayState.BufferingStopped:
break;
case PlayState.Rewinding:
break;
case PlayState.FastForwarding:
break;
}
NotifyComplete();
}