我必须使用.NET处理MPEG 2传输数据包。最好的方法是什么?目前我正在考虑使用OpenCV来实现这一目标,但不确定是否可行。
答案 0 :(得分: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 ++和编程技巧,我将推荐以下选项之一:
除非你需要对比特流本身进行重新加工或其他类型的严格操作,否则我会推荐第二个选项
你应该注意到,考虑到TS协议的复杂性,使用C / C ++(这是我在开始使用C#之后最终所做的那些操作)更容易操作,并使用.NET进行操作。
我必须为具有特定需求的特定项目编写自己的分路器和muxer。这不是一件容易的事(整个过程花了我大约300个小时才能正确实现)并且最终结果不像Elecard或MainConcept的商用复用器或分路器那样强大 - 但是现成的产品不会做什么我们需要。我用C ++编写它们 - 使用DirectShow(在C ++中)编写源过滤器,使用Elecard(当时比MainConcept工作得更好)进行解码,并编写自己的渲染器来显示实际视频。 整个DirectShow链是使用interop从C#控制的。
一旦选择了您的路径,您应该根据您对数据包执行的操作做出其他决定。如果要将它们发送到解码器或多路复用器,则可以使用DirectShow。您必须根据接收数据的位置将所做的事情放入源过滤器,转换过滤器或目标过滤器。如果要在.NET中实现过滤器,可以使用Maxim Kartavenkov形式http://www.codeproject.com/Articles/421167/Pure-NET-DirectShow-Filters-in-Csharp中的“C#中的Pure .NET DirectShow过滤器”。 (如果需要商业支持,请购买Elecard .NET SDK)。虽然您还必须阅读DirectShow文档,但有一些参考过滤器可以帮助您入门。 如果您只是查看数据包,可能会更改它们并将它们写回来,那么您可以为此编写自己的干净实现或者入侵libavcodec的mpegts实现它不是那么复杂只需几个小时的乐趣来搞清楚发生了什么 - 虽然非常有启发性。 libavcodec有一个非常干净的接口,因此您可以轻松地获取更改的数据包 - 尽管如此,您还必须阅读文档。
所以,我不确定这是你想要的答案,但是你想要的并不容易。
答案 1 :(得分:0)
您可能会发现传统的DirectShow过滤器开发路径更有用,例如使用this组件包。
答案 2 :(得分:0)
SDP文件太棒了。我不知道你是否需要在数据包级别处理这个问题,但我通常会编写一个SDP文件。我测试过的所有媒体播放器--Windows Media,VLC,Quicktime--都支持它们。然后,如果您需要将媒体嵌入到网页,表单或录制内容中,可以通过相应播放器的api轻松实现。
SDP文件将传递播放器自己抓取流所需的容器,编码和网络信息。
我花了很多时间玩直播,直到我意识到Windows Media播放器是一个非常好的实现,它将基于SDP文件创建所有过滤器。这很容易。这是规范:
http://www.ietf.org/rfc/rfc4566.txt
对于这种事情,VLC也有很好的api。
答案 3 :(得分:0)
我不确定我是否完全理解你的问题,如果你正在使用.NET并捕获MPEG数据包然后需要进行一些处理,OpenCV就可以了,但建议使用Aforge.NET这将有助于你避免为OpenCV编写interops。它包含大量视频处理库,应该对您有用。
答案 4 :(得分:0)
http://net7mma.codeplex.com有一个类用于在其他类型的mpeg和非mpeg容器格式中读取它们。
也正确支持所有ts变体,包括atsc。
(De)很快就会支持从一个到另一个的混合。
答案 5 :(得分:0)
此处a .NET example处理HTTP直播流播放列表(.m3u8
文件)。它将播放列表中的.ts
个文件下载到内存中,并使用NAudio library分析和提取音频流。