C# 从Http请求为MediaElement设置流

C# 从Http请求为MediaElement设置流,c#,xaml,windows-phone-8.1,microsoft-metro,windows-10,C#,Xaml,Windows Phone 8.1,Microsoft Metro,Windows 10,我有一个从在线视频流或收音机中录制音乐/视频文件的代码 如何从IBuffer或Bytes[],将SetSource属性设置为我的MediaElement,。。。比如说 我不能这样使用变体: mediaElement1.Source=新的UrlLinkToOnlineStream; 媒介元素1.游戏 我需要直接从已经打开的流中设置SetSource,我需要写入文件,并在同一时刻或稍加停顿从流中记录相同的字节[] HttpClientHandler aHandler = new HttpClien

我有一个从在线视频流或收音机中录制音乐/视频文件的代码

如何从IBuffer或Bytes[],将SetSource属性设置为我的MediaElement,。。。比如说

我不能这样使用变体:

mediaElement1.Source=新的UrlLinkToOnlineStream; 媒介元素1.游戏

我需要直接从已经打开的流中设置SetSource,我需要写入文件,并在同一时刻或稍加停顿从流中记录相同的字节[]

HttpClientHandler aHandler = new HttpClientHandler();
aHandler.ClientCertificateOptions = ClientCertificateOption.Automatic;
HttpClient aClient = new HttpClient(aHandler);
aClient.DefaultRequestHeaders.ExpectContinue = false;
HttpResponseMessage response = await aClient.GetAsync(urlLinkToOnlineStream, HttpCompletionOption.ResponseHeadersRead); 
var destinationFile = await KnownFolders.MusicLibrary.CreateFileAsync(@"recorded.mp3", CreationCollisionOption.ReplaceExisting);
var fileStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite);

Stream stream = await response.Content.ReadAsStreamAsync();
IInputStream inputStream = stream.AsInputStream();
ulong totalBytesRead = 0;
while (true)
{
    // Read from the web.
    IBuffer buffer = new Windows.Storage.Streams.Buffer(1024);
    buffer = await inputStream.ReadAsync(buffer, buffer.Capacity, InputStreamOptions.None);
    if (buffer.Length == 0)
    {
        break;
    }
    totalBytesRead += buffer.Length;
    await fileStream.WriteAsync(buffer);
}
inputStream.Dispose();
fs.Dispose();

您正在开发通用Windows平台应用程序还是Windows Phone 8.1应用程序?UWP支持HTTP Live stream等媒体流协议。您可以直接将URL分配给媒体元素

UWP:

对于Windows Phone 8.1,您可以使用开源流媒体库


例如:

我知道这很旧,但是我有一个可以适用于流的单个音频文件的工作示例

InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
HttpClient hc = new HttpClient();
HttpResponseMessage msg = await hc.GetAsync(urlLinkToOnlineStream);
await RandomAccessStream.CopyAsync(await msg.Content.ReadAsInputStreamAsync(), stream);
stream.Seek(0);
myMediaElement.SetSource(stream, msg.Content.Headers.ContentType.ToString());
当您确定已完成InMemoryRandomAccessStream和HttpClient时,必须记住调用它们。否则,很可能会导致内存泄漏

我不完全确定您打算如何进行缓冲,但是如果在我的示例中调用流上的Dispose,则播放将失败。如果您在当前数据块完成之前调用SetSource,它也将开始播放新的数据块。

我有一个将Windows.Web.Http.HttpClient与MediaElement连接的示例,这里有一个System.Net.Http.HttpCient与MediaElement的示例:
InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
HttpClient hc = new HttpClient();
HttpResponseMessage msg = await hc.GetAsync(urlLinkToOnlineStream);
await RandomAccessStream.CopyAsync(await msg.Content.ReadAsInputStreamAsync(), stream);
stream.Seek(0);
myMediaElement.SetSource(stream, msg.Content.Headers.ContentType.ToString());