我正在开发WPF应用程序,它将一些声音文件存储为数据库中的字节数组。我想通过MediaElement控件播放这些文件。 MediaElement具有Source属性,但其类型为Uri。有谁知道是否可以将字节数组转换为Uri?
由于
答案 0 :(得分:2)
以下是使用自托管媒体服务器的解决方法
让我们开始
MainWindow.xaml
<MediaElement x:Name="media" />
MainWindow.cs
public MainWindow()
{
InitializeComponent();
//host a media server on some port
MediaServer ws = new MediaServer(RenderVideo, "http://localhost:8080/");
ws.Run();
//set the media server's url as the source of media element
media.Source = new Uri("http://localhost:8080/");
}
private byte[] RenderVideo(HttpListenerRequest r)
{
//get the video bytes from the server etc. and return the same
return File.ReadAllBytes("e:\\vids\\Wildlife.wmv");
}
MediaServer类
class MediaServer
{
private readonly HttpListener _listener = new HttpListener();
private readonly Func<HttpListenerRequest, byte[]> _responderMethod;
public MediaServer(Func<HttpListenerRequest, byte[]> method, string prefix)
{
if (!HttpListener.IsSupported)
throw new NotSupportedException(
"Needs Windows XP SP2, Server 2003 or later.");
if (prefix == null)
throw new ArgumentException("prefix");
if (method == null)
throw new ArgumentException("method");
_listener.Prefixes.Add(prefix);
_responderMethod = method;
_listener.Start();
}
public void Run()
{
ThreadPool.QueueUserWorkItem((o) =>
{
try
{
while (_listener.IsListening)
{
ThreadPool.QueueUserWorkItem((c) =>
{
var ctx = c as HttpListenerContext;
try
{
byte[] buf = _responderMethod(ctx.Request);
ctx.Response.ContentLength64 = buf.Length;
ctx.Response.ContentType = "application/octet-stream";
ctx.Response.OutputStream.Write(buf, 0, buf.Length);
}
catch { }
finally
{
ctx.Response.OutputStream.Close();
}
}, _listener.GetContext());
}
}
catch { }
});
}
public void Stop()
{
_listener.Stop();
_listener.Close();
}
}
尝试一下,我能成功播放视频,我希望你也一样
对于MediaServer,我使用Simple C# Web Server进行了一些修改。
使用Reactive Extensions可以缩短上面的。如果这对你有用,我会试一试。
此外,我们可以使媒体服务器通用,在网址中传递视频的ID,作为回报,它将从数据库中流回所需的视频