c# - 通过 .NET 访问 MPEG 传输数据包

标签 c# .net opencv mpeg mpeg-2

我必须使用 .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++ 和编程技能,我会推荐以下选项之一:

  • 没有 C/C++ 技能但是非常高的编程技能或者只需要对数据包做一些基本的工作:
    阅读文档,实现您所需要的
  • 良好的 C/C++ 技能和使用 MinGW 编译 FFMPEG 和阅读其他人代码的耐心:
    使用 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/

    相关文章:

    android - 通过 NDK 将数据从 OpenCV Mat 复制到 Surface 会产生小错误。

    c# - List.Distinct()可以应用于List<List<String>>的列表类型吗?

    c# - 存储临时数据的最有效方法是什么

    c# - 为什么 ListView 拒绝显示其列、项目和子项目(仅显示组)?

    python - 如何找到速率TP,TN,FP,FN并测量分段算法的质量?

    python - 有没有更好的方法将文字与背景分开?

    c# - 上传到数据库然后验证或验证每一行然后上传到数据库

    c# - Hangfire 依赖注入(inject)生命周期范围

    .net - DateTime.ToString() 显示子午线为 "A.M."或 "P.M."

    c# - 如何以编程方式检查系统上是否安装了 SQL Server Management Studio?