Xuất video từ camera Imou qua mạng LAN: không cần app, không cần rút thẻ nhớ
Ảnh: Lorex

Xuất video từ camera Imou qua mạng LAN: không cần app, không cần rút thẻ nhớ

Tải thẳng bản ghi từ thẻ nhớ của camera Imou qua mạng nội bộ bằng một công cụ dòng lệnh — nhanh hơn thời gian thật khoảng mười lần, cả tháng video gói trong một lệnh.

Camera Imou ghi liên tục vào thẻ microSD cắm trong máy. Chuyện đó rất tiện cho đến lúc bạn cần lấy ra vài tuần video: ứng dụng chỉ cho lưu từng đoạn một, mỗi lần một cái bấm, và đường tải đi vòng qua máy chủ của hãng nên bị bóp tốc độ. Còn rút thẻ nhớ ra thì camera thường lại treo ở chỗ khó với.

Bài này hướng dẫn dùng Imou LAN Exporter — một công cụ dòng lệnh gọi thẳng vào camera trong mạng nội bộ, tải hàng loạt bản ghi rồi ghép thành tệp .mp4 bình thường. Không cần mở ứng dụng, không cần tháo thẻ, không đi qua Internet.

⚠️
Công cụ này cần đúng mật khẩu của camera. Nó là công cụ lấy lại dữ liệu của chính bạn, trên thiết bị của chính bạn — không phải công cụ đột nhập. Đừng chĩa nó vào camera của người khác.

Vì sao đi đường LAN lại khác

Camera Imou (và Dahua, vì Imou là nhánh gia dụng của Dahua) mở sẵn một giao thức riêng ở cổng 8086, na ná RTSP. Chính ứng dụng của hãng dùng đường này khi điện thoại và camera ở cùng mạng. Đường đó trả về bản ghi nhanh hơn thời gian thật, và không có ai ở giữa để giới hạn tốc độ.

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.
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.

Điểm đánh đổi: phần hình và tiếng trong luồng đó bị mã hoá bằng một khoá dẫn xuất từ số sê-ri của máy. Công cụ dựng lại đúng phép dẫn xuất ấy, nên nó cần bạn cho biết số sê-ri — thứ duy nhất không đọc được qua mạng.

Chuẩn bị

  • Python 3.8 trở lên
  • Thư viện cryptography
  • ffmpeg có trong PATH
  • Máy tính nằm cùng mạng LAN với camera (hoặc có đường định tuyến tới đó, ví dụ qua VPN)
  • Số sê-rimật khẩu của từng camera
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

Tìm số sê-ri ở đâu

Số sê-ri có dạng 25144ADPSF26C76, in trên nhãn dán ở thân máy, trên vỏ hộp, và trong mã QR dùng để thêm thiết bị vào ứng dụng. Nếu bạn từng tải một đoạn clip nào bằng ứng dụng Imou thì số sê-ri nằm sẵn trong tên tệp, giữa dấu gạch dưới: <thời gian>_<SÊ-RI>_….mp4.

Bước 1 — dò tìm camera trong mạng

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

Công cụ quét cổng 8086 trên toàn dải và in ra những máy có trả lời, kèm chuỗi realm mà camera dùng để thách thức xác thực:

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

Lưu ý chuỗi trong realm không phải số sê-ri — nó là một mã định danh khác. Đây chính là lý do bạn vẫn phải tự gõ sê-ri vào.

Bước 2 — chạy lần đầu, trả lời vài câu hỏi

Lần chạy đầu tiên sẽ bật trình cài đặt. Nó tự quét mạng, tự hỏi những gì cần thiết, rồi nhớ lại vào ~/.imou_lan_exporter.json cho các lần sau.

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 ✓

Dòng verifying key đáng chú ý: công cụ tải thử một mẩu video ngắn, giải mã, rồi soi xem kết quả có bắt đầu bằng một khung H.264 hợp lệ không. Nhờ vậy bạn biết ngay sê-ri và mật khẩu có đúng hay không, thay vì tải cả tháng rồi mới phát hiện ra toàn tệp hỏng. Ba khả năng:

  • OK ✓ — khoá đúng.
  • WRONG serial/password ✗ — lấy được dữ liệu nhưng giải ra rác, tức là sai sê-ri hoặc sai mật khẩu.
  • could not test — camera không có bản ghi nào trong 40 ngày gần đây để thử, nên chưa kết luận được.

Vì sao phải cần cả sê-ri lẫn mật khẩu

Khoá giải mã sinh ra từ sê-ri và mật khẩu, qua MD5 rồi 20 000 vòng PBKDF2.
Khoá giải mã sinh ra từ sê-ri và mật khẩu, qua MD5 rồi 20 000 vòng PBKDF2.

Khoá được dựng theo hai chặng. Chặng đầu là băm MD5 của chuỗi admin:Login to <SÊ-RI>:<MẬT KHẨU>, cho ra 32 ký tự hoa — đúng dạng HA1 quen thuộc của xác thực HTTP Digest. Chặng sau đưa chuỗi đó qua PBKDF2-HMAC-SHA256 với muối chính là số sê-ri và 20 000 vòng lặp, thu về khoá 32 byte.

Vì sê-ri vừa nằm trong chuỗi băm vừa làm muối, thiếu nó thì không dựng được khoá. Và vì nó không xuất hiện trên bất kỳ cổng mạng nào, không cách gì đoán ra từ xa. Đó là một lựa chọn thiết kế hợp lý của hãng: kẻ dò mạng không có nhãn dán trong tay.

Bước 3 — tải hàng loạt

Từ lần thứ hai trở đi, chỉ cần đưa khoảng ngày:

# 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

Trong lúc chạy, mỗi đoạn tải xong in một dòng kèm dung lượng và tốc độ trung bình tính tới thời điểm đó:

