Доступ к транспортным пакетам MPEG через .NET

#c# #.net #opencv #mpeg #mpeg-2

#c# #.net #opencv #mpeg #mpeg-2

Вопрос:

Мне приходится иметь дело с транспортными пакетами MPEG 2 с использованием .NET. Каков наилучший способ сделать это? В настоящее время я рассматриваю возможность использования OpenCV для достижения этой цели, но пока не уверен, возможно ли это.

Комментарии:

1. Пожалуйста, выберите ответ или отредактируйте свой вопрос, чтобы сделать его более понятным

Ответ №1:

ПРИМЕЧАНИЕ: Я предполагаю, что вы используете Windows, поскольку хотите настроить таргетинг на .NET.
Я делал это в прошлом. Насколько я знаю, полного нет.ЧИСТЫЙ доступный исходный код для использования.

РЕДАКТИРОВАТЬ: OpenCV не поможет вам с вашей задачей. Вы можете использовать OpenCV для отображения видео (внутри он использует FFMPEG) Но у вас не будет доступа к пакетам. Также нелегко взломать библиотеку FFMPEG, поставляемую с OpenCV, поскольку в Windows она будет предварительно скомпилирована.

Дальнейший путь на самом деле зависит от ваших потребностей. Однако, если вам нужно работать на уровне пакетов, вам придется изучить спецификацию TS MPEG2. Википедия — хорошее место для начала, но в конечном итоге вам придется прочитать саму спецификацию iso13818-1 и, необязательно, iso13818-2. Вы можете найти копии этого по всей сети — просто погуглите. Вы можете найти некоторые эталонные реализации в C / C VLC, FFMPEG, libmpeg gstreamer (в плохих плагинах), однако я могу заверить вас, что их трудно читать и они не очень хорошо документированы. Кроме того, написание полного и надежного мультиплексора MPEG TS или демультиплексора является сложной задачей, которая требует утомительного изучения документации. Существует инструмент .NET под названием «MPEG-2 Transport Stream packet analyzer», написанный на .NET, он выглядит как полная реализация, однако код недоступен в свободном доступе — возможно, автор захочет продать его вам. Вы можете получить к нему доступ из http://www.pjdaniel.org.uk/mpeg /

В зависимости от ваших C / C и навыков программирования я порекомендую один из следующих вариантов:

  1. НЕТ навыков C / C , но очень высокие навыки программирования Или нужно выполнить только некоторую базовую работу с пакетами:
    Прочитайте документы, реализуйте именно то, что вам нужно
  2. Хорошие навыки работы с C / C и терпение для компиляции FFMPEG с помощью MinGW и чтения чужого кода:
    Возьмите FFMPEG (libavcodec) и изучите реализацию MpegTS, впишите в нее свои хуки и экспортируйте простые функции C, с которыми вы можете взаимодействовать с .NET

Я бы рекомендовал второй вариант, если только вам не нужно выполнять ремуксирование или другие серьезные манипуляции с самим потоком битов

