C# 从Http请求为MediaElement设置流
我有一个从在线视频流或收音机中录制音乐/视频文件的代码 如何从IBuffer或Bytes[],将SetSource属性设置为我的MediaElement,。。。比如说 我不能这样使用变体: mediaElement1.Source=新的UrlLinkToOnlineStream; 媒介元素1.游戏 我需要直接从已经打开的流中设置SetSource,我需要写入文件,并在同一时刻或稍加停顿从流中记录相同的字节[]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
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());