【问题标题】:Looking for a SIP client that can use an h.264 RTSP stream as a video source寻找可以使用 h.264 RTSP 流作为视频源的 SIP 客户端
【发布时间】:2013-04-10 06:56:28
【问题描述】:

我们正在寻求将 IP 摄像头(h.264 RTSP 流)与星号 PBX 系统集成,以便在学校进行分布式教育(以便远程教师可以“拨入并进行教学”)。

理想情况下,我们希望能够创建一个 SIP 客户端作为自动应答 pbx 扩展。

我们正在考虑运行一个 *nix 盒子,它可以使用网络视频流作为视频源、混合单独的音频源并呈现 SIP 端点。

我了解SIP express router 或许能够:

“调用一个外部 C 脚本,它可以解析和更改它所使用的客户端的 SIP 标头中的 SDP 信息,并更改它期望从中接收媒体的地址。”

但我认为寻找一种将 h.264 rtsp 流呈现为 /dev/videoX 并使用标准 SIP 客户端的方法可能更容易。

如果有人对研究有任何建议或想法,我将不胜感激:-)

感谢阅读!

W

附言有些 IP 摄像机声称拥有 SIP 客户端,但我所看到的只是提供 SIP 来建立双向音频会话。

【问题讨论】:

  • 你可以通过live555检查一些开源实现,如live555.com/openRTSPlive555.com/playSIP。这能满足您的要求吗?
  • 感谢 Ganesh,openRTSP 看起来可以满足我们的需求!我会演一出让你知道。

标签: sip voip h.264 video-conferencing


【解决方案1】:

我不知道你是否找到了这个问题的正确答案,但也许我可以给你一些关于 VoIP 和 IP 摄像头管理的建议,它会帮助遇到同样问题的任何人。

您的目标(如果我正确理解您的问题)基本上是创建一个电话会议解决方案,该解决方案可以接听所有来电并将 IP 摄像头视频附加到所有这些电话。我目前在一家名为 Ozeki 的公司工作 - 我不知道是否有针对您的问题的开源解决方案 - 我将向您展示一个包含 SIP 帐户注册、IP 摄像头连接的示例代码并回答所有问题带有摄像头视频的来电。

所以这里是源代码:

public partial class Form1 : Form
{
    private IIPCamera _camera;
    private DrawingImageProvider _imageProvider;
    private MediaConnector _connector;
    private VideoViewerWF _videoViewerWf;
    private ISoftPhone _softphone;
    private IPhoneLine _phoneLine;
    private IPhoneCall _call;
    private PhoneCallAudioSender _audioSender;
    private PhoneCallVideoSender _videoSender;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
        _softphone.IncomingCall += softphone_IncomingCall;
        _connector = new MediaConnector();
        _videoSender = new PhoneCallVideoSender();
        _audioSender = new PhoneCallAudioSender();
        _imageProvider = new DrawingImageProvider();
        _videoViewerWf = new VideoViewerWF();
        SetVideoViewer();
    }

    private void SetVideoViewer()
    {
        CameraBox.Controls.Add(_videoViewerWf);
        _videoViewerWf.Size = new Size(260, 180);
        _videoViewerWf.BackColor = Color.Black;
        _videoViewerWf.TabStop = false;
        _videoViewerWf.FlipMode = FlipMode.None;
        _videoViewerWf.Location = new Point(35, 30);
        _videoViewerWf.Name = "_videoViewerWf";
    }

    private void Register(bool registrationRequired, string displayName, string userName, string authenticationId, string registerPassword, string domainHost)
    {
        try
        {
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost);
            _phoneLine = _softphone.CreatePhoneLine(account);
            _phoneLine.RegistrationStateChanged += phoneLine_RegistrationStateChanged;
            _softphone.RegisterPhoneLine(_phoneLine);
        }
        catch (Exception ex)
        {
            label_Phoneline.Text = ex.Message;
        }
    }

    private void phoneLine_RegistrationStateChanged(object sender, RegistrationStateChangedArgs e)
    {
        InvokeGuiThread(() => label_Phoneline.Text = e.State.ToString());
    }

    private void softphone_IncomingCall(object sender, VoIPEventArgs<iphonecall> e)
    {
        if (_camera != null)
        {
            _call = e.Item;
            _call.CallStateChanged += call_CallStateChanged;
            ConnectToCall();
            _call.Answer();
        }
    }

    private void ConnectToCall()
    {
        _videoSender.AttachToCall(_call);
        _audioSender.AttachToCall(_call);
        _connector.Connect(_camera.VideoChannel, _videoSender);
        _connector.Connect(_camera.AudioChannel, _audioSender);
    }

    private void call_CallStateChanged(object sender, CallStateChangedArgs e)
    {
        InvokeGuiThread(() => label_Call.Text = e.State.ToString());

        if (e.State == CallState.Completed)
            if (_call != null)
            {
                _call.CallStateChanged -= call_CallStateChanged;
                _connector.Disconnect(_camera.VideoChannel, _videoSender);
                _connector.Disconnect(_camera.AudioChannel, _audioSender);
            }
    }

    private void button_Connect_Click(object sender, EventArgs e)
    {
        _camera = IPCameraFactory.GetCamera("cameraIPAddress:8080", "admin", "admin");
        _connector.Connect(_camera.VideoChannel, _imageProvider);
        _videoViewerWf.SetImageProvider(_imageProvider);
        _videoViewerWf.Start();
        _camera.Start();
    }

    private void button_SIPRegister_Click(object sender, EventArgs e)
    {
        Register(true, "100", "100", "100", "100", "PBXAddress");
    }

    private void InvokeGuiThread(Action action)
    {
        BeginInvoke(action);
    }
}

还有(示例)GUI:

如果您单击连接按钮,则将调用 IPCameraFactory.GetCamera(),用于使用参数(后台的 RTSP/RTP/HTTP 消息)连接到指定的摄像机。

注册按钮调用 Register() 方法将您的 SIP 帐户注册到 PBX。您可以在 Status 标签处查看注册状态。

如果有来电,则会自动接听电话,并且摄像头视频和音频通道将附加到通话中。所以来电者会看到和听到你。

注意

大多数 IP 摄像头麦克风的质量都很差,因此您可以将自己的麦克风连接到通话中。这也很简单。

  1. 创建一个麦克风对象:

    麦克风麦克风 = Microphone.GetDefaultDevice();

    如果(麦克风!= null)
    麦克风.开始();

  2. 如果有来电,则将此麦克风连接到通话:

    _connector.Connect(麦克风,_audioSender);

就是这样。希望能帮到你!

【讨论】:

    【解决方案2】:

    live555 有一些开源实现,例如 openRTSPplaySIP,可以帮助您满足要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-28
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-03-24
      • 2014-01-24
      相关资源
      最近更新 更多