post-cover

2023-12-22 技術ブログ

Raspberry Piを使ってHikvisionのカメラやレコーダーからスクリーンショットを取得する

    はじめに

    Hikvisionのレコーダーや監視カメラの映像をスクリーンショットとして取得し、NAS(ファイルサーバー)に保存したいという問い合わせがありました。

    今回の記事ではスクリーンショットの取得方法とNASへの保存方法について説明します。

    必要な手順

    必要な手順は以下の通りです。

    • ISAPIを調べる
    • ISAPIを実行し、スクリーンショットが表示されるか確認する
    • PCにPythonをインストール
    • Pythonのプログラムを作成し、実行する
    • 作成したプログラムをRaspberry Piに転送する
    • cronを設定し、プログラムを定期実行する

    ISAPIを調べる

    ISAPI (Intelligent Security Application Programming Interface) とは、監視カメラやレコーダーとPCやサーバー間で通信するためのプロトコルです。HTTPベースのREST APIで構成されています。

    こちらの資料 からISAPIを確認できます。

    監視カメラやレコーダーから撮影中の映像をスクリーンショットとして取得するには以下のISAPIを使用します。

    /ISAPI/Streaming/channels/<ID>/picture

    より高い解像度でスクリーンショットを取得する場合は以下のISAPIを使用してください。

    /ISAPI/Streaming/channels/<ID>/picture?videoResolutionWidth=1920&videoResolutionHeight=1080

    ISAPIを実行する

    ISAPIはREST APIであるため、HTTPで定義するGET、POST、PUT、DELETEなどのリクエストでデータを操作します。

    スクリーンショットの取得はGETメソッドを使用するため、ChromeやSafariのブラウザにURLを入力するだけで実行できます。

    今回はIPアドレスが「192.168.40.115」のレコーダーに対し、スクリーンショットを取得します。

    使用するチャンネルは3、映像はメインストリームを使用します。

    ISAPIの<ID>について

    /ISAPI/Streaming/channels/<ID>/picture

    <ID>には数字を入力します。

    監視カメラの<ID>はメインストリームが1、サブストリームが2になります。

    レコーダーの<ID>は3桁または4桁の数字になります。チャンネル3のメインストリームのスクリーンショットを取得したい場合は301になります。

    http://user:password@192.168.40.115/ISAPI/Streaming/channels/301/picture

    上記のURLをブラウザに入力するとレコーダーで録画している映像のスクリーンショットを取得できました。

    hikvision-isapi-get-screenshot-001

    PCにPythonをインストール

    PCにPythonをインストールします。

    Pythonは 公式HP からダウンロードできます。

    Microsoft Storeからインストール

    また、WindowsユーザーはMicrosoft Storeからインストールできます。

    検索欄にMicrosoft Storeと入力し、Microsoft Storeを立ち上げます。

    hikvision-isapi-get-screenshot-002

    Pythonを入力するとPythonの各バージョンが候補に表示されます。

    hikvision-isapi-get-screenshot-003

    最新バージョンのPythonを選択し、入手をクリックするとPythonがインストールされます。

    hikvision-isapi-get-screenshot-004

    Pythonのプログラムを作成し、実行する

    スクリーンショットを取得し、保存するプログラム

    まずはレコーダーからスクリーンショットを取得し、ローカルに保存するプログラムを作成します。

    プログラムを作成する前にrequestsのライブラリをインストールします。

    pip install requests

    プログラムは以下の通りです。

    # getimage01.py
    import requests
    from requests.auth import HTTPDigestAuth
    from datetime import datetime
    import hashlib
    
    # レコーダーのIPアドレス、ユーザー名、パスワード、チャンネル番号を設定
    ip_address = "ip_address"
    username = "username"
    password = "password"
    channel_number = "channel_number"
    
    # 現在の日時を取得
    current_time = datetime.now()
    formatted_time = current_time.strftime("%Y%m%d%H%M%S")
    
    # ハッシュ値を生成(ここでは単純な例として現在時刻のMD5ハッシュを使用)
    hash_value = hashlib.md5(formatted_time.encode()).hexdigest()
    
    # ハッシュ値の最初の5文字を取得
    hash_value_short = hash_value[:5]
    
    # ファイル名を生成(ファイル名は年月日+5桁のハッシュ値)
    filename = f"{formatted_time}_{hash_value_short}.jpg"
    
    # スクリーンショット取得用のURL
    url = f"http://{ip_address}/ISAPI/Streaming/channels/{channel_number}/picture"
    
    # リクエストの送信(Digest認証を使用)
    response = requests.get(url, auth=HTTPDigestAuth(username, password))
    
    # スクリーンショットの保存
    if response.status_code == 200:
        with open(filename, 'wb') as file:
            file.write(response.content)
    else:
        print(f"Error: {response.status_code}")

    プログラムが正常に動作したらNAS(ファイルサーバー)に接続し、NASにスクリーンショットを保存するコードを追加します。

    NASにスクリーンショットを保存するプログラム

    NASとの接続にはSMBを使います。

    NAS側でSMBを有効化します。

    hikvision-isapi-get-screenshot-005

    有効化したらSMBのライブラリをインストールします。

    pip install pysmb

    プログラムは以下の通りです。

    # getimage02.py
    import requests
    from requests.auth import HTTPDigestAuth
    from datetime import datetime
    import hashlib
    from smb.SMBConnection import SMBConnection
    
    # レコーダーのIPアドレス、ユーザー名、パスワード、チャンネル番号を設定
    ip_address = "ip_address"
    username = "username"
    password = "password"
    channel_number = "channel_number"
    
    # NASのIPアドレス、ユーザー名、パスワード、共有フォルダ名、ファイル保存先のパスを設定
    nas_ip = "nas_ip"
    nas_username = "nas_username"
    nas_password = "nas_password"
    nas_share = "nas_share"
    nas_path = "nas_path"
    
    # 現在の日時を取得
    current_time = datetime.now()
    formatted_time = current_time.strftime("%Y%m%d%H%M%S")
    
    # ハッシュ値を生成
    hash_value = hashlib.md5(formatted_time.encode()).hexdigest()
    
    # ハッシュ値の最初の5文字を取得
    hash_value_short = hash_value[:5]
    
    # ファイル名を生成(ファイル名は年月日+5桁のハッシュ値)
    filename = f"{formatted_time}_{hash_value_short}.jpg"
    
    # スクリーンショット取得用のURL
    url = f"http://{ip_address}/ISAPI/Streaming/channels/{channel_number}/picture"
    
    # レコーダーからスクリーンショットを取得
    response = requests.get(url, auth=HTTPDigestAuth(username, password))
    if response.status_code != 200:
        print(f"Error: {response.status_code}")
        exit()
    
    # NASへの接続を確立
    conn = SMBConnection(nas_username, nas_password, "myclient", "mynas", use_ntlm_v2=True)
    assert conn.connect(nas_ip, 139)
    
    # NASにファイルを保存
    file_path = f"\\{nas_path}\\{filename}"  # NAS上の完全なファイルパス
    with open(filename, 'wb') as file:
        file.write(response.content)
    conn.storeFile(nas_share, file_path, open(filename, 'rb'))
    
    # 接続を閉じる
    conn.close()
    

    プログラムを実行し、NASに画像が保存されたか確認します。

    Raspberry Piにプログラムを転送

    作成したプログラムをシングルボードコンピュータ(single-board computer, SBC)のRaspberry Pi(ラズベリーパイ)に転送します。

    PCでもプログラムを定期実行できますが安価かつ低消費電力のSBCでの定期実行を推奨します。

    Teratermを開き、Raspberry PiのIPアドレスを入力します。

    hikvision-isapi-get-screenshot-006

    Raspberry PiのIDとパスワードを入力します。

    hikvision-isapi-get-screenshot-007

    リモートログインできたらTeratermの画面にドラッグアンドドロップでプログラムを移動させます。

    hikvision-isapi-get-screenshot-008

    hikvision-isapi-get-screenshot-008a

    転送先を

    ./Documents

    にします。

    今回はRaspberry PiのDocumentsフォルダにファイルを転送しました。

    Documentsフォルダに移動します。

    cd Documents

    フォルダ内にプログラムが格納されているか確認します。

    ls -l

    プログラムを実行します。

    python3 getimage.py

    NASのフォルダにスクリーンショットが保存されているか確認します。

    Raspberry Piでプログラムを定期実行

    プログラムの動作確認が完了したらcrontabを編集し、プログラムを定期実行します。

    Documentsフォルダのパスを確認します。

    pwd

    パスを確認したら以下のコマンドによってcrontabを編集します。

    crontab -e

    今回は3分に1度、スクリーンショットを定期実行します。以下のように記述します。

    */3 * * * * python3 /home/pi/Documents/getimage.py

    3分間隔でNASのフォルダにスクリーンショットが保存されているか確認します。

    3分間隔でスクリーンショットが保存されていることを確認しました。

    hikvision-isapi-get-screenshot-009

    技術的な問題はぜひ当社問い合わせ窓口へ

    当社では、お客様の個別の要望に応じた監視カメラシステムを提供するために、様々な機器の動作検証を行っています。


    監視カメラシステムついてお困りの場合は、ぜひ当社の問い合わせフォームにご連絡ください。