3

WaveMediaStreamSource(WAVmss)ライブラリを使用して、 Silverlightメディア要素でWaveファイルを再生します。
ファイルを要素に最初にロードしたときに再生されますが、2回目に再生しようとすると、再生されません。こちら
のサンプルを使用しました。

何かが足りないかもしれません。これが、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プロパティはゼロに設定されていますが、もう一度[再生]をクリックしようとすると、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 に答える