Воспроизведение MPEG-2 TS с помощью MseStreamSource

Мне нужно отобразить поток видео в реальном времени в приложении 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?


person Nicolas Séveno    schedule 17.04.2018    source источник
comment
Как упоминалось в документе, если указана поддержка MPEG-2 / MPEG-1, она поддерживается только при установке дополнительного универсального приложения Microsoft DVD для Windows. не могли бы вы попробовать установить приложение? И кстати, все пакеты выдали исключение или только части?   -  person Sunteen Wu    schedule 03.05.2018
comment
Если я ищу Microsoft DVD в Магазине Windows, я получаю приложение под названием Extension vidéo MPEG-2. У меня Windows на французском. Я пытался установить это приложение. Но это ничего не меняет. Что касается исключений, это только для некоторых пакетов.   -  person Nicolas Séveno    schedule 14.05.2018
comment
Наконец-то я нашел приложение Microsoft DVD. Установил, но ничего не меняет.   -  person Nicolas Séveno    schedule 15.05.2018
comment
Я отредактировал свой вопрос. Я обнаружил, что буферы UDP содержат правильные пакеты MPEGTS. Также обнаружил режим MseAppendMode.Sequence. Но это ничего не меняет.   -  person Nicolas Séveno    schedule 17.05.2018


Ответы (1)


Наконец-то видео заработало!

Вот шаги, которые я выполняю, чтобы извлечь пакеты MPEG-TS и правильно отправить их в MseStreamSource:

MseSourceBuffer должен находиться в режиме «Последовательность»:

_mseSourceBuffer.Mode = MseAppendMode.Sequence;

Для каждой полученной дейтаграммы UDP я извлекаю пакеты MPEG-TS. Для этого я игнорирую первые 12 байтов дейтаграммы UDP. Затем я извлекаю каждый пакет размером 188 байт в отдельный массив (каждый пакет начинается с 0x47).

Я отправляю каждый пакет в синхронизированную очередь.

Я удаляю пакеты из очереди и отправляю их сгруппированными в MseSourceBuffer. Я создаю новую группу для каждого пакета PAT (pid = 0):

byte[] bytes;
// [...] combine the packets of the group
mseSourceBuffer.AppendBuffer(bytes.AsBuffer());

Я попытался использовать MemoryStream и вызвать метод AppendStream (), но безуспешно.

Также позаботьтесь о синхронизации потоков: порядок пакетов не должен быть потерян. Это причина синхронизированной очереди.

Надеюсь, это поможет кому-то другому.

Эта страница wikipedia MPEG-TS очень помогла мне.

person Nicolas Séveno    schedule 18.05.2018