Вы должны заметить, что, учитывая сложность протокола TS, им проще манипулировать с помощью C / C (что я и сделал в конце концов, начав с C #) и перезаписать его с помощью .NET.

Мне пришлось написать свой собственный демультиплексор и мультиплексор для определенного проекта, у которого были очень специфические потребности. Это была непростая задача (на правильную реализацию всего этого у меня ушло около 300 часов), и в итоге результат оказался не таким надежным, как коммерческий мультиплексор или демультиплексор от Elecard или MainConcept — Однако готовые продукты не делали того, что нам было нужно. Я написал их на C — использовал DirectShow (на C ) для написания фильтра исходного кода, декодировал с помощью Elecard (который работал лучше, чем MainConcept в то время) и написал свой собственный рендерер для отображения фактического видео. Управление всей цепочкой DirectShow осуществлялось с C # с использованием interop.

После того, как вы выбрали свой путь, вам следует принять некоторые другие решения в зависимости от того, что вы делаете с пакетами. Если вы хотите отправить их в декодер или мультиплексор, вы можете использовать DirectShow для этого. Вам придется помещать все, что вы делаете, в фильтр источника, фильтр преобразования или фильтр назначения, в зависимости от того, откуда вы получаете данные. Если вы хотите реализовать свой фильтр в .NET, вы можете использовать форму «Pure .NET DirectShow Filters in C #» Максима Картавенковаhttp://www.codeproject.com/Articles/421167/Pure-NET-DirectShow-Filters-in-Csharp. (Или купите Elecard .NET SDK, если вам нужна коммерческая поддержка). Для начала работы есть несколько справочных фильтров, хотя вам также придется ознакомиться с документацией DirectShow. Если вы просто посмотрите на пакеты, возможно, измените их и запишите обратно, то, возможно, вы сможете написать для этого свою собственную чистую реализацию или взломать реализацию mpegts в libavcodec, это не так сложно, просто несколько часов удовольствия, выясняя, что происходит — хотя и очень поучительно. libavcodec имеет очень понятный интерфейс, поэтому вы можете легко вернуть измененные пакеты обратно — для этого вам также придется прочитать документацию.

Итак, я не уверен, что это тот ответ, который вы хотели, но простого пути к тому, что вы хотите, нет.

Ответ №2:

Возможно, вам покажется более полезным традиционный путь разработки фильтра DirectShow, например, с использованием этого пакета компонентов.

Комментарии:

1. Я просмотрел документацию компонента, на который вы ссылаетесь, но там нет информации о том, как работать с MPEG TS. И пробная версия SDK не содержит исходного кода примеров. Не могли бы вы указать на несколько примеров, чтобы я мог выполнить свою задачу, используя этот компонент?

2. @Anton: Справочное руководство ( elecard.com/assets/files/manuals/codec-.net-sdk / … ) показывает, какие фильтры они предоставляют, и хотя исходный код для образцов не поставляется с версией eval, я с легкостью построил график с помощью GraphEdit, который успешно воспроизводил TS MPEG-2 (по сути, используя их MPEG2 demux MPEG2 декодер). Этого было бы достаточно, чтобы убедить меня, действительно ли мне это нужно прямо сейчас.

Ответ №3:

SDP-файлы потрясающие. Я не знаю, нужно ли вам обрабатывать это на уровне пакетов, но обычно я создаю SDP-файл скриптом. Все медиаплееры, с которыми я тестировал — Windows Media, VLC, Quicktime — поддерживают их. Затем, если вам нужно встроить носитель в веб-страницу, форму или в запись, это может быть легко достигнуто с помощью API для соответствующего проигрывателя.

SDP-файл передаст контейнер, кодировку и сетевую информацию, необходимую проигрывателю для получения самого потока.

Я потратил кучу времени, играя с direct show, пока не понял, что Windows Media Player — чертовски хорошая реализация, и она создаст все ваши фильтры на основе SDP-файла. Это довольно просто. Вот спецификация:

http://www.ietf.org/rfc/rfc4566.txt

У VLC также есть действительно хороший API для такого рода вещей.

Комментарии:

1. Спасибо, но мне нужно разобраться именно с пакетами, чтобы выполнить некоторые низкоуровневые работы.

2. мой опыт работы с низкоуровневыми материалами в основном в Linux, но я сделал это в gstreamer, используя элементы ffmpeg. У Gstreamer нет порта Windows (хотя у C # есть порт Linux), но у ffmpeg есть, и он также с открытым исходным кодом. Элементы FFMPEG позволят вам получить доступ к базовым данным, а также поиграть с их кодировкой и контейнерами.

Ответ №4:

Я не уверен, что полностью понимаю ваш вопрос, если вы делаете .СЕТЬ и захват пакетов MPEG, а затем необходимо выполнить некоторую обработку, OpenCV был бы хорош, но предложил бы использовать Aforge.NET Это поможет вам избежать написания операций взаимодействия для OpenCV. Он содержит широкую коллекцию библиотек обработки видео и должен быть полезен для вас.

Комментарии:

1. Я только что проверил AForge. Сетевая документация и, насколько я понимаю, она позволяет работать только с файлами AVI, потоками JPEG / MJPEG и предоставляет оболочку верхнего уровня для DirectShow, которая позволяет обрабатывать только отдельные кадры, а не пакеты MPEG. Пожалуйста, поправьте меня, если я ошибаюсь.

2. code.google.com/p/aforge/source/detail?r=1442 Я как раз обхожу эту тему. Ответ может быть «да» или «нет» с точки зрения поддержки. Пожалуйста, проверьте это.

Ответ №5:

http://net7mma.codeplex.com имеет класс для их чтения среди других типов форматов контейнеров mpeg и не mpeg.

Все варианты ts также корректно поддерживаются, включая atsc.

(Де) Мультиплексирование из одного в другой также скоро будет поддерживаться.

Ответ №6:

Вот пример на .NET, обрабатывающий списки воспроизведения HTTP Live Streaming ( .m3u8 файлы). Он загружает .ts файлы из списка воспроизведения в память и использует библиотеку NAudio для анализа и извлечения аудиопотока.