Как играть в небуферизованной WAV с реализацией MediaStreamSource в Silverlight 4?
Фон
Я пытаюсь передать волновой файл в Silverlight 4 с использованием реализации MediaStreamSource, найденного здесь. Проблема в том, что я хочу воспроизвести файл, пока он все еще буферизуется, или, по крайней мере, дать пользователю некоторую визуальную обратную связь при буферизации. На данный момент мой код выглядит следующим образом:
private void button1_Click(object sender, RoutedEventArgs e)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(App.Current.Host.Source, "../test.wav"));
//request.ContentType = "audio/x-wav";
request.AllowReadStreamBuffering = false;
request.BeginGetResponse(new AsyncCallback(RequestCallback), request);
}
private void RequestCallback(IAsyncResult ar)
{
this.Dispatcher.BeginInvoke(delegate()
{
HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);
WaveMediaStreamSource wavMss = new WaveMediaStreamSource(response.GetResponseStream());
try
{
me.SetSource(wavMss);
}
catch (InvalidOperationException)
{
// This file is not valid
}
me.Play();
});
}
Проблема заключается в том, что после установки request.AllowReadStreamBuffering = false
поток не поддерживает поиск, и вышеупомянутая реализация генерирует исключение (помните, что я поместил некоторую логику установки позиции в блок if (stream.CanSeek)
):
Чтение не поддерживается в основном потоке, когда буферизация отключена.
Вопрос
Есть ли способ воспроизведения WAV-потока без предварительной буферизации в Silverlight 4?
Ответы
Ответ 1
Загрузка потока во время его чтения не будет работать, потому что чтение стемер для воспроизведения приведет к перемещению свойства Position в потоке, и когда вы будете записывать данные в поток, позиция не будет в правильном положении. в основном, почему вы не можете искать в своем потоке.
То, что я сделал для решения этой точной проблемы, было создание настраиваемого потока памяти (ReadWriteMemoryStream), который бы вставлял логику для чтения/записи, чтобы я мог загрузить файл на одном конце, добавить его в ReadWriteMemoryStream и основать свой MediaStreamSource на этот ReadWriteMemoryStream вместо сетевого потока.
Вы можете найти мою реализацию этого ReadWriteMemoryStream здесь:
https://github.com/salfab/open-syno/blob/master/OpenSyno/OpenSyno/ReadWriteMemoryStream.cs
вы также можете проверить остальную часть проекта, чтобы просмотреть его использование, если вы не уверены в этом.
Надеюсь, что это поможет.