Я создаю проигрыватель Twitch с помощью MediaPlayerElement и хочу обновить буфер MediaPlayerElement в режиме реального времени, но я не знаю как.
Я пытался сделать это так:
public sealed partial class MainPage : Page
{
MemoryStream stream = new MemoryStream(64 * 1024 * 1024);
BinaryWriter writer;
BinaryReader reader;
Task task;
public MainPage()
{
this.InitializeComponent();
writer = new BinaryWriter(stream);
}
async void ReadTask()
{
while (true)
{
var bytes = reader.ReadBytes(1024 * 1024);
if (bytes.Length == 0)
{
break;
}
writer.Write(bytes);
// Do some delay to see progress of loading
await Task.Delay(1000);
}
}
private async void Page_Loaded(object sender, RoutedEventArgs e)
{
// I'm using file to speed up tests
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/output.ts"));
reader = new BinaryReader(await file.OpenStreamForReadAsync());
// Write few first bytes
writer.Write(reader.ReadBytes(1024 * 1024));
// Start task which will write more bytes soon
task = new Task(ReadTask);
task.Start();
StreamMediaPlayer.AreTransportControlsEnabled = true;
StreamMediaPlayer.AutoPlay = true;
StreamMediaPlayer.MediaPlayer.Volume = 0;
StreamMediaPlayer.Source = MediaSource.CreateFromStream(writer.BaseStream.AsRandomAccessStream(), "video/MP2T");
}
}
Этот код работает, но проигрыватель отображает только первые 1 МБ, которые я написал до установки источника, даже если TaskRead()
записывает больше байтов при воспроизведении видео.
Я также пытался использовать метод CreateFromStreamReference
вместо CreateFromStream
вот так:
var s = RandomAccessStreamReference.CreateFromStream(writer.BaseStream.AsRandomAccessStream());
StreamMediaPlayer.Source = MediaSource.CreateFromStreamReference(s, "video/MP2T");
Но это совсем не работает.
Вот полный проект с видео: https://drive.google.com/open?id=175Z5HzK3MJ-Dm4ZX84r81lWYtZ0ahSSS