通过.NET访问MPEG传输包

Ant*_*eev 8 .net c# opencv mpeg mpeg-2

我必须使用.NET处理MPEG 2传输包.最好的方法是什么?目前我正在考虑使用OpenCV来实现这一目标,但不确定是否可行.

Seb*_*bot 7

注意:我假设您正在使用Windows,因为您想要以.NET为目标.
我过去这样做过.据我所知,没有完整的.NET可用源代码供您使用.

编辑: OpenCV不会帮助您完成任务.您可以使用OpenCV来显示视频(它在内部使用FFMPEG)但您无法访问数据包.此外,攻击OpenCV提供的FFMPEG库也不容易,因为在Windows上它将被预编译.

要走的路径实际上取决于您的需求.但是,如果您需要在数据包级别工作,则必须学习MPEG2 TS规范.维基百科是一个很好的起点,但最终你必须阅读规范本身iso13818-1和可选的iso13818-2.你可以在网上找到它的副本 - 只是google它.您可以在C/C++ VLC,FFMPEG,libmpeg gstreamer(在坏插件中)找到一些参考实现,但是我可以向您保证它们很难阅读并且没有很好的文档记录.编写完整而强大的MPEG TS复用器或分路器也是一项艰巨的任务,需要对文档进行繁琐的检查.有一个名为"MPEG-2传输流数据包分析器"的.NET工具用.NET编写它看起来像一个完整的实现,但代码不是免费提供的 - 也许作者我愿意把它卖给你.您可以从http://www.pjdaniel.org.uk/mpeg/访问它

根据您的C/C++和编程技巧,我将推荐以下选项之一:

  1. 没有C/C++技能但是编程技能非常高或者需要对数据包做一些基本的工作:
    阅读文档实现你需要的东西
  2. 良好的C/C++技能和耐心使用MinGW编译FFMPEG并阅读其他人的代码:使用
    FFMPEG(libavcodec)并查看MpegTS实现编写钩子并导出可以与.NET互操作的纯C函数

除非你需要对比特流本身进行重新加工或其他类型的严格操作,否则我会推荐第二个选项

您应该注意到,考虑到TS协议的复杂性,使用C/C++(这是我在开始使用C#之后最终所做的操作)更容易操作,并且使用.NET进行操作.

我必须为具有特定需求的某个项目编写自己的demuxer和muxer.这不是一件容易的事(整个过程花了我大约300个小时才能正确实现)并且最终结果不像Elecard或MainConcept的商用复用器或分路器那样强大 - 但是现成的产品不会做什么我们需要.我用C++编写它们 - 使用DirectShow(在C++中)编写源过滤器,使用Elecard(当时比MainConcept工作得更好)进行解码,并编写自己的Renderer来显示实际视频.整个DirectShow链是使用interop从C#控制的.

一旦选择了路径,就应该根据对数据包的处理做出其他决定.如果要将它们发送到解码器或多路复用器,则可以使用DirectShow.您必须根据接收数据的位置将所做的事情放入源过滤器,转换过滤器或目标过滤器.如果要在.NET中实现过滤器,可以使用"C#中的Pure .NET DirectShow过滤器"作者:Maxim Kartavenkov,形式为http://www.codeproject.com/Articles/421167/Pure-NET-DirectShow-Filters-in -shaharp.(如果需要商业支持,请购买Elecard .NET SDK).虽然您还必须阅读DirectShow文档,但有一些参考过滤器可以帮助您入门.如果您只是查看数据包,可能会更改它们并将它们写回来,那么您可以为此编写自己的干净实现或者入侵libavcodec的mpegts实现它不是那么复杂只需几个小时的乐趣来搞清楚发生了什么 - 虽然非常有启发性.libavcodec有一个非常干净的接口,因此您可以轻松地获取更改的数据包 - 您也必须阅读相关文档.

所以,我不确定这是你想要的答案,但没有简单的路径可以满足你的需求.


Ala*_*lan 0

您可能会发现传统的 DirectShow 过滤器开发路线更有用,例如使用组件包。