ImouカメラからLAN経由で動画をエクスポート:アプリもメモリーカードの取り外しも不要
写真:Lorex

ImouカメラからLAN経由で動画をエクスポート:アプリもメモリーカードの取り外しも不要

コマンドラインツールを使用して、ImouカメラのメモリカードからLAN経由で録画データを直接ダウンロードする――実時間よりも約10倍高速で、1ヶ月分の動画を1つのコマンドでまとめて取得できる。

Imouのカメラは、本体に挿入されたmicroSDカードに継続的に録画します。これは非常に便利ですが、数週間分の動画を取り出そうとした時には問題が生じます。アプリでは一度に1つのクリップしか保存できず、保存のたびに1回ずつ操作が必要で、さらにダウンロードはメーカーのサーバーを経由するため、速度が低下してしまいます。 また、メモリーカードを取り出そうとすると、カメラはたいてい手の届きにくい場所に設置されているものです。

この記事では、Imou LAN Exporter の使用方法について解説します。これは、ローカルネットワーク内のカメラに直接アクセスし、録画データをまとめてダウンロードして通常のファイルに結合するコマンドラインツールです .mp4 。アプリを開く必要も、SDカードを取り出す必要も、インターネットを経由する必要もありません。

⚠️
このツールを使用するには、 カメラの正しいパスワードが必要です。これは、ご自身のデバイス上で ご自身のデータを復元するためのツールであり、不正侵入のためのツールではありません。他人の カメラに対してこのツールを使用しないでください。

なぜLAN経由だと違うのか

Imouのカメラ(およびDahua。ImouはDahuaの民生用ブランドであるため)は、ポート8086でRTSPに似た独自のプロトコルをデフォルトで開放しています。スマートフォンとカメラが同じネットワーク上にある場合、メーカー純正のアプリはこの通信経路を利用します。 この通信経路では、録画映像がリアルタイムよりも速く配信され、通信速度を制限する中間サーバーも存在しません。

Hai lối lấy video khỏi camera. Lối đi thẳng bỏ qua máy chủ hãng nên không bị bóp băng thông.
カメラから動画を取得する2つの方法。メーカーのサーバーを経由しない直接接続のため、帯域幅の制限を受けません。

トレードオフ:そのストリーム内の映像と音声は、デバイスのシリアル番号から導出された鍵で暗号化されています。この復元ツールはその導出式を正確に再現するため、シリアル番号の入力が必要となります。シリアル番号は、ネットワーク経由では読み取ることができない唯一の情報です。

準備

  • Python 3.8 以降
  • ライブラリ cryptography
  • ffmpegPATH
  • カメラと同じ LAN 上に存在するコンピュータ(または、VPN などを介してカメラへの経路が設定されているもの)
  • 各カメラのシリアル番号パスワード
git clone https://github.com/Crust92/Imou-LAN-Exporter.git
cd Imou-LAN-Exporter
pip install cryptography

# ffmpeg, tuỳ hệ điều hành:
sudo dnf install ffmpeg          # Fedora
sudo apt install ffmpeg          # Debian / Ubuntu
brew install ffmpeg              # macOS
winget install Gyan.FFmpeg       # Windows

シリアル番号はどこにあるのか

シリアル番号は 25144ADPSF26C76という形式で、本体に貼られたラベル、箱の表面、およびアプリにデバイスを追加するためのQRコード内に記載されています。Imouアプリで動画をダウンロードしたことがある場合、シリアル番号はファイル名のアンダースコア(_)の間に記載されています: <thời gian>_<SÊ-RI>_….mp4.

ステップ1 — ネットワーク内のカメラを検索する

python3 imou_lan_exporter.py scan

# hoặc chỉ định dải mạng nếu máy có nhiều card mạng:
python3 imou_lan_exporter.py scan --subnet 192.168.1.0/24

8086ポートを全範囲にわたってスキャンし、応答したマシンを、 realm カメラが認証のチャレンジに使用する文字列を印刷するツール:

Scanning 192.168.1.0/24 ...
  192.168.1.5   realm=Login to 819D10EB5D1C0F8A
  192.168.1.6   realm=Login to 98188148059E78C6
  192.168.1.7   realm=Login to 6FE33416D8D69FF5

「」内の文字列に注意してください。 realm はシリアル番号ではありません。これは別の識別コードです。これが、シリアル番号を自分で入力しなければならない理由です。

ステップ2 — 初回起動時、いくつかの質問に答える

初回起動時にはインストーラーが起動します。ネットワークを自動的にスキャンし、必要なものを確認した後、 ~/.imou_lan_exporter.json 次回以降に備えて記憶します。

python3 imou_lan_exporter.py run 2026-06-01 2026-08-24
============================================================
 Imou LAN Exporter — setup wizard
============================================================

Scanning 192.168.1.0/24 for cameras on port 8086 ...

