设置来自Http请求的MediaElement流

本文关键字:MediaElement 请求 Http 设置 | 更新日期: 2023-09-27 18:14:30

我有一个代码记录一些音乐/视频文件从在线流(视频流或广播)。

我如何修改它设置SetSource属性到我的MediaElement(从IBuffer或Bytes[],…例如)?

(我不能像这样使用这种变体:

mediaElement1。Source = new Uri(urlLinkToOnlineStream);mediaElement1.Play ();

)

我需要设置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();

设置来自Http请求的MediaElement流

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

UWP:

media.Source = new Uri("http://amssamples.streaming.mediaservices.windows.net/49b57c87-f5f3-48b3-ba22-c55cfdffa9cb/Sintel.ism/manifest(format=m3u8-aapl)");

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

示例:Windows Phone Streaming Media

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

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

当你确定你已经用完InMemoryRandomAccessStreamHttpClient时,你必须记住调用Dispose()。否则,您很可能会以内存泄漏告终。

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