Я создаю проигрыватель 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
Итак, как я уже сказал в комментарии, я использую файл для ускорения теста. Я забыл упомянуть, что я получаю 2-секундное видео каждые 2 секунды, которое мне нужно воспроизвести в плеере.





Я понял это.
Я должен использовать MseStreamSource.
Сначала мне нужно создать MseStreamSource с таким событием:
streamSource = new MseStreamSource();
streamSource.Opened += (_, __) =>
{
if (buffer is null)
{
// it will create buffer where I can write data
buffer = streamSource.AddSourceBuffer("video/MP2T");
buffer.Mode = MseAppendMode.Sequence;
}
};
Затем установите источник:
StreamMediaPlayer.Source = MediaSource.CreateFromMseStreamSource(streamSource);
И если я хочу добавить видео, я должен сделать это так:
buffer.AppendBuffer(reader.ReadBytes(20 * 1024 * 1024).AsBuffer());
Я должен убедиться, что буфер не обновляется. Эта информация обеспечивает свойство IsUpdating.
Согласно вашему описанию, ваша конечная цель - воспроизвести все видео. Итак, почему бы напрямую не установить источник для
MediaPlayerElementдля воспроизведения всего видео? Например,<MediaPlayerElement Source = "ms-appx:///Assets/output.ts" AutoPlay = "True" />