Found 3 camera(s):
  192.168.1.5   (realm: Login to 819D10EB5D1C0F8A)
  192.168.1.6   (realm: Login to 98188148059E78C6)
  192.168.1.7   (realm: Login to 6FE33416D8D69FF5)

--- Credentials ---
These CANNOT be read over the network, so you must provide them.
Username [admin]:
Do all cameras share the same password? [Y/n]: y
Password: ********

--- Camera serials ---
Camera 192.168.1.5:
  serial: 25144ADPSF7C4B7
  verifying key ... OK ✓

注目すべき verifying key 注目すべき点:このツールは短い動画の断片をダウンロードしてデコードし、その結果が有効なH.264フレームで始まるかどうかを確認します。これにより、1ヶ月もかけてダウンロードした後にファイルがすべて破損していることに気づくのではなく、シリーズやパスワードが正しいかどうかを即座に確認できます。3つの可能性があります:

  • OK ✓ — ロックが正しい。
  • WRONG serial/password ✗ — データは取得できたが、解析結果はゴミデータだった。つまり、シリアル番号かパスワードが間違っていた。
  • could not test — カメラには、検証用の直近40日間の録画データが一切ないため、現時点では結論を出せない。

なぜシリーズ番号とパスワードの両方が必要なのか

Khoá giải mã sinh ra từ sê-ri và mật khẩu, qua MD5 rồi 20 000 vòng PBKDF2.
シリアル番号とパスワードから生成された暗号解読キーは、MD5を経由し、PBKDF2を20,000回繰り返して生成されます。

このコースは2つの段階に分けて構成されています。最初の段階では、文字列のMD5ハッシュを計算し admin:Login to <SÊ-RI>:<MẬT KHẨU>のMD5ハッシュを計算し、32文字の大文字の文字列を出力します。これは HA1 HTTPダイジェスト認証の一般的な形式に合致します。次の段階では、その文字列をPBKDF2-HMAC-SHA256に通し、シリアル番号を塩として20,000回の反復処理を行い、32バイトの鍵を生成します。

このシリーズはハッシュチェーンの一部であると同時に塩の役割も果たしているため、これがないと鍵を生成できません。また、どのネットワークポートにも現れないため、遠隔から推測することは不可能です。これはメーカーによる合理的な設計上の選択です。ネットワークスニッファには手がかりとなる情報が一切ないからです。

ステップ3 — 一括アップロード

2回目以降は、おおよその日付を入力するだけで結構です:

# cả một khoảng
python3 imou_lan_exporter.py run 2026-06-01 2026-08-24

# từ ngày đó tới hôm nay
python3 imou_lan_exporter.py run 2026-08-01

# chỉ một camera
python3 imou_lan_exporter.py run 2026-08-01 --cam 192.168.1.6

# mở nhiều luồng hơn cho mạng khoẻ
python3 imou_lan_exporter.py run 2026-08-01 --parallel 12

# chạy lại trình cài đặt (đổi mật khẩu, thêm camera)
python3 imou_lan_exporter.py run 2026-08-01 --setup

実行中、各セグメントのダウンロードが完了するたびに、その時点までの容量と平均速度を記載した1行が出力されます:

[2026-08-01 00:00] ok  41.83MB  (96.4 Mbps avg)
  [2026-08-01 00:15] ok  39.11MB  (102.7 Mbps avg)
  [2026-08-01 00:30] ok  40.02MB  (108.1 Mbps avg)
  [2026-08-02] empty (RTSP), skipped
[192.168.1.6 25144ADPSF26C76] done: ok=284 err=0

結果はカメラごとに、さらに日付順に並べられており、各15分間の映像が1ファイルずつになっています:

imou_out/
└── 25144ADPSF26C76/
    ├── 2026-08-01/
    │   ├── 00-00.mp4
    │   ├── 00-15.mp4
    │   ├── 00-30.mp4
    │   └── …
    └── 2026-08-02/
        └── .no-video

もう一度やってみたらどうですか

Một ngày chia thành 96 khoảng 15 phút; tệp đã có thì bỏ qua, ngày trống được đánh dấu.
1日は15分単位の96区間に分けられます。既存のファイルがある場合はスキップされ、空の日にはマークが付けられます。

このツールは、無駄な手間をかけずに何度も繰り返し実行できるよう設計されています。ファイルが存在するセグメント .mp4 箇所はスキップします。カメラが何も録画していない日(通常は停電の日や設置前など)は、 .no-video という空のファイルでマークされ、次回再調査されることがないようにします。

その日の全データをダウンロードする前に、RTSPポート554経由で、その日に録画があるかどうかを素早く確認します。 この確認は、96個のセグメントをダウンロードして96回拒否されるよりもはるかにコストが低くなります。お使いのカメラが通常とは異なるRTSP応答を返し、この確認が誤った結果を示す場合は、以下で無効にしてください。 --no-rtsp.

