与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)'访问违规'。
不确定我是否应该使用RtspSource
或RtspClient
或两者兼而有之。这应该怎么做?
答案 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上提出问题,我们可以从那里开始。