2010-05-30 26 views
14

nềnLàm thế nào để phát không đệm WAV với MediaStreamSource thực hiện trong Silverlight 4?

Tôi đang cố gắng để dòng một tập tin sóng trong Silverlight 4 sử dụng thực hiện MediaStreamSource tìm thấy here. Vấn đề là tôi muốn phát tệp trong khi tệp vẫn đang lưu vào bộ đệm hoặc ít nhất cung cấp cho người dùng một số phản hồi trực quan trong khi nó đang lưu vào bộ đệm. Còn bây giờ mã của tôi trông như thế:

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(); 
    }); 
} 

Vấn đề là sau khi cài đặt request.AllowReadStreamBuffering = false dòng không hỗ trợ tìm kiếm và thực hiện đề cập ở trên ném một ngoại lệ (ghi nhớ Tôi đã đặt một số logic thiết lập vị trí vào if (stream.CanSeek) khối):

đọc không được hỗ trợ trên các chủ đề chính khi đệm bị vô hiệu hóa

Câu hỏi

Có cách nào để phát luồng WAV mà không phải đệm trước trong Silverlight 4 không?

Trả lời

3

Tải xuống luồng khi bạn đọc nó sẽ không hoạt động vì đọc steram để phát lại sẽ di chuyển thuộc tính Vị trí trong luồng và khi bạn ghi dữ liệu vào luồng, vị trí sẽ không ở đúng vị trí . đó là lý do tại sao bạn không thể tìm kiếm trong luồng của mình.

Những gì tôi đã làm để giải quyết vấn đề chính xác đó là tạo luồng bộ nhớ tùy chỉnh (ReadWriteMemoryStream) sẽ nhúng logic để đọc/ghi để tôi có thể tải tệp xuống một đầu, thêm nó vào ReadWriteMemoryStream và dựa vào MediaStreamSource của tôi trên ReadWriteMemoryStream này thay vì luồng mạng.

Bạn có thể tìm thực hiện của tôi ReadWriteMemoryStream này ở đây:

https://github.com/salfab/open-syno/blob/master/OpenSyno/OpenSyno/ReadWriteMemoryStream.cs

bạn cũng có thể kiểm tra phần còn lại của dự án để có một cái nhìn tại sử dụng của nó nếu bạn không chắc chắn về điều đó.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan