我使用WaveMediaStreamSource (WAVmss)库在silverlight媒体元素上播放wave文件
它是第一次将文件加载到元素中时播放,但是当我第二次尝试播放它时它不会播放。
我使用了来自here的示例。
也许我错过了一些东西,这是我的代码,我打开wave文件并第一次成功播放,这是我的媒体元素中的文件读取和设置源:
OpenFileDialog openFileDialog = new OpenFileDialog();
MemoryStream audioSource = new MemoryStream();
if (openFileDialog.ShowDialog() == true)
{
using (FileStream fileStream = openFileDialog.File.OpenRead())
{
audioSource.SetLength(fileStream.Length);
fileStream.Read(audioSource.GetBuffer(), 0, (int)fileStream.Length);
}
}
WaveMSS.WaveMediaStreamSource audioStreamSource =
new WaveMSS.WaveMediaStreamSource(audioSource);
mediaElement1.SetSource(audioStreamSource);
当第一次播放时(我知道因为我得到_MediaEnded
事件),我无法再次播放此视频。
我尝试设置MediaElement的位置但无法再次播放:
mediaElement1.Position = TimeSpan.FromSeconds(0);
mediaElement1.Play();
我调试了它,并且Position属性确实设置为零,但是当我尝试再次点击播放时,位置属性移动到结尾,_MediaEnded
事件再次弹出。
我该怎么办?
答案 0 :(得分:1)
感谢Gilles Khouzam quick response,问题已经解决了。
好的,我发现了这个问题。 SeekAsync的实现,位置 在流中被改变但是块中的剩余计数是 不。在WaveMediaStreamSource.cs中,查找SeekAsync方法和 将代码更改为此(添加MoveToChunkOffest行):
this.currentPosition = this.wavParser.WaveFormatEx.BufferSizeFromAudioDuration( seekToTime ) + this.startPosition;
this.wavParser.MoveToChunkOffset( ( uint ) this.wavParser.WaveFormatEx.BufferSizeFromAudioDuration( seekToTime ) );
this.currentTimeStamp = seekToTime;
ReportSeekCompleted( seekToTime );
答案 1 :(得分:0)
在MediaEnded事件中,将“sender”强制转换为MediaElement并调用Stop()。这会重置对象,以便您可以再次播放它。