如何使用net7mma将RTSP流记录到磁盘?

时间:2016-05-17 20:05:56

标签: c# rtsp

net7mma library混淆了一点点。

我想为Axis IP摄像机建立一个恒定的RTSP流,然后在某一点将RTSP流记录到磁盘。第一个应该是可能的,不确定后者是否可以在这个库中完成,或者只是拼凑帧图像。

目前正在尝试以下代码来接收流:

        RtspClient client = new RtspClient("rtsp://axiscamera/axis-media/media.amp", RtspClient.ClientProtocolType.Http);
        client.Credential = new System.Net.NetworkCredential("root", "password");
        client.AuthenticationScheme = System.Net.AuthenticationSchemes.Basic;
        client.StartPlaying();
        client.Client.RtpPacketReceieved += OnPacketReceived;

......但是这种情况非常严重:

  

抛出异常:Media.Rtsp.dll中的'Media.Common.TaggedException`1'   程序'[17464] RtspTestViewer.vshost.exe'已退出代码   -1073741819(0xc0000005)'访问违规'。

不确定我是否应该使用RtspSourceRtspClient或两者兼而有之。这应该怎么做?

1 个答案:

答案 0 :(得分:0)

首先,感谢您对该项目的关注。

访问冲突可能是因为有些东西已经拥有端口554的独占所有权,有时wmpnetwork.exe使用端口554来支持DLNA协议但是如果没有更多信息很难说,你可以使用netstat确定已经使用该端口的内容。

肯定可以保存单个流,但是库还没有将流组合(合并)到容器中[即使它几乎可以读取所有容器]。

通过SETUP检索的SessionDescription将告诉您可用的媒体曲目以及他们使用的编解码器。

然后,您必须将收到的数据(RtpPackets / RtpFrame)解包,以便对其执行任何有意义的操作,例如:将其存储到磁盘或播放。

RtpPackets组成RtpFrame;在大多数情况下,它们由许多数据包组成,其中最后一个数据包设置了Marker位。通常,与RtpFrame对应的所有数据包也共享相同的Timestamp字段。

我的项目中的基本RtpFrame实现仅用于事件,应该在RtspServer类中为您的编解码器提供派生实现。

因此我会使用OnFrameChanged事件,每当RtpPacket添加到一个帧时它就会触发。参数' final'在RtpFrameChanged事件上指示这是否是事件将以给定帧实例作为参数触发的最后一次。

您通常可以在OnRtpFrameChanged事件中使用以下代码来执行处理。

if(final) { /* process the frame further*/ }

派生的RtpFrame实施对于解包(从RtpPackets转换为解码器或其他方式)或打包(从数据转到RtpPackets)非常有用。

如果您查看UnitTests解决方案,您将看到我如何使用JPEG,H.264和AAC(也许还有其他几个)的派生实现

如果您找不到支持的编解码器,请在项目Discussion Area上提出问题,我们可以从那里开始。