post-cover
  • 業種:情報通信業
  • 従業員数:10~50名程度
  • 導入製品:エンコーダー(LAN-HD264E)、デコーダー(LAN-UHD265D-1)
課題・要望 ・VPN回線を利用して本社のモニタ映像を支社へ伝送したい。
・ネットワーク機器が多数接続されており、帯域が限られているため、効率的に映像を届けたい。
解決策 ・エンコーダーのAPI機能「キャプチャ取得機能」を活用し、帯域を節約しながら映像伝送を実現。
結果 ・帯域を有効活用することで、高品質な映像伝送を支社で可能に。

顧客の悩み

VPN回線を使って本社のモニタ映像を支社へ伝送したいというご要望がありました。

「動きのある画面ではないので、1秒に1枚程度の画像が伝送できれば十分」との事でした。


アイゼックの提案

当社は以下の構成をご提案し、検証機にて映像伝送の検証を実施しました。

  • 本社のモニタ映像をエンコーダー(LAN-HD265E)でエンコード
  • VPN回線を通じて伝送
  • 支社側でデコーダーを用い、HDMI信号に変換してモニタに表示

この方法での基本的な伝送は可能でしたが以下の問題に直面しました。

transfer-guide-003-api-001


問題

  • VPN回線の帯域が圧迫されている: ネットワーク機器が多数接続されており、帯域が限られている。
  • 遅延が発生: フレームレートを1fpsに設定しても、1日経過すると10分から1時間程度の遅延が発生する。
  • 画質のトレードオフ: 解像度を下げれば遅延は改善するが、運用上許容できない画質になる。

アイゼックが提案した解決策

エンコーダー「LAN-HD265E」に搭載された HTTPリクエストによる画像取得機能 を活用することで、遅延問題を解決するシステムを開発及び構築を実施しました。


HTTPリクエストの活用

エンコーダーが提供する HTTPリクエストによる画像取得機能 を活用し、エンコーダーからキャプチャ画像を取得できます。

これを利用して、支社側のPCから1秒に1回 HTTPリクエストを送信し、取得したキャプチャ画像をモニタへ表示するシステムを開発しました。

transfer-guide-003-api-002


効果

このシステムでは、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

パッケージのインストール

プログラムを実行するには dotenvnode-fetchdigest-fetch のパッケージをインストールします。 プロジェクトのルートディレクトリで以下のコマンドを実行してください。

npm install dotenv node-fetch digest-fetch

実行方法

.env ファイルの設定とパッケージインストール後、通常通り Node.js スクリプトを実行します。

node your_script.js

以上により、1秒ごとにキャプチャ画像を取得できます。

アイゼックのエンコーダーとデコーダーについて詳しく知りたい方へ

当社取り扱いのエンコーダー・デコーダー製品について、詳細な仕様や活用事例、ご購入方法などは以下のサービスページにてご覧いただけます。

また、導入を検討されているお客様向けに、無料で検証用機材をお貸出しするサービスも実施しております。

販促ページ

SNSでシェアしよう

この記事が役に立ったら、ぜひシェアしてください