- 業種:情報通信業
- 従業員数:10~50名程度
- 導入製品:エンコーダー(LAN-HD264E)、デコーダー(LAN-UHD265D-1)
課題・要望 | ・VPN回線を利用して本社のモニタ映像を支社へ伝送したい。 |
・ネットワーク機器が多数接続されており、帯域が限られているため、効率的に映像を届けたい。 | |
解決策 | ・エンコーダーのAPI機能「キャプチャ取得機能」を活用し、帯域を節約しながら映像伝送を実現。 |
結果 | ・帯域を有効活用することで、高品質な映像伝送を支社で可能に。 |
顧客の悩み
VPN回線を使って本社のモニタ映像を支社へ伝送したいというご要望がありました。
「動きのある画面ではないので、1秒に1枚程度の画像が伝送できれば十分」との事でした。
アイゼックの提案
当社は以下の構成をご提案し、検証機にて映像伝送の検証を実施しました。
- 本社のモニタ映像をエンコーダー(LAN-HD265E)でエンコード
- VPN回線を通じて伝送
- 支社側でデコーダーを用い、HDMI信号に変換してモニタに表示
この方法での基本的な伝送は可能でしたが以下の問題に直面しました。
問題
- VPN回線の帯域が圧迫されている: ネットワーク機器が多数接続されており、帯域が限られている。
- 遅延が発生: フレームレートを1fpsに設定しても、1日経過すると10分から1時間程度の遅延が発生する。
- 画質のトレードオフ: 解像度を下げれば遅延は改善するが、運用上許容できない画質になる。
アイゼックが提案した解決策
エンコーダー「LAN-HD265E」に搭載された HTTPリクエストによる画像取得機能 を活用することで、遅延問題を解決するシステムを開発及び構築を実施しました。
HTTPリクエストの活用
エンコーダーが提供する HTTPリクエストによる画像取得機能 を活用し、エンコーダーからキャプチャ画像を取得できます。
これを利用して、支社側のPCから1秒に1回 HTTPリクエストを送信し、取得したキャプチャ画像をモニタへ表示するシステムを開発しました。
効果
このシステムでは、TCPやUDPの常時伝送方式とは異なり、 長時間の運用でも遅延が発生しない点 が大きなメリットです。
帯域の影響を最小限に抑えることが可能となり、顧客が求める画質を維持しながら安定した映像伝送を実現しました。
サンプルコード
実際に使用したプログラムは以下の通りです。
// 必要なモジュールをインポート
import fetch from "node-fetch"; // HTTPリクエストを行うためのfetch関数
import fs from "fs/promises"; // ファイルシステム操作をPromiseベースで行う
import path from "path"; // ファイルパスを扱うモジュール
import { fileURLToPath } from "url"; // URLからファイルパスを取得する
import DigestFetch from "digest-fetch"; // ダイジェスト認証付きのHTTPクライアント
// dotenv をインポートして環境変数をロード
import dotenv from "dotenv";
dotenv.config();
// 現在のファイルのディレクトリパスを取得
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 環境変数から認証情報を取得(環境変数が未設定の場合はデフォルト値を使用)
const username = process.env.CAMERA_USER || "admin";
const password = process.env.CAMERA_PASS || "パスワード未設定";
// エンコーダーのIPアドレスを環境変数から取得、またはデフォルト値を使用
const ENCODER_IP = process.env.ENCODER_IP || "192.168.0.100";
// 画像取得用のパスを定数として定義
const CAPTURE_PATH = "/capture/ch1.jpg";
// ダイジェスト認証付きHTTPクライアントを初期化
const client = new DigestFetch(username, password);
/**
* 画像を取得して保存する非同期関数
* 1. エンコーダーの指定されたURLから画像データをダウンロード
* 2. 一時ファイルに保存後、最終ファイルにリネーム
*/
async function fetchImage() {
// エンコーダーのIPアドレスとキャプチャパスを結合してURLを生成
const url = `http://${ENCODER_IP}${CAPTURE_PATH}`;
// 保存先の絶対パスを設定
const tempPath = path.join(__dirname, "public", "temp_image.jpg");
const finalPath = path.join(__dirname, "public", "image.jpg");
try {
// URLに対してHTTPリクエストを送信し、レスポンスを取得
const response = await client.fetch(url);
if (!response.ok) {
// HTTPエラーが発生した場合は例外を投げる
throw new Error(`HTTP error! status: ${response.status}`);
}
// レスポンスからArrayBufferとしてデータを取得
const arrayBuffer = await response.arrayBuffer();
// ArrayBufferをNode.jsのBufferに変換
const buffer = Buffer.from(arrayBuffer);
// 一時ファイルにデータを書き込み
await fs.writeFile(tempPath, buffer);
// 一時ファイルを最終的なファイル名にリネーム(上書き保存)
await fs.rename(tempPath, finalPath);
console.log("Image saved successfully!");
} catch (error) {
// エラーが発生した場合、エラーメッセージをコンソールに出力
console.error("Failed to fetch image:", error);
}
}
// 1秒ごとにfetchImage関数を実行して画像を定期取得
setInterval(fetchImage, 1000);
セキュリティ上の注意点
.env
ファイルには機密情報が含まれるため、バージョン管理システム(例:Git)には含めないようにします。プロジェクトのルートにある .gitignore
ファイルに .env
を追加して、リポジトリにアップロードされないようにしましょう。
# .gitignore の例
.env
パッケージのインストール
プログラムを実行するには
dotenv
、 node-fetch
、 digest-fetch
のパッケージをインストールします。プロジェクトのルートディレクトリで以下のコマンドを実行してください。
npm install dotenv node-fetch digest-fetch
実行方法
.env
ファイルの設定とパッケージインストール後、通常通り Node.js スクリプトを実行します。
node your_script.js
以上により、1秒ごとにキャプチャ画像を取得できます。
アイゼックのエンコーダーとデコーダーについて詳しく知りたい方へ
当社で扱っているエンコーダー、デコーダー製品の詳細な仕様や利用例、またご購入方法については、以下のサービスページにてご確認いただけます。
製品サービスページはこちら
購入をご検討なら下記よりお問い合わせください。
検証用貸出機の無料貸出サービスも行っております。
防犯カメラや防犯システムの設置をお考えでしたら是非当社へお問い合わせ下さい。