【问题标题】:Set stream for MediaElement from Http request从 Http 请求为 MediaElement 设置流
【发布时间】:2015-09-24 20:03:24
【问题描述】:

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

如何修改它以将 SetSource 属性设置为我的 MediaElement(例如来自 IBuffer 或 Bytes[],...)?

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

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

)

我需要直接从已经打开的流中设置 SetSource(我需要写入文件并在同一时刻或稍稍停顿一下从流中记录相同的 bytes[])。

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

【问题讨论】:

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


【解决方案1】:

您是在开发通用 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

【讨论】:

    【解决方案2】:

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

    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,它也会开始播放新的数据块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 2014-08-23
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2016-04-03
      相关资源
      最近更新 更多