この質問に対する正しい答えを見つけられたかどうかはわかりませんが、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:
[接続] ボタンをクリックすると、引数 (バックグラウンドで RTSP/RTP/HTTP メッセージ) を使用して指定されたカメラに接続するための IPCameraFactory.GetCamera() が呼び出されます。
[登録] ボタンは、Register() メソッドを呼び出して、SIP アカウントを PBX に登録します。ステータスラベルで登録状況を確認できます。
着信がある場合は、応答が自動的に行われ、カメラのビデオとオーディオ チャネルが通話に接続されます。したがって、発信者はあなたを見たり聞いたりします。
注:
IP カメラのマイクのほとんどは品質が非常に悪いため、独自のマイクを通話に接続できます。それも本当に簡単です。
マイク オブジェクトを作成します。
マイク マイク = Microphone.GetDefaultDevice();
if (マイク != null)
マイク.開始();
着信がある場合は、このマイクを通話に接続します。
_connector.Connect(マイク、_audioSender);
以上です。お役に立てれば幸いです。