Мне нужно отобразить поток видео в реальном времени в приложении UWP.
Видеопоток поступает с GoPro. Транспортируется UDP-сообщениями. Это поток TS MPEG-2. Я могу успешно воспроизвести его, используя FFPlay со следующей командной строкой:
ffplay -fflags nobuffer -f:v mpegts udp://:8554
Я хотел бы воспроизвести его с помощью MediaPlayerElement без использования сторонней библиотеки.
Согласно следующей странице: https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/supported-codecs UWP должна иметь возможность воспроизводить его. (Я установил приложение "Microsoft DVD" в Магазине Windows).
Я получаю поток TS MPEG-2 с помощью UdpClient. Это работает хорошо. Я получаю в каждом UdpReceiveResult 12-байтовый заголовок, за которым следуют 4, 5, 6 или 7 пакетов MPEGTS (каждый пакет составляет 188 байтов, начиная с 0x47).
Я создал MseStreamSource:
_mseStreamSource = new MseStreamSource();
_mseStreamSource.Opened += (_, __) =>
{
_mseSourceBuffer = _mseStreamSource.AddSourceBuffer("video/mp2t");
_mseSourceBuffer.Mode = MseAppendMode.Sequence;
};
_mediaPlayerElement.MediaSource = MediaSource.CreateFromMseStreamSource(_mseStreamSource);
Вот как я отправляю сообщения в MseStreamSource:
UdpReceiveResult receiveResult = await _udpClient.ReceiveAsync();
byte[] bytes = receiveResult.Buffer;
mseSourceBuffer.AppendBuffer(bytes.AsBuffer());
MediaPlayerElement отображает сообщение «видео не поддерживается или неверное имя файла». (не уверен в сообщении, моя Windows на французском языке).
Это хорошая идея - использовать режим MseAppendMode.Sequence? Что мне передать методу AppendBuffer? Необработанное сообщение udp, включающее 12-байтовый заголовок или каждый 188-байтовый пакет MPEGTS?