[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

Kết quả xếp theo camera rồi theo ngày, mỗi đoạn 15 phút một tệp:

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

Chạy lại thì sao

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.
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.

Công cụ được viết để chạy đi chạy lại nhiều lần mà không phí công. Đoạn nào đã có tệp .mp4 thì bỏ qua. Ngày nào camera không ghi gì — thường là ngày mất điện hoặc trước khi lắp máy — được đánh dấu bằng một tệp rỗng tên .no-video để lần sau khỏi dò lại.

Trước khi tải nguyên một ngày, công cụ hỏi nhanh qua RTSP ở cổng 554 xem ngày đó có bản ghi nào không. Phép hỏi này rẻ hơn nhiều so với thử tải 96 đoạn rồi nhận 96 lần từ chối. Nếu camera của bạn trả lời RTSP kiểu khác thường và phép dò này báo sai, tắt nó bằng --no-rtsp.

Về tốc độ: camera chặn mỗi luồng ở khoảng mười lần thời gian thật, nên cách duy nhất để nhanh hơn là mở nhiều luồng cùng lúc. Mặc định là 8 luồng cho mỗi camera, cộng thêm một luồng riêng cho mỗi camera, nên ba camera chạy song song thật sự. Trên mạng gigabit, con chip trong camera mới là chỗ nghẽn chứ không phải đường truyền. Qua VPN thì đường hầm là chỗ nghẽn.

Bên trong nó làm gì

Sáu bước từ lúc dò tìm camera tới lúc có tệp mp4.
Sáu bước từ lúc dò tìm camera tới lúc có tệp mp4.

Bước xin video là một câu lệnh PLAY gửi tới /vod/playback.xav kèm mốc thời gian đầu và cuối, xác thực bằng HTTP Digest. Có một chi tiết ngộ nghĩnh ở đây: phần mềm trong camera kiểm tra chữ ký Digest như thể động từ là GET, dù câu lệnh thật sự gửi đi là PLAY. Ai tính chữ ký đúng theo chuẩn sẽ bị từ chối; phải tính sai theo đúng cái sai của camera thì mới vào được.

Camera trả về một chuỗi gói DHAV — định dạng đóng gói riêng của Dahua, mỗi gói mang một mẩu hình hoặc tiếng. Phần bị mã hoá không phải cả gói:

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á.
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á.

Mỗi gói mang theo IV riêng của nó, giấu trong khối mở rộng đánh số 0xB5, lệch 27 byte so với đầu khối. Chỉ 256 byte đầu của phần dữ liệu bị mã hoá bằng AES-256-OFB; phần đuôi là H.264 nguyên bản. Cách làm này đủ để một trình phát thông thường không mở nổi tệp, mà lại rất nhẹ cho con chip trong camera — nó chỉ phải mã hoá một mẩu nhỏ thay vì cả luồng.

Sau khi giải mã, công cụ tách riêng hình và tiếng rồi gọi ffmpeg ghép lại thành MP4, sao chép nguyên luồng chứ không mã hoá lại, nên nhanh và không mất chất lượng.

Khi có trục trặc

Quét không thấy camera nào

Kiểm tra máy tính có đúng dải mạng với camera không — nhiều nhà có mạng khách tách riêng, hoặc Wi-Fi 2,4 GHz và 5 GHz bị chia VLAN. Chỉ định thẳng dải mạng bằng --subnet. Nếu vẫn không ra, trình cài đặt cho phép gõ tay danh sách địa chỉ IP.

Báo sai sê-ri hoặc mật khẩu

Mật khẩu ở đây là mật khẩu của thiết bị, không phải mật khẩu tài khoản Imou dùng để đăng nhập ứng dụng. Hai thứ này thường khác nhau. Sê-ri phải gõ y nguyên, kể cả chữ hoa.

Tải xong nhưng tệp không mở được

Gần như chắc chắn là khoá sai — video giải ra thành rác. Chạy lại với --setup và để bước kiểm tra khoá xác nhận trước khi tải tiếp.

Báo thiếu ffmpeg

Công cụ gọi ffmpeg theo tên, nên nó phải nằm trong PATH. Trên Windows, sau khi cài bằng winget cần mở lại cửa sổ dòng lệnh thì biến môi trường mới có hiệu lực.

Những chỗ còn thô

Nhịp hình được đặt cố định 15 khung/giây lúc ghép. Camera nào ghi ở nhịp khác thì tệp vẫn xem được bình thường nhưng con số thời lượng sẽ lệch so với thực tế. Tiếng chỉ được ghép khi trong đoạn thật sự có dữ liệu âm thanh — camera tắt micro sẽ cho ra tệp chỉ có hình.

Ranh giới

Công cụ này không phá mật khẩu và không vượt qua bất cứ lớp xác thực nào. Nó làm đúng việc mà ứng dụng chính hãng vẫn làm khi điện thoại ở cùng mạng với camera, chỉ khác là làm hàng loạt và không cần giao diện. Toàn bộ khả năng của nó nằm gọn trong một câu: bạn phải biết mật khẩu và số sê-ri của chính thiết bị mình.

Nói vậy để rõ luôn mặt kia: nếu ai đó có được sê-ri và mật khẩu camera nhà bạn, họ cũng lấy được toàn bộ bản ghi trong thẻ nhớ theo đúng cách này. Sê-ri thì in ngay trên thân máy. Cho nên hãy đổi mật khẩu mặc định, đặt mật khẩu riêng cho từng máy, và đừng để camera phơi cổng 8086 ra Internet.

Mã nguồn

Toàn bộ công cụ nằm trong một tệp Python duy nhất, không phụ thuộc khung nào, giấy phép MIT: github.com/Crust92/Imou-LAN-Exporter.

Chia sẻ

Thảo luận