从Http请求设置MediaElement的流

时间:2015-09-24 20:03:25

标签: c# xaml windows-phone-8.1 microsoft-metro windows-10

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

如何修改它以将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();

2 个答案:

答案 0 :(得分:0)

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

UWP:

static

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

例如:Windows Phone Streaming Media

答案 1 :(得分:0)

我知道这已经过时了,但是我有一个可以适应流的单个音频文件的工作示例。

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

您必须记得在确定已完成Dispose()InMemoryRandomAccessStream时致电HttpClient。否则你最有可能最终导致内存泄漏。

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