{"id":2153,"date":"2026-03-24T11:13:57","date_gmt":"2026-03-24T09:13:57","guid":{"rendered":"https:\/\/cln.io\/blog\/?p=2153"},"modified":"2026-03-24T12:30:58","modified_gmt":"2026-03-24T10:30:58","slug":"getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp","status":"publish","type":"post","link":"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/","title":{"rendered":"Getting Local RTSP Streams from the Imou Cruiser Dual 8MP"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The Imou Cruiser Dual 8MP (model IPC-S7X-8M0WED) is an impressive outdoor PTZ camera with two lenses &#8211; a pan-tilt 2880&#215;1620 main lens and a fixed 2304&#215;1296 wide-angle lens. But like all Imou cameras, it is designed as a cloud-first device. There is no web UI, no obvious way to get a local video stream, and the Imou Life app funnels everything through their cloud infrastructure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I wanted local RTSP streams for Home Assistant and Frigate &#8211; no cloud dependency, no latency, no reliance on Imou&#8217;s servers staying online. Here is how I got there.<\/p>\n\n\n\n<nav aria-label=\"Table of Contents\" class=\"wp-block-table-of-contents\"><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#the-problem-cloud-only-by-design\">The problem: cloud-only by design<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#step-1-disable-the-tls-encryption-toggle\">Step 1: Disable the TLS encryption toggle<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#step-2-find-the-credentials\">Step 2: Find the credentials<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#step-3-the-rtsp-urls\">Step 3: The RTSP URLs<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#dual-lens-architecture\">Dual lens architecture<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#onvif-what-works-locally\">ONVIF: what works locally<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#home-assistant-integration\">Home Assistant integration<\/a><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#option-1-onvif-integration-recommended\">Option 1: ONVIF integration (recommended)<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#option-2-generic-camera-platform\">Option 2: Generic camera platform<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#option-3-frigate-nvr\">Option 3: Frigate NVR<\/a><\/li><\/ol><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#local-vs-cloud-what-you-gain-and-lose\">Local vs cloud: what you gain and lose<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#dahua-configtool-the-hidden-local-interface\">Dahua ConfigTool: the hidden local interface<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#what-remains-untested\">What remains untested<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/cln.io\/blog\/getting-local-rtsp-streams-from-the-imou-cruiser-dual-8mp\/#troubleshooting\">Troubleshooting<\/a><\/li><\/ol><\/nav>\n\n\n\n<h2 id=\"the-problem-cloud-only-by-design\" class=\"wp-block-heading\">The problem: cloud-only by design<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Out of the box, the Imou Cruiser Dual has no local management interface. An nmap scan reveals only a handful of open ports:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PORT     STATE SERVICE\n53\/tcp   open  domain    # NextDNS proxy\n80\/tcp   open  http      # ONVIF (no web UI)\n554\/tcp  open  rtsp      # Video streams\n8086\/tcp open  unknown   # Dahua proprietary (times out)\n37777\/tcp open unknown   # Dahua binary protocol (non-functional)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Port 80 serves ONVIF SOAP endpoints &#8211; not a web interface. Port 8086 is open but times out on all Dahua CGI endpoints. Port 37777 sends an empty challenge and goes silent. No telnet, no SSH, no FTP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you try to connect to the RTSP port with the safety code printed on the camera label, the connection is <strong>reset by the camera<\/strong>. Port 554 is open and the RTSP service is listening, but it actively refuses to complete the handshake. This is because the TLS encryption toggle in the Imou Life app is enabled by default &#8211; and the camera&#8217;s RTSP service won&#8217;t talk plain RTSP while TLS mode is on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Interestingly, ONVIF on port 80 is <strong>not affected<\/strong> by the TLS toggle &#8211; snapshots and device queries work regardless. Only the RTSP service is gated.<\/p>\n\n\n\n<h2 id=\"step-1-disable-the-tls-encryption-toggle\" class=\"wp-block-heading\">Step 1: Disable the TLS encryption toggle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the Imou Life app, go to your camera&#8217;s settings and find the <strong>Encryption<\/strong> or <strong>TLS<\/strong> toggle. Turn it <strong>off<\/strong>. This is the single most important step &#8211; without it, the RTSP service resets all connections.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I verified this experimentally by toggling TLS via the cloud API and testing RTSP after each change:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>TLS setting<\/th><th>rtsp:\/\/ (plain)<\/th><th>RTSP over TLS (manual)<\/th><th>ONVIF :80<\/th><\/tr><\/thead><tbody><tr><td><strong>On<\/strong> (default)<\/td><td>Fails (port speaks TLS now)<\/td><td>Works (self-signed cert, TLS 1.2)<\/td><td>Works (unaffected)<\/td><\/tr><tr><td><strong>Off<\/strong><\/td><td>Streams video<\/td><td>N\/A<\/td><td>Works<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The camera needs about 30 seconds to apply the change &#8211; the RTSP service restarts internally. After a factory reset, TLS is re-enabled by default, so you will need to disable it again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Important nuance:<\/strong> TLS does not actually kill the RTSP service &#8211; it switches port 554 from plain RTSP to RTSP-over-TLS. The camera presents a self-signed TLS 1.2 certificate and responds to standard RTSP commands (OPTIONS, DESCRIBE, SETUP) inside the TLS tunnel. The problem is that ffmpeg\/ffprobe\/VLC cannot complete the TLS handshake with <code>rtsps:\/\/<\/code> URLs on this camera. A custom TLS client connecting to port 554, performing the TLS handshake, and then speaking RTSP with Digest auth works perfectly. So if you are building a custom integration, you can leave TLS on for encrypted local streams.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also toggle this programmatically via the Imou Open Platform API if you have registered a developer app:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Via the Open Platform API\nPOST \/openapi\/setDeviceCameraStatus\n{\n  \"params\": {\n    \"token\": \"YOUR_ACCESS_TOKEN\",\n    \"deviceId\": \"YOUR_DEVICE_ID\",\n    \"enableType\": \"tlsEnable\",\n    \"enable\": false\n  }\n}<\/pre>\n\n\n\n<h2 id=\"step-2-find-the-credentials\" class=\"wp-block-heading\">Step 2: Find the credentials<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The local password is the <strong>app password<\/strong> you set during Imou Life setup (including the AB suffix). The safety code printed on the camera label is just the factory default &#8211; once you change the password in the app, the safety code stops working:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Safety code<\/strong> (printed on camera) -&gt; used for local ONVIF and RTSP access<\/li>\n\n\n\n<li><strong>App password<\/strong> (set during setup) -&gt; used only for cloud\/P2P access via the Imou Life app<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The username is always <code>admin<\/code>.<\/p>\n\n\n\n<h2 id=\"step-3-the-rtsp-urls\" class=\"wp-block-heading\">Step 3: The RTSP URLs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Cruiser Dual has two lenses, each with a main stream (H.265, full resolution) and a sub stream (H.264, 640&#215;480). The URL pattern follows the Dahua convention:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Lens 1 (PT \/ Pan-Tilt) - Main stream: H.265 2880x1620 @ 15fps\nrtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=1&amp;subtype=0\n\n# Lens 1 (PT) - Sub stream: H.264 640x480 @ 15fps\nrtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=1&amp;subtype=1\n\n# Lens 2 (Fixed wide) - Main stream: H.265 2304x1296 @ 15fps\nrtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=2&amp;subtype=0\n\n# Lens 2 (Fixed) - Sub stream: H.264 640x480 @ 15fps\nrtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=2&amp;subtype=1<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify with ffprobe:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ffprobe -rtsp_transport tcp   \"rtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=1&amp;subtype=0\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">All four streams include AAC audio at 16 kHz mono, 64 kbps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> The <code>h264Preview_01_main<\/code> URL style that works on some Dahua cameras does not work on Imou firmware. Stick with <code>cam\/realmonitor<\/code>.<\/p>\n\n\n\n<h2 id=\"dual-lens-architecture\" class=\"wp-block-heading\">Dual lens architecture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Understanding the channel mapping is important for integration:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>Channel 1 (PT lens)<\/th><th>Channel 2 (Fixed lens)<\/th><\/tr><\/thead><tbody><tr><td><strong>Type<\/strong><\/td><td>Pan-Tilt motorized<\/td><td>Fixed wide-angle<\/td><\/tr><tr><td><strong>Max resolution<\/strong><\/td><td>2880&#215;1620<\/td><td>2304&#215;1296<\/td><\/tr><tr><td><strong>Main codec<\/strong><\/td><td>H.265\/HEVC<\/td><td>H.265\/HEVC<\/td><\/tr><tr><td><strong>Sub codec<\/strong><\/td><td>H.264 Main<\/td><td>H.264 Main<\/td><\/tr><tr><td><strong>PTZ<\/strong><\/td><td>Yes (8 presets)<\/td><td>No<\/td><\/tr><tr><td><strong>ONVIF source<\/strong><\/td><td>VideoSource000<\/td><td>VideoSource100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Both lenses share a single audio source (AudioSource000, mono).<\/p>\n\n\n\n<h2 id=\"onvif-what-works-locally\" class=\"wp-block-heading\">ONVIF: what works locally<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Beyond RTSP, the camera exposes a full ONVIF interface on port 80. You can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stream video<\/strong> &#8211; all 4 profiles (2 lenses x 2 quality levels)<\/li>\n\n\n\n<li><strong>Take snapshots<\/strong> &#8211; channel 1 only (channel 2 returns HTTP 400)<\/li>\n\n\n\n<li><strong>Control PTZ<\/strong> &#8211; pan, tilt on lens 1 with 8 configurable presets<\/li>\n\n\n\n<li><strong>Change encoder settings<\/strong> &#8211; resolution, codec, bitrate, framerate, GOP length<\/li>\n\n\n\n<li><strong>Adjust imaging<\/strong> &#8211; brightness, contrast, sharpness, IR cut filter (both lenses)<\/li>\n\n\n\n<li><strong>Control night vision (partial)<\/strong> &#8211; IR cut filter via ONVIF Imaging: ON (force color), OFF (IR\/B&amp;W), AUTO (auto-switch). Maps to 3 of the 4 cloud modes. The cloud&#8217;s &#8220;Intelligent&#8221; mode adds white LED coordination that ONVIF alone cannot replicate<\/li>\n\n\n\n<li><strong>Configure motion detection<\/strong> &#8211; CellMotionDetector zones, sensitivity, alarm on\/off delays (read and write via ONVIF analytics rules)<\/li>\n\n\n\n<li><strong>Subscribe to events<\/strong> &#8211; PullPoint subscriptions deliver real-time MotionAlarm, TamperDetector, GlobalSceneChange, and CellMotionDetector events locally (requires WS-Addressing headers)<\/li>\n\n\n\n<li><strong>Manage users<\/strong> &#8211; CreateUsers and DeleteUsers both work via ONVIF. The camera supports up to 31 users<\/li>\n\n\n\n<li><strong>WS-Discovery<\/strong> &#8211; camera responds on UDP 3702<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">What you <strong>cannot<\/strong> do locally: access SD card recordings (Recording\/Search\/Replay services all return &#8220;not implemented&#8221;), configure WiFi (Dot11 methods not implemented), toggle AI human\/vehicle detection, control the white light or siren (no relay outputs exposed), or manage the 30+ camera switches. Those features require the cloud API.<\/p>\n\n\n\n<h2 id=\"home-assistant-integration\" class=\"wp-block-heading\">Home Assistant integration<\/h2>\n\n\n\n<h3 id=\"option-1-onvif-integration-recommended\" class=\"wp-block-heading\">Option 1: ONVIF integration (recommended)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Settings -&gt; Integrations -&gt; Add -&gt; ONVIF:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Host:<\/strong> your camera IP<\/li>\n\n\n\n<li><strong>Port:<\/strong> 80<\/li>\n\n\n\n<li><strong>Username:<\/strong> admin<\/li>\n\n\n\n<li><strong>Password:<\/strong> your safety code<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This gives you 4 camera entities (2 lenses x 2 streams), PTZ controls, and motion detection events &#8211; all local, no cloud dependency.<\/p>\n\n\n\n<h3 id=\"option-2-generic-camera-platform\" class=\"wp-block-heading\">Option 2: Generic camera platform<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">camera:\n  - platform: generic\n    name: \"Imou Cruiser Dual - PT Lens\"\n    stream_source: \"rtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=1&amp;subtype=0\"\n    still_image_url: \"http:\/\/admin:SAFETY_CODE@CAMERA_IP:80\/onvifsnapshot\/media_service\/snapshot?channel=1&amp;subtype=0\"\n  - platform: generic\n    name: \"Imou Cruiser Dual - Fixed Lens\"\n    stream_source: \"rtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=2&amp;subtype=0\"<\/pre>\n\n\n\n<h3 id=\"option-3-frigate-nvr\" class=\"wp-block-heading\">Option 3: Frigate NVR<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the main streams for recording and the sub streams for object detection:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cameras:\n  imou_cruiser_pt:\n    ffmpeg:\n      inputs:\n        - path: \"rtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=1&amp;subtype=0\"\n          roles: [\"record\"]\n        - path: \"rtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=1&amp;subtype=1\"\n          roles: [\"detect\"]\n    detect:\n      width: 640\n      height: 480\n      fps: 15\n  imou_cruiser_fixed:\n    ffmpeg:\n      inputs:\n        - path: \"rtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=2&amp;subtype=0\"\n          roles: [\"record\"]\n        - path: \"rtsp:\/\/admin:SAFETY_CODE@CAMERA_IP:554\/cam\/realmonitor?channel=2&amp;subtype=1\"\n          roles: [\"detect\"]\n    detect:\n      width: 640\n      height: 480\n      fps: 15<\/pre>\n\n\n\n<h2 id=\"local-vs-cloud-what-you-gain-and-lose\" class=\"wp-block-heading\">Local vs cloud: what you gain and lose<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Going fully local gives you low-latency video (~100ms vs 2-5s for cloud HLS), no internet dependency, and no bandwidth usage. But the cloud API still has some exclusive features worth knowing about:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Feature<\/th><th>Local (RTSP\/ONVIF)<\/th><th>Cloud API<\/th><\/tr><\/thead><tbody><tr><td>Live video latency<\/td><td>~100ms<\/td><td>2-5 seconds (HLS)<\/td><\/tr><tr><td>Snapshots<\/td><td>Lens 1 only<\/td><td>Both lenses<\/td><\/tr><tr><td>PTZ control<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Encoder settings<\/td><td>Full control<\/td><td>Limited<\/td><\/tr><tr><td>Night vision modes<\/td><td>Partial (IR cut filter: ON\/OFF\/AUTO)<\/td><td>Yes (Intelligent\/FullColor\/Infrared\/Off)<\/td><\/tr><tr><td>Motion detection config<\/td><td>Yes (zones, sensitivity, delays)<\/td><td>Yes (+ schedules)<\/td><\/tr><tr><td>Motion\/tamper events<\/td><td>Yes (ONVIF PullPoint)<\/td><td>Yes (push notifications)<\/td><\/tr><tr><td>User management<\/td><td>Yes (Create\/Delete, up to 31)<\/td><td>No<\/td><\/tr><tr><td>AI detection (human\/vehicle)<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Camera switches (30+)<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>SD card recordings<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>WiFi management<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Works without internet<\/td><td>Yes<\/td><td>No<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The best approach is to combine both: use RTSP\/ONVIF for live streaming and recording (low latency, fully local), and the <a href=\"https:\/\/github.com\/Imou-OpenPlatform\/Imou-Home-Assistant\">Imou Life Home Assistant integration<\/a> for cloud-only features like AI detection toggles, camera switches, and SD card access.<\/p>\n\n\n\n<h2 id=\"dahua-configtool-the-hidden-local-interface\" class=\"wp-block-heading\">Dahua ConfigTool: the hidden local interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Imou Cruiser Dual is built on Dahua hardware, and Dahua&#8217;s free <strong>ConfigTool<\/strong> application connects to it directly over port 37777 using the proprietary Dahua binary protocol. This gives you a local GUI for settings that are not exposed via ONVIF &#8211; and it works without any cloud access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To connect: download ConfigTool from Dahua&#8217;s website, run it, and it will auto-discover your camera on the LAN. Log in with <code>admin<\/code> and your app password (the same one used for RTSP\/ONVIF).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What ConfigTool exposes locally:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"1400\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-encode-tab.png\" alt=\"Dahua ConfigTool Encode tab showing H.265 main stream at 2880x1620 and H.264 sub stream settings\" class=\"wp-image-2180\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-encode-tab.png 2000w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-encode-tab-300x210.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-encode-tab-1024x717.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-encode-tab-768x538.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-encode-tab-1536x1075.png 1536w\" sizes=\"auto, (max-width: 2000px) 100vw, 2000px\" \/><figcaption class=\"wp-element-caption\">ConfigTool Encode tab &#8211; full control over codec, resolution, bitrate, and audio per stream<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"1400\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-image-tab.png\" alt=\"Dahua ConfigTool Image tab showing Day\/Night Mode, Color Mode, brightness, contrast, gamma and saturation controls\" class=\"wp-image-2181\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-image-tab.png 2000w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-image-tab-300x210.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-image-tab-1024x717.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-image-tab-768x538.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/configtool-image-tab-1536x1075.png 1536w\" sizes=\"auto, (max-width: 2000px) 100vw, 2000px\" \/><figcaption class=\"wp-element-caption\">ConfigTool Image tab &#8211; Day\/Night Mode (Color\/Auto\/BW), imaging controls, and live preview for channel 2<\/figcaption><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Encode settings<\/strong> &#8211; codec, resolution, bitrate, frame rate, audio for both main and sub streams, per channel<\/li>\n\n\n\n<li><strong>Image settings<\/strong> &#8211; live preview with brightness, contrast, gamma, saturation sliders, color mode (Standard\/Bright\/Soft), and Day\/Night Mode (Color\/Auto\/BW) for both channels<\/li>\n\n\n\n<li><strong>Profile Management<\/strong> &#8211; switch between Normal, Full Time, and Schedule modes with Day\/Night profiles<\/li>\n\n\n\n<li><strong>NTP configuration<\/strong> &#8211; server, port, sync toggle, update period (ONVIF NTP was broken, but this works)<\/li>\n\n\n\n<li><strong>Reboot<\/strong> &#8211; manual reboot button plus auto-reboot scheduling (e.g. every Sunday at 00:00)<\/li>\n\n\n\n<li><strong>Factory reset<\/strong> &#8211; Default (soft) and Factory Default (full) restore options<\/li>\n\n\n\n<li><strong>Config backup\/restore<\/strong> &#8211; export and import encrypted device configuration<\/li>\n\n\n\n<li><strong>Device password<\/strong> &#8211; change the admin password locally (8-32 characters)<\/li>\n\n\n\n<li><strong>Video standard<\/strong> &#8211; PAL\/NTSC toggle<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The Day\/Night Mode setting in ConfigTool (Color\/Auto\/BW) maps directly to the cloud API night vision modes and the ONVIF IR cut filter. This means full night vision control is available locally through three independent interfaces: ONVIF Imaging, ConfigTool, and the cloud API.<\/p>\n\n\n\n<h2 id=\"what-remains-untested\" class=\"wp-block-heading\">What remains untested<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A few ONVIF capabilities are listed by the camera but have not been verified in practice:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ONVIF SystemReboot<\/strong> &#8211; the camera does not list SystemReboot in its service capabilities, but the SOAP method may still work. I have not tested this to avoid an unplanned reboot<\/li>\n\n\n\n<li><strong>ONVIF FirmwareUpgrade<\/strong> &#8211; listed as supported (HTTP method). The camera accepts the capability declaration, but the actual upload has not been tested. Firmware format is unknown<\/li>\n\n\n\n<li><strong>Port 37777 (Dahua binary protocol)<\/strong> &#8211; open and accepting connections, but sends an empty challenge and goes silent. Could potentially be probed with Dahua-specific protocol tooling<\/li>\n\n\n\n<li><strong>ONVIF Media2 extended features<\/strong> &#8211; the Media2 service works (GetProfiles returns all 4 profiles via raw SOAP), but Media2-specific features like GetVideoSourceModes or OSD configuration have not been explored<\/li>\n<\/ul>\n\n\n\n<h2 id=\"troubleshooting\" class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>RTSP connection reset:<\/strong> TLS encryption is still enabled. Disable it in the Imou Life app under camera settings, or via the cloud API with <code>enableType: tlsEnable, enable: false<\/code>. The camera needs about 30 seconds to restart the RTSP service after the change.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>401 Unauthorized:<\/strong> Wrong password. Use the safety code from the camera label, not the app password.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Can&#8217;t find the camera IP:<\/strong> After a factory reset the IP may change. Check your router&#8217;s DHCP leases, or run <code>nmap -sn 192.168.x.0\/24<\/code> and look for the camera&#8217;s MAC prefix <code>1c:4d:89<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Channel 2 snapshot returns 400:<\/strong> This is a firmware limitation. Use the cloud API&#8217;s <code>setDeviceSnapEnhanced<\/code> endpoint for lens 2 snapshots, or use the sub stream snapshot URL instead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>RTSP works but disconnects after TLS toggle:<\/strong> The RTSP service restarts when the TLS setting changes. Port 554 may show as closed for up to 30 seconds. Wait and retry.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-color has-link-color wp-elements-967424fa0fe7e660ff6075a5cd01473a wp-block-paragraph\" style=\"color:#9ca3af;font-size:14px\">This post was written with the help of Claude (Opus 4), Anthropic&#8217;s AI assistant.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Imou Cruiser Dual 8MP (model IPC-S7X-8M0WED) is an impressive outdoor PTZ camera with two lenses &#8211; a pan-tilt 2880&#215;1620 main lens and a fixed 2304&#215;1296 wide-angle lens. But like all Imou cameras, it is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2184,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64,27],"tags":[],"class_list":["post-2153","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cameras","category-privacy"],"_links":{"self":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/2153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/comments?post=2153"}],"version-history":[{"count":9,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/2153\/revisions"}],"predecessor-version":[{"id":2185,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/2153\/revisions\/2185"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media\/2184"}],"wp:attachment":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media?parent=2153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/categories?post=2153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/tags?post=2153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}