3

我使用WaveMediaStreamSource (WAVmss)库在 silverlight 媒体元素上播放波形文件。
它在我第一次将文件加载到元素中时播放,但是当我第二次尝试播放时它不会播放。
我使用了这里的示例。

也许我遗漏了一些东西,这是我第一次打开波形文件并成功播放的代码,这是我的媒体元素中读取和设置为源的文件:

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事件再次弹出。

我能做些什么?

4

2 回答 2

1

感谢 Gilles Khouzam的快速响应,问题已得到解决。

好的,我发现了问题。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 );
于 2013-01-29T07:24:19.300 回答
0

在 MediaEnded 事件中,将“sender”强制转换为 MediaElement 并调用 Stop()。这将重置对象,以便您可以再次播放它。

于 2013-01-29T01:46:27.710 回答