Как обновить буфер MediaPlayerElement в реальном времени? - PullRequest
0 голосов
/ 28 мая 2019

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

1 Ответ

0 голосов
/ 28 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...