速度について:カメラは各ストリームをリアルタイムの約10倍の速度で処理するため、処理を高速化する唯一の方法は、複数のストリームを同時に開くことです。デフォルトでは、カメラ1台につき8つのストリームに加え、カメラごとに1つの専用ストリームが割り当てられるため、実際には3台のカメラが並列で動作しています。 ギガビットネットワーク上では、ボトルネックとなるのは回線ではなく、カメラ内部のチップです。VPN経由の場合は、トンネルがボトルネックとなります。

その中では何をしているのか

Sáu bước từ lúc dò tìm camera tới lúc có tệp mp4.
カメラの検索からMP4ファイルの取得までの6つの手順。

動画の取得手順は、 PLAY 送信される /vod/playback.xav 送信され、開始時刻と終了時刻が指定され、HTTPダイジェスト認証によって検証されます。ここには面白い点が一つあります。カメラ内のソフトウェアは、あたかも動詞が GETであるかのようにダイジェスト署名を検証しますが、実際に送信されるリクエストは PLAYです。標準通りに正しく署名を計算すると拒否され、カメラの誤りに合わせて間違った計算をしなければアクセスできません。

カメラはDHAVパケットのシーケンスを返します。DHAVはDahua独自のパケット形式であり、各パケットには画像または音声の一部が含まれています。エンコードされるのはパケット全体ではなく、

Cấu trúc một gói DHAV: IV nằm trong khối mở rộng 0xB5, chỉ 256 byte đầu của phần dữ liệu bị mã hoá.
DHAVパケットの構造:IVは拡張ブロック0xB5に含まれており、データ部分の先頭256バイトのみが暗号化される。

各パケットは、ブロック先頭から27バイトずれた位置にある番号付き拡張ブロック内に隠された、固有のIVを保持している 0xB5、ブロックの先頭から27バイトオフセットされています。データ部分の最初の256バイトのみがAES-256-OFBで暗号化されており、末尾部分はオリジナルのH.264です。 この手法により、一般的なプレーヤーではファイルを開くことができない一方で、カメラ内のチップへの負荷は極めて軽くなります。ストリーム全体ではなく、ごく一部のみを暗号化すればよいからです。

デコード後、ツールが映像と音声を分離し、 ffmpeg MP4として再結合します。ストリームをそのままコピーするため、再エンコードは行われず、高速かつ画質劣化がありません。

不具合が発生した際

カメラが検出されませんでした

コンピュータがカメラと同じネットワーク範囲にあるか確認してください。多くの家庭では、ゲスト用ネットワークが別々に設定されていたり、2.4 GHzと5 GHzのWi-FiがVLANで分割されていたりします。ネットワーク範囲を直接指定するには、 --subnet。それでも解決しない場合は、インストーラーでIPアドレスのリストを手動で入力できます。

シリアル番号またはパスワードの誤入力

ここでいうパスワードとは、デバイスのパスワードのことであり、アプリへのログインに使用するImouアカウントのパスワードではありません。この2つは通常異なります。シリアル番号は、大文字も含めて正確に入力してください。

ダウンロードは完了したのに、ファイルが開けない

ほぼ間違いなく鍵が間違っている――動画がゴミのように乱れてしまった。 --setup し、ダウンロードを続行する前に、キーの検証ステップを実行してください。

ffmpegが不足していると表示される

名前で呼び出すツール ffmpeg は名前で呼び出すため、 PATH。Windowsでは、 winget コマンドプロンプトを再起動しないと、環境変数が有効になりません。

まだ粗い部分

合成時のフレームレートは15フレーム/秒に固定されます。これとは異なるフレームレートで録画されたカメラのファイルも通常通り再生できますが、再生時間は実際の時間とずれてしまいます。音声は、そのシーンに実際に音声データがある場合にのみ合成されます。カメラのマイクがオフになっていると、映像のみのファイルになります。

境界

このツールはパスワードを解読するものではなく、いかなる認証も bypass するものではありません。スマートフォンがカメラと同じネットワーク上にある際に、正規のアプリが行うのと同じ処理を実行するだけです。唯一の違いは、それを一括処理で実行し、ユーザーインターフェースを必要としない点です。 その機能のすべては、たった一言に集約されます。それは、ご自身のデバイスのパスワードとシリアル番号を知っている必要がある、ということです。

そう言っておくと、もう一方の側面も明確になります。もし誰かがあなたの自宅カメラのシリアル番号とパスワードを入手した場合、この方法を使ってメモリーカード内の録画データをすべて取得できてしまうのです。 シリアル番号は本体の側面に印刷されています。そのため、デフォルトのパスワードを変更し、カメラごとに個別のパスワードを設定し、カメラの8086ポートをインターネットに公開しないようにしてください。

ソースコード

すべてのツールは、フレームワークに依存しない単一のPythonファイルにまとめられており、MITライセンスが適用されています:github.com/Crust92/Imou-LAN-Exporter

Chia sẻ

Thảo luận