我必须使用 .NET 处理 MPEG 2 传输数据包。最好的方法是什么?目前我正在考虑使用 OpenCV 来实现这一点,但不确定是否可能。
最佳答案
注意:我假设您使用的是 Windows,因为您想以 .NET 为目标。
我过去曾这样做过。
据我所知,没有完整的 .NET 可用源代码供您使用。
编辑: OpenCV 不会帮助你完成你的任务。您可以使用 OpenCV 来显示视频(它在内部使用 FFMPEG)但是您将无法访问数据包。此外,破解 OpenCV 提供的 FFMPEG 库并不容易,因为在 Windows 上它将被预编译。
要走的路实际上取决于您的需求。
但是,如果您需要在数据包级别工作,则必须学习 MPEG2 TS 规范。维基百科是一个很好的起点,但最终您必须阅读规范本身 iso13818-1 和可选的 iso13818-2。你可以在网上找到它的副本——只要谷歌一下。
您可以在 C/C++ VLC、FFMPEG、libmpeg gstreamer(在坏插件中)中找到一些引用实现,但是我可以向您保证它们很难阅读并且没有很好的文档记录。
此外,编写完整而强大的 MPEG TS 多路复用器或多路分离器是一项艰巨的任务,需要对文档进行繁琐的检查。
有一个用 .NET 编写的名为“MPEG-2 传输流数据包分析器”的 .NET 工具,它看起来像是一个完整的实现,但是代码不是免费提供的 - 也许作者愿意把它卖给你。您可以从 http://www.pjdaniel.org.uk/mpeg/ 访问它
根据您的 C/C++ 和编程技能,我会推荐以下选项之一:
阅读文档,实现您所需要的
使用 FFMPEG (libavcodec) 并查看 MpegTS 实现,将钩子(Hook)写入其中并导出可以与 .NET 互操作的普通 C 函数
我会推荐第二个选项,除非您需要对比特流本身进行重新混合或其他类型的严重操作
您应该注意到,鉴于 TS 协议(protocol)的复杂性,使用 C/C++ 更容易操作(这是我从 C# 开始后最终所做的)并使用 .NET 对其进行操作。
我必须为某个具有非常特殊需求的项目编写自己的 demuxer 和 muxer。这不是一件容易的事(整个过程我花了大约 300 个小时才能正确实现),最终结果不如 Elecard 或 MainConcept 的商业多路复用器或多路分路器强大 - 然而,现成的产品不会做什么我们需要。我用 C++ 编写它们 - 使用 DirectShow(在 C++ 中)编写源过滤器,使用 Elecard(当时比 MainConcept 工作得更好)解码并编写我自己的渲染器来显示实际视频。
整个 DirectShow 链是使用互操作从 C# 控制的。
一旦你选择了你的路径,你应该根据你对数据包的处理做出一些其他的决定。如果您想将它们发送到解码器或多路复用器,那么您可以使用 DirectShow。根据接收数据的位置,您必须将所做的一切放入源过滤器、转换过滤器或目标过滤器中。如果你想在 .NET 中实现你的过滤器,你可以使用“C# 中的纯 .NET DirectShow 过滤器”,作者是 Maxim Kartavenkov 表单 http://www.codeproject.com/Articles/421167/Pure-NET-DirectShow-Filters-in-Csharp . (或者,如果您需要商业支持,请购买 Elecard .NET SDK)。尽管您还必须阅读 DirectShow 文档,但有一些引用过滤器可以帮助您入门。
如果您只查看数据包,也许会更改它们并将它们写回,那么您可以为此编写自己的干净实现或入侵 libavcodec 的 mpegts 实现,这并不复杂,只需几个小时的乐趣就可以弄清楚发生了什么 -不过很有启发性。 libavcodec 有一个非常干净的界面,因此您可以轻松地取回更改后的数据包 - 不过您也必须阅读相关文档。
所以,我不确定这是否是您想要的答案,但是您想要的东西没有简单的方法。
关于c# - 通过 .NET 访问 MPEG 传输数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5823998/