RTSPをWEBにブロードキャストします。HLSへの変換。箱入りソリューション

タスクは、ビデオレコーダー(netsurveillance)からすべてのRTSPストリームを収集し、複数の人にビデオストリームへの迅速なアクセスを提供することでした。RTSPプロトコルを独立して表示できるブラウザはないため、このストリームをWEBに適した形式に変換するために何かを見つける必要がありました。



すぐに予約します。このソリューションの運用中に、SAMBAを使用してビデオアーカイブを共有する可能性が発見されました。この機会は私個人にとって非常に便利であるように思われ、私はこの文脈でそれを実行することにしました。もちろん、誰かが質問をするかもしれません:「ラインはありますか、そしてなぜ他のすべてが必要なのですか?」-私たちの場合、このソリューションは高すぎることが判明しました。 そして、彼らはまだドルで数えますだから何が利用可能ですか:



  • 通常のVPNを使用したMikrotikに基づく企業ネットワーク
  • さまざまなカメラとビデオレコーダーで構成されるいくつかのCCTV
  • セントラルオフィスにSAMBA-AD-DCとWEBサーバーが展開されたLinuxマシン


すべてがRTSPからHLSに変換されていることを思い出してください。この手順に従って、LinuxにShinobiホストをインストールし ます。インストールに複雑なことは何もありません。gitといくつかの依存関係をインストールして、インストールスクリプトを実行するだけです。技術的には同じ回線ですが、無料です。おそらく初めてで十分でしょう。インターフェースはより便利に見えるだけで、それ以外は同じです。インストールと起動後、localhost:8080 / superを開き 、パスワードadminを使用してadmin@shinobi.videoとしてログインし、監視にアクセスするためのメインエントリを作成します。



デフォルトのストレージオプションは私には機能しませんでした。さらに、操作中にこれらの設定を長い間検索しましたが、緊急性のためにcron.js(sudo pm2 stop cron)を無効にし、Linuxツールを使用してビデオアーカイブディレクトリをクリーンアップする必要がありました。



画像



ビデオを保存する日数日数をビデオを維持するために- 。

イベントを保持する日数-イベント(ログイン、パスワードの変更など)を保持する日数。

ログを保持する日数-システムメッセージ(障害、エラー、初期化)を保持する日数。



これらのパラメータはすべて、ユーザーごとに個別に設定されるため、非常に便利です。しかし、APIもあります。その手段を使用して、特定のモニターのすべてのストリームを取得し(モニターはブロードキャスト用のストリームのセットです)、Webページでオンラインブロードキャストとしてそれぞれを個別に表示できます。まず、ビデオ監視カメラから監視へのストリームに関する情報を追加する必要があります。



画像



画像



画像



モード-ブロードキャストモード: 録画-録画、 腕時計のみ-表示のみ。

名前-ビデオストリームの名前

保存場所-アーカイブ保存場所モードで記録を設定した 場合)

フルURLパス-rtspストリーム自体へのリンク。 netsurveillanceの場合、これは通常次のリンクです。rtsp :// IP:554 / user = USER&password = PASSWORD&channel = CHANNELNUMBER&stream = 1.sdp?Real_stream — rtp-caching = 100Shinobiに



表示されるリソース消費情報は異なりますhtopによって表示されるものから大幅に 。 Webインターフェイスでは、常に半分のメモリが表示されますが、プロセッサの負荷は、コンソールから表示されるものと完全に一致しています。



画像



知られている限り、システムGPUを使用してストリームを変換することも可能です。しかし、インストールされていなかったため、これを確認する方法はありませんでした。すべてはCPUによって行われます。17のストリームを変換し、そのうち3つはローカルで記録されています。ここで、プロセッサに関する情報を提供します。



lscpu
Architecture: x86_64

CPU op-mode(s): 32-bit, 64-bit

Byte Order: Little Endian

Address sizes: 36 bits physical, 48 bits virtual

CPU(s): 8

On-line CPU(s) list: 0-7

Thread(s) per core: 2

Core(s) per socket: 4

Socket(s): 1

NUMA node(s): 1

Vendor ID: GenuineIntel

CPU family: 6

Model: 30

Model name: Intel(R) Xeon(R) CPU X3440 @ 2.53GHz

Stepping: 5

CPU MHz: 1210.183

CPU max MHz: 2534,0000

CPU min MHz: 1200,0000

BogoMIPS: 5066.32

Virtualization: VT-x

L1d cache: 32K

L1i cache: 32K

L2 cache: 256K

L3 cache: 8192K

NUMA node0 CPU(s): 0-7








