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

Đ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 ffmpegcó trongPATH- 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ê-ri và mậ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 # WindowsTì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/24Cô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 6FE33416D8D69FF5Lư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á đượ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 --setupTrong 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=0Kế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-videoChạy lại thì sao

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ì

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:

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.
Thảo luận