我们希望将IP摄像机(h.264 RTSP流)与星号PBX系统集成,以便在学校进行分布式教育(因此远程教师可以“拨入并教授”)。
理想情况下,我们希望能够将SIP客户端创建为autoanswer pbx扩展。
我们正在考虑运行一个* nix框,可以使用网络视频流作为视频源,混合单独的音频源并呈现SIP端点。
我了解SIP express router可能会:
“调用一个外部C脚本,该脚本可以解析并更改其porxy所在客户端的SIP头中的SDP信息,并更改其预期接收媒体的地址。”
但我认为可能更容易找到将h.264 rtsp流呈现为/ dev / videoX并使用标准SIP客户端的方法。
如果有人对研究有任何指示或想法,我会非常感激: - )
感谢阅读!
w ^
P.S。那里有IP摄像机声称拥有SIP客户端,但我所看到的只是提供SIP来建立双向音频会话。
答案 0 :(得分: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消息)连接到指定的摄像机。 / p>
注册按钮调用Register()方法将您的SIP帐户注册到PBX。您可以在状态标签上查看注册状态。
如果有来电,则答案将自动发生,相机视频和音频频道将附加到来电。所以来电者会看到和听到你。
注意强>:
大多数IP摄像头麦克风质量都很差,因此您可以将自己的麦克风连接到呼叫。这也很简单。
创建一个Microphone对象:
麦克风麦克风= Microphone.GetDefaultDevice();
if(麦克风!= null)
microphone.Start();
如果有来电,请将此麦克风连接到来电:
_connector.Connect(麦克风,_audioSender);
就是这样。我希望我能帮到你!
答案 1 :(得分:0)