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

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

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


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