1

IP カメラ (h.264 RTSP ストリーム) をアスタリスク PBX システムと統合して、分散教育用の学校で使用することを検討しています (リモートの教師が「ダイヤルインして教える」ことができるように)。

理想的には、自動応答 pbx 拡張機能として SIP クライアントを作成できるようにしたいと考えています。

ネットワーク ビデオ ストリームをビデオのソースとして使用し、別のオーディオ ソースをミックスし、SIP エンドポイントを提示できる *nix ボックスを実行することを検討しています。

SIP エクスプレス ルーターで次のことができる可能性があることを理解しています。

「外部の C スクリプトを呼び出します。このスクリプトは、プロキシしているクライアントの SIP ヘッダー内の SDP 情報を解析して変更し、メディアの受信元のアドレスを変更します。」

しかし、h.264 rtsp ストリームを /dev/videoX として表示し、標準の SIP クライアントを使用する方法を探す方が簡単かもしれないと考えています。

誰かが研究のための指針やアイデアを持っているなら、私は本当に感謝しています:-)

読んでくれてありがとう!

W

ps SIP クライアントを持っていると主張する IP カメラがありますが、私が見たのは、双方向オーディオ セッションを確立するための SIP しか提供していません。

4

2 に答える 2

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:

ここに画像の説明を入力

[接続] ボタンをクリックすると、引数 (バックグラウンドで RTSP/RTP/HTTP メッセージ) を使用して指定されたカメラに接続するための IPCameraFactory.GetCamera() が呼び出されます。

[登録] ボタンは、Register() メソッドを呼び出して、SIP アカウントを PBX に登録します。ステータスラベルで登録状況を確認できます。

着信がある場合は、応答が自動的に行われ、カメラのビデオとオーディオ チャネルが通話に接続されます。したがって、発信者はあなたを見たり聞いたりします。

:

IP カメラのマイクのほとんどは品質が非常に悪いため、独自のマイクを通話に接続できます。それも本当に簡単です。

  1. マイク オブジェクトを作成します。

    マイク マイク = Microphone.GetDefaultDevice();

    if (マイク != null)
    マイク.開始();

  2. 着信がある場合は、このマイクを通話に接続します。

    _connector.Connect(マイク、_audioSender);

以上です。お役に立てれば幸いです。

于 2014-10-09T12:16:11.697 に答える
0

live555のようなオープンソースの実装がいくつかopenRTSPありplaySIP、要件に役立つ可能性があります。

于 2013-04-23T15:06:35.593 に答える