我正在转换一个用 Silverlight 编写的应用程序,到目前为止,我已经成功解决了所有问题,除了一个:
由于某种原因,模拟器拒绝播放应用程序的任何音频文件,甚至没有抛出异常。我查过了,在铃声类别中它可以发出声音。
原始代码是:
<Grid x:Name="sharedFullScreenFilePathContainer"
Tag="{Binding StringFormat=\{0\},Converter={StaticResource fullScreenImageConverter}}">
<Image x:Name="fullScreenImage" Stretch="Fill"
Source="{Binding ElementName=sharedFullScreenFilePathContainer,Path=Tag, StringFormat=../Assets/images/\{0\}.jpg}"
ImageFailed="onFullScreenImageFailedToLoad" MouseLeftButtonDown="onPressedOnFullScreenImage" />
<MediaElement x:Name="mediaPlayer" AutoPlay="True"
Source="{Binding ElementName=sharedFullScreenFilePathContainer,Path=Tag, StringFormat=../Assets/sounds/\{0\}.wma}" />
</Grid>
所以,我设置到这个项目的上下文的图像真的被显示了,但是我设置的路径上真正存在的声音没有播放(我已经检查了“Bin”文件夹)。
我尝试使用代码而不是 xaml,但我仍然遇到同样的问题。
我试过这个(虽然它通常用于背景音乐):
AudioTrack audioTrack = new AudioTrack(new Uri("../Assets/sounds/" + fileToOpen, UriKind.Relative), "", "", "", null);
BackgroundAudioPlayer player = BackgroundAudioPlayer.Instance;
player.Track = audioTrack;
player.Play();
它没有播放任何东西,也没有抛出任何异常。
我也尝试了下一个代码,但它引发了异常(找不到文件异常),可能是因为我没有正确调用它:
Stream stream = TitleContainer.OpenStream("@Assets/sounds/" + fileToOpen);
SoundEffect effect = SoundEffect.FromStream(stream);
FrameworkDispatcher.Update();
effect.Play();
我也尝试过使用 wma 文件,但也没有用。
我还尝试使用 mp3 文件的“复制到输出目录”参数(“始终”和“仅当新”)和“构建操作”参数(“无”和“内容”)。没有什么帮助。
谁能帮帮我吗?我很长时间没有为 Silverlight/WP 开发,我不知道如何修复它。
顺便说一句,因为稍后我需要知道声音何时播放完毕(并且还能够停止它),所以无论如何我都想使用代码。如果你也能告诉我怎么做,我会很高兴(如果需要,我可以在新帖子上问)。
编辑:好的,我发现了问题:在使用MediaPlayer.Play()方法时,我不断收到一个奇怪的异常,在检查了异常之后,我发现这是一个已知问题,而且我需要调用FrameworkDispatcher.Update(); 就在我调用 Play() 方法之前。
所以解决方案是做这样的事情:
Song song = Song.FromUri(...);
MediaPlayer.Stop();
FrameworkDispatcher.Update();
MediaPlayer.Play(song);
例外是:
System.Windows.ni.dll 中发生“System.InvalidOperationException”
我在这里找到了解决方案。
现在的问题是为什么,为什么我在 windows phone 的演示中没有找到任何相关的东西?另外,我想知道这个函数是做什么的。
好的,既然没有人给我两个问题的答案,我仍然希望给予赏金,我会问另一个问题:
如果除了使用 windows phone 的 MediaPlayer 类之外真的没有解决方案,我如何捕获完成播放音频文件的事件?即使获取音频文件的持续时间也不起作用(无论我尝试使用哪个类,都会返回 0 length )...