Webページでオンラインブロードキャストに接続するだけでよい場合は、最初に、モニターに関心のあるユーザーにAPIキーを追加する必要があります。完全なAPIガイド は、アプリケーションの公式Webサイトにあります。上部で、ユーザーの電子メールにカーソルを置き、クリックしてAPIアイテムを選択します。



画像



私たちの主なパラメータは、 許可されたIP(許可されたIP)です。私のアクセスはローカルネットワークに対してのみ開かれていますが、ストリームをグローバルインターネットにストリーミングする場合は、0.0.0.0 / 0を指定して、Shinobiポートを外部に転送する必要があります。



, Shinobi RTSP , -. . : , 100% -, - RJ-45. , IP : - . AHD . , , ( ) — , .


Webストリームに関する情報は、単純なGETリクエストで取得でき、結果はJSON形式で取得され、データに簡単に変換できます。単純なPHPスクリプトの例:



<?php
 
$url = array(
    'host'          => '192.168.2.104',                      # ,    Shinobi
    'port'          => '8080',                               #  web- Shinobi
    'api'           => 'TyIp1yRhqPLnJmlDpMzAenWYqVW8vt', # API 
    'monitor'       => 'f2xnMN0VAv'                          # ID ,   
);
 
$link = file_get_contents("http://". $url['host'] .":". $url['port'] ."/". $url['api'] ."/monitor/". $url['monitor'] ."/");
 
foreach(json_decode($link) as $data) {
     
    $source['title'][]  = $data->name;
    $source['url'][]    = "http://". $url['host'] .":". $url['port'] . $data->streams[0];
    $source['width'][]  = $data->width;
    $source['height'][] = $data->height;
    $source['status'][] = $data->status;
 
}
 
print "<html>
 
    <head>
        <title> </title>
        <link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css' integrity='sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T' crossorigin='anonymous'>
        <link href='https://vjs.zencdn.net/7.2.3/video-js.css' rel='stylesheet'>
    </head>
    <body>
     
    <div class='container' style='padding: 30pt 0;'>
 
        <div class='row'>
        <div class='col-sm-12' style='margin: 10pt 0 10pt;'>  
 
            <div class='card'>
                <div class='card-body'>
 
                <form action='' method='POST'>
                  <select class='form-control form-control-lg' name='streamId' onchange='this.form.submit()'>
                    ";
 
for($i = 0; $i <= count($source['title']); $i++){
     
    if( $_POST['streamId'] == $i) {
        print "<option value=". $i ." selected>". $source['title'][$i] ."</option>";
    } else {
        print "<option value=". $i .">". $source['title'][$i] ."</option>";
    }
}
 
if( isset($_POST['streamId']) ) {
    $id = $_POST['streamId'];
} else {
    $id = 0;
}
 
print "         </select></form>
        </div>
      </div>
</div>
 
<div class='col-sm-12'>   
 
    <div class='card'>
        <div class='card-body'>
         <video id='hls-example' style='margin: 0 auto;' class='video-js vjs-default-skin' width='". $source['width'][$id] ."' height='". $source['height'][$id] ."' controls>
            <source type='application/x-mpegURL' src='". $source['url'][$id] ."'>
            </video>
         <!-- <p class='card-text'>This is another card with title and supporting text below. This card has some additional content to make it slightly taller overall.</p> -->
          <p class='card-text' style='text-align: center;'> <small class='text-muted'>  : ". $source['status'][$id] ."</small></p>
        </div>
      </div>
    </div>
 
</div>
 
 
    <script src='https://vjs.zencdn.net/ie8/ie8-version/videojs-ie8.min.js'></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.14.1/videojs-contrib-hls.js'></script>
    <script src='https://vjs.zencdn.net/7.2.3/video.js'></script>
 
    <script>
    var player = videojs('hls-example');
    player.play();
    </script>
 
 
 
    </div>
         
    </body>
</html>";
 
?>
      
      





一部のカメラでは、録画モードを指定しています。この場合、ストリームの変換に加えて、RTSPからローカルハードドライブへの記録も行います。RecordingパラメーターでDefaultが指定されている場合、記録は./Shinobi/videos/ [MinitorID] / [[CameraID]フォルダーに保存されます 私の場合、メインモニターの一部のフォルダーはネットワーク経由でアクセスでき、GPOを使用して特定のグループのネットワークドライブとしてマウントされます。



画像



なぜこれが行われるのですか?ロジスティクスの単純な特徴:大型車に商品が積み込まれ、別の都市に向けて出発し、買い手が荷降ろしをします。買い手は何かが足りないと言うことができます。そして、彼らの店ではもはや何かを数えることができないことが起こります。したがって、すでにmp4形式になっている一部のカメラとは別に、ウェアハウス用に記録が作成されます。これにより、報告時間を大幅に節約できます。



All Articles