3

我目前正在开发一个 WinForm 应用程序,以使用 C# 中的 RTSP 协议从 IP 摄像机流式传输视频。一切正常。该应用程序的部分要求包括检查网络摄像机是否在线的功能。

所以我使用 System.Net.NetworkInformation.Ping 类执行了一个 ping 函数来 ping IP 摄像机。假设摄像头的RTSP url如下rtsp:// [CAMERA IP] :554/Master0-RTSP/1.0,我只需要提取[CAMERA IP]部分并使用Ping类查看摄像头是否通过使用其 IP 是否在线。

最初,它一直有效,直到出现问题,例如如果输入可能不是预期 IP 摄像机的 IP(例如计算机的 IP),如果输入的设备的输入 IP 在线,则 ping 功能仍然有效。

我试图搜索类似 RTSP ping 的东西,但找不到。希望对此事有任何建议或意见。非常感谢 C# 中的任何示例。感谢您的关注。

4

4 回答 4

2

OPTIONS可能可行,但标准指定正确的方法是使用GET_PARAMETER.

RFC2326 清楚地概述了

http://www.ietf.org/rfc/rfc2326.txt

10.8 获取参数

GET_PARAMETER 请求检索 URI 中指定的表示或流的参数值。回复和响应的内容留给实现。没有实体主体的 GET_PARAMETER 可用于测试客户端或服务器的活跃度(“ping”)。

虽然GET_PARAMETER服务器可能不支持,但无法判断该服务器将如何响应OPTIONS甚至不需要 sessionID 的请求。因此,不能保证它会使您现有的会话保持活动状态。

从阅读有关OPTIONS请求的相同 RFC 可以清楚地看出这一点

10.1 选项

该行为等同于 [H9.2] 中描述的行为。OPTIONS 请求可以在任何时候发出,例如,如果客户端将要尝试非标准请求。它不影响服务器状态。

例子:

 C->S:  OPTIONS * RTSP/1.0
        CSeq: 1
        Require: implicit-play
        Proxy-Require: gzipped-messages

 S->C:  RTSP/1.0 200 OK
        CSeq: 1
        Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

请注意,这些必须是虚构的功能(希望我们不会故意忽略一个真正有用的功能,以便我们可以在本节中有一个强有力的示例)。

如果 GET_PARAMETER 不受支持,那么您将使用要保持活动状态的会话的 SessionId 发出 PLAY 请求。

即使 OPTIONS 不支持 Session ID 并且如果您已经在玩游戏也不会产生不利影响,这也应该有效。

对于 C# RtspClient,请参阅我的项目 @ https://net7mma.codeplex.com/

以及 CodeProject 上的文章@http ://www.codeproject.com/Articles/507218/Managed-Media-Aggregation-using-Rtsp-and-Rtp

于 2012-12-11T23:41:57.150 回答
0

关于 C# 中的 RTSP,请参阅此线程Using RTMP or RTSP protocol in C#

关于Ping ...您可以执行为DESCRIBE操作...但注意不要太频繁,设备会受到影响。

http://www.ietf.org/rfc/rfc2326.txt

于 2012-07-16T11:21:55.580 回答
0

ICMP您可能希望保持一个RTSP没有视频/音频 RTP 流的帮助程序会话,而不是ping,定期检查套接字连接和发送OPTIONSDESCRIBE命令的良好状态,例如每分钟一次,以查看设备是否响应。

有些人建议使用GET_PARAMETER而不是选项,但是这是一种较差的方法。OPTIONS是强制性的,GET_PARAMETER不是。两者都有不同的用途。两者都有小的服务器端执行费用。OPTIONS显然是两者中的佼佼者。

有些服务器可能不支持设置流参数,因此不支持 GET_PARAMETER 和 SET_PARAMETER。

于 2012-07-16T11:19:24.050 回答
0

您可以使用RTSPClientSharp并执行以下操作:

public static async Task TestRTSPConnection(string rtspAddress, string user, string password)
{
        var serverUri = new Uri(rtspAddress);
        var credentials = new NetworkCredential(user, password);

        var connectionParameters = new ConnectionParameters(serverUri, credentials);
        var cancellationTokenSource = new CancellationTokenSource();

        var connectTask = ConnectAsync(connectionParameters, cancellationTokenSource.Token);

        if (await Task.WhenAny(connectTask, Task.Delay(15000 /*timeout*/)) == connectTask)
        {
            if (!connectTask.Result)
            {
                logger.Warn("Connection refused - check username and password");
            }

            logger.Info("Connection test completed");
        }
        else 
        {
            logger.Warn("Connection timed out - check username and password");
        }
    }

    private static async Task<bool> ConnectAsync(ConnectionParameters connectionParameters, CancellationToken token)
    {
        try
        {
            using (var rtspClient = new RtspClient(connectionParameters))
            {
                rtspClient.FrameReceived +=
                    (sender, frame) => logger.Info($"New frame {frame.Timestamp}: {frame.GetType().Name}");

                while (true)
                {
                    logger.Info("Connecting...");

                    try
                    {
                        await rtspClient.ConnectAsync(token);
                    }
                    catch (OperationCanceledException)
                    {
                        logger.Info("Finishing test before connection could be established. Check credentials");
                        return false;
                    }
                    catch (RtspClientException e)
                    {
                        logger.Error($"{e.Message}: {e.InnerException?.Message}");
                        return false;
                    }

                    logger.Info("Connected - camera is online");
                    return true;
                }
            }
        }
        catch (OperationCanceledException)
        {
            return false;
        }
    }

如果您只关心 ping 以及相机是否在线,它对我来说非常有效。当凭据不正确时也会发生超时。如果端口未公开或连接被拒绝,您将直接失败。

于 2020-07-25T18:11:02.337 回答