Как обновить буфер MediaPlayerElement в реальном времени?

Я создаю проигрыватель 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

Согласно вашему описанию, ваша конечная цель - воспроизвести все видео. Итак, почему бы напрямую не установить источник для MediaPlayerElement для воспроизведения всего видео? Например, <MediaPlayerElement Source = "ms-appx:///Assets/output.ts" AutoPlay = "True" />

Xie Steven 28.05.2019 04:21

Итак, как я уже сказал в комментарии, я использую файл для ускорения теста. Я забыл упомянуть, что я получаю 2-секундное видео каждые 2 секунды, которое мне нужно воспроизвести в плеере.

Piotr Krupa 28.05.2019 13:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял это. Я должен использовать 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.

Другие вопросы по теме