2015-09-24 6 views
0

У меня есть код для записи некоторого музыкального/видеофайла из онлайн-потока (видеопотока или радио).Установить поток для MediaElement из запроса Http

Как изменить его для установки свойства SetSource в свой MediaElement (например, из IBuffer или Bytes [], ...)?

(я не могу использовать вариант, как это:

mediaElement1.Source = новый Ури (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(); 
+0

У меня есть образец для подключения 'Windows.Web.Http.HttpClient' с' MediaElement' здесь: https://github.com/kiewic/MediaElementWithHttpClient И есть образец 'System.Net.Http.HttpCient' с «MediaElement» здесь: http://stackoverflow.com/questions/18594659/how-to-play-a-video-stream-that-requires-authentication/18630815#comment53215153_18630815 – kiewic

ответ

0

Вы разрабатываете приложение для Windows Vista или 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

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 до завершения текущего фрагмента.