我必须使用 .NET 处理 MPEG 2 传输数据包。最好的方法是什么?目前我正在考虑使用 OpenCV 来实现这一点,但还不确定是否可行。
6 回答
注意:我假设您使用的是 Windows,因为您想以 .NET 为目标。
我过去曾这样做过。据我所知,没有完整的 .NET 可用源代码供您使用。
编辑: OpenCV 不会帮助您完成任务。您可以使用 OpenCV 来显示视频(它在内部使用 FFMPEG)但是您将无法访问数据包。破解 OpenCV 提供的 FFMPEG 库也不容易,因为在 Windows 上它将被预编译。
要走的路实际上取决于您的需求。但是,如果您需要在数据包级别工作,则必须学习 MPEG2 TS 规范。维基百科是一个很好的起点,但最终您将不得不阅读规范本身 iso13818-1 和可选的 iso13818-2。你可以在网上找到它的副本——只要用谷歌搜索它。您可以在 C/C++ VLC、FFMPEG、libmpeg gstreamer(在不良插件中)中找到一些参考实现,但我可以向您保证,它们很难阅读,并且没有很好的文档记录。此外,编写完整且强大的 MPEG TS 复用器或解复用器是一项艰巨的任务,需要对文档进行繁琐的检查。有一个名为“MPEG-2 传输流数据包分析器”的 .NET 工具。NET 它看起来像是一个完整的实现,但是代码不是免费提供的——也许作者我愿意把它卖给你。您可以从http://www.pjdaniel.org.uk/mpeg/
根据您的 C/C++ 和编程技能,我将推荐以下选项之一:
- 没有 C/C++ 技能,但有非常高的编程技能或者只需要对数据包做一些基本的工作:
阅读文档,实现你所需要的 - 良好的 C/C++ 技能和使用 MinGW 编译 FFMPEG 并阅读其他人的代码的耐心:使用
FFMPEG (libavcodec) 并查看 MpegTS 实现将您的钩子写入其中并导出可以与 .NET 互操作的普通 C 函数
我会推荐第二种选择,除非您需要对比特流本身进行重新混合或其他类型的严重操作
您应该注意到,鉴于 TS 协议的复杂性,使用 C/C++(这是我从 C# 开始后最后所做的)和使用 .NET 进行操作更容易。
我必须为某个有非常特殊需求的项目编写自己的解复用器和复用器。这不是一件容易的事(整件事我花了大约 300 个小时来正确实施),最终结果不如 Elecard 或 MainConcept 的商业多路复用器或多路解复用器强大 - 但是现成的产品不会做什么我们需要。我用 C++ 编写它们 - 使用 DirectShow(在 C++ 中)编写源过滤器,使用 Elecard 解码(当时它比 MainConcept 工作得更好)并编写我自己的渲染器来显示实际视频。整个 DirectShow 链由 C# 使用互操作控制。
一旦你选择了你的路径,你就应该根据你对数据包的处理做出一些其他的决定。如果您想将它们发送到解码器或多路复用器,那么您可以使用 DirectShow。根据接收数据的位置,您必须将所做的任何事情放入源过滤器、转换过滤器或目标过滤器中。如果你想在 .NET 中实现你的过滤器,你可以使用 Maxim Kartavenkov 的“Pure .NET DirectShow Filters in C#”表单http://www.codeproject.com/Articles/421167/Pure-NET-DirectShow-Filters-in -Csharp. (或者如果您需要商业支持,请购买 Elecard .NET SDK)。尽管您还必须阅读 DirectShow 文档,但有一些参考过滤器可以帮助您入门。如果您只是查看数据包,可能会更改它们并将它们写回去,那么您可以为此编写自己的干净实现或破解 libavcodec 的 mpegts 实现,这并不复杂,只需几个小时的乐趣就可以弄清楚发生了什么 -不过很有启发性。libavcodec 有一个非常干净的界面,因此您可以轻松地取回更改后的数据包 - 不过您也必须阅读文档。
因此,我不确定这是否是您想要的答案,但是对于您想要的东西没有简单的途径。
您可能会发现传统的 DirectShow 过滤器开发路线更有用,例如使用此组件包。
我不确定我是否完全理解您的问题,如果您正在执行 .NET 并捕获 MPEG 数据包然后需要进行一些处理,OpenCV 会很好,但建议使用Aforge.NET这将帮助您避免为 OpenCV 编写互操作. 它包含广泛的视频处理库集合,应该对您有用。
http://net7mma.codeplex.com有一个类用于在其他类型的 mpeg 和非 mpeg 容器格式中读取它们。
还正确支持所有 ts 变体,包括 atsc。
(德)从一个到另一个的 Muxing 也将很快得到支持。
SDP 文件很棒。我不知道您是否需要在数据包级别处理此问题,但我通常会编写一个 SDP 文件。我测试过的所有媒体播放器——Windows Media、VLC、Quicktime——都支持它们。然后,如果您需要将媒体嵌入到网页、表单或录制中,这可以通过相应播放器的 api 轻松实现。
SDP 文件将传递播放器获取流本身所需的容器、编码和网络信息。
我花了很多时间玩直接显示,直到我意识到 Windows Media player 是一个非常好的实现,它会根据 SDP 文件创建所有过滤器。这很容易。这是规格:
http://www.ietf.org/rfc/rfc4566.txt
VLC 也有一个非常好的 api 来处理这种事情。
这是一个处理 HTTP Live Streaming 播放列表(文件)的 .NET 示例。.m3u8
它将.ts
播放列表中的文件下载到内存中,并使用NAudio 库来分析和提取音频流。