{"id":12947,"date":"2026-09-09T07:35:00","date_gmt":"2026-09-09T05:35:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=12947"},"modified":"2026-10-24T06:04:55","modified_gmt":"2026-10-24T04:04:55","slug":"tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/","title":{"rendered":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras"},"content":{"rendered":"<p>An RTSP address identifies a media service and the requested stream. RTSP controls the session; video is commonly carried in RTP packets. Camera support, paths, authentication and transport options depend on the model and firmware. A successful connection is only the first check, not proof of reliable recording.<\/p>\n<h2>1. Identify the actual server<\/h2>\n<p>The host can be a camera, recorder, Protect console or restreamer. The address must point to the component that serves this particular stream. A camera account is not automatically a recorder account. Port 554 is the conventional RTSP default, but the configured port is decisive.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-12947-rtsp-20261024-en.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"RTSP: test each layer\"><figcaption>A status code is evidence, not a complete diagnosis<\/figcaption><\/figure>\n<p>The following invented address illustrates the components. Credentials in the URL are a client convention that needs compatibility checks; separate credential fields are preferable where supported.<\/p>\n<pre><code>rtsp:\/\/viewer:Example%402026@192.0.2.10:554\/Streaming\/Channels\/102\nscheme | user:password       | host      | port | path<\/code><\/pre>\n<p>Neither host, credentials nor port is identical across cameras. IPv6 literals require brackets, for example <code>rtsp:\/\/[2001:db8::10]:554\/stream<\/code>. A query string can select additional settings. Its exact meaning comes from the device documentation.<\/p>\n<h2>2. Obtain the path from the device or its documentation<\/h2>\n<table>\n<thead>\n<tr>\n<th>Device family<\/th>\n<th>Illustrative path<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Hikvision<\/td>\n<td><code>\/Streaming\/channels\/101 \u00b7 \/Streaming\/channels\/102<\/code><\/td>\n<\/tr>\n<tr>\n<td>Amcrest IP<\/td>\n<td><code>\/cam\/realmonitor?channel=1&amp;subtype=0<\/code><\/td>\n<\/tr>\n<tr>\n<td>Reolink<\/td>\n<td><code>\/Preview_01_main \u00b7 \/Preview_01_sub<\/code><\/td>\n<\/tr>\n<tr>\n<td>Axis<\/td>\n<td><code>\/axis-media\/media.amp?streamprofile=PROFILE<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These are examples, not universal addresses. In the Hikvision pattern, the channel precedes a two-digit stream suffix: channel 12 with stream 02 becomes 1202. A channel does not universally identify a physical lens. An Axis resolution parameter requests a supported size; it does not inherently name a fixed \u201csubstream\u201d.<\/p>\n<p>For a compatible ONVIF Media service, <code>GetProfiles<\/code> identifies available media profiles and <code>GetStreamUri<\/code> requests a URI for the selected profile and transport. Authentication, reachability and client compatibility still need testing. A returned private address is not automatically reachable through a different network.<\/p>\n<p>UniFi Protect\u2019s official port reference lists both RTSPS on 7441 and RTSP on 7447. The earlier claim that Protect always refuses plain RTSP was too broad. The configured, supported export address and console version take priority over guessed URL conversions.<\/p>\n<h2>3. Encode credentials without confusing encoding with encryption<\/h2>\n<p>Reserved characters can change how a URL is parsed. Username and password components should be encoded separately: <code>@ \u2192 %40<\/code>, <code>\/ \u2192 %2F<\/code>, <code># \u2192 %23<\/code>, <code>? \u2192 %3F<\/code>, <code>% \u2192 %25<\/code> and space <code>\u2192 %20<\/code>. Encoding a colon as <code>%3A<\/code> avoids ambiguity, but a colon inside user information does not universally terminate that field. An already encoded value must not be encoded again.<\/p>\n<p>Percent-encoding is reversible and provides no secrecy. Digest authentication does not send the password itself as plaintext, but that does not encrypt the video or guarantee that every camera uses Digest. Basic authentication without transport protection exposes recoverable credentials. RTSPS protects the control connection with TLS; media protection depends on the negotiated transport.<\/p>\n<p>A dedicated viewing account limits privileges. URLs and aliases remain sensitive in process arguments, logs and configuration. Local encoding avoids sending a real password to an online encoder.<\/p>\n<h2>4. Run a bounded metadata check<\/h2>\n<p>This Bash example needs ffprobe and GNU <code>timeout<\/code>. It reads the URL without terminal echo, requests interleaved TCP transport and reports the first video stream\u2019s metadata. The local URL input does not become a literal history command, but the expanded argument can still be visible to permitted process inspection and may appear in errors.<\/p>\n<pre><code>IFS= read -r -s -p &#x27;RTSP URL: &#x27; RTSP_URL\nprintf &#x27;\\n&#x27;\ntimeout -k 2s 15s ffprobe -v error \\\n  -rtsp_transport tcp -timeout 5000000 \\\n  -select_streams v:0 \\\n  -show_entries stream=codec_name,width,height,avg_frame_rate \\\n  -of json &quot;$RTSP_URL&quot;\nprobe_status=$?\nunset RTSP_URL\nprintf &#x27;Exit status: %s\\n&#x27; &quot;$probe_status&quot;<\/code><\/pre>\n<p><code>-timeout 5000000<\/code> limits RTSP socket I\/O waits to five seconds in the tested FFmpeg 7.1.5. The outer command sets a separate 15-second wall-clock limit and a further two-second kill grace period. GNU timeout normally returns 124 on expiry. There is no promise that a valid camera responds within two seconds.<\/p>\n<p>A codec and size in JSON confirm useful metadata, not sustained packet delivery or successful decoding. A missing video entry is not a successful video test. A player and a representative recording test should then check actual frames, motion, day\/night changes and reconnect behavior.<\/p>\n<table>\n<tbody>\n<tr>\n<th>401 Unauthorized<\/th>\n<td>Authentication is requested or failed. An initial challenge can be normal; path correctness is not established.<\/td>\n<\/tr>\n<tr>\n<th>404 Not Found<\/th>\n<td>The requested resource was not found. This alone does not prove that credentials were accepted.<\/td>\n<\/tr>\n<tr>\n<th>Connection refused<\/th>\n<td>The endpoint or an intermediary rejected the TCP connection. The target, configured port, service and firewall need checking.<\/td>\n<\/tr>\n<tr>\n<th>Timeout<\/th>\n<td>The particular connection or read did not finish in time. Investigation needs the stage, transport, route, load and logs.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>TCP interleaving can avoid separate UDP media ports. It cannot repair a wrong path, unsupported codec, missing permission or lost connectivity. UDP can also be appropriate; packet loss and buffering determine the practical latency trade-off.<\/p>\n<h2>5. Separate detection and recording deliberately<\/h2>\n<p>Frigate allows a <code>detect<\/code> input and a <code>record<\/code> input. This fragment illustrates the roles for a confirmed Hikvision-style path. The complete configuration also needs the relevant recording settings and validation for the installed Frigate version.<\/p>\n<pre><code>cameras:\n  driveway:\n    ffmpeg:\n      inputs:\n        - path: &quot;rtsp:\/\/{FRIGATE_RTSP_USER}:{FRIGATE_RTSP_PASSWORD}@192.0.2.10:554\/Streaming\/Channels\/102&quot;\n          input_args: preset-rtsp-generic\n          roles: [detect]\n        - path: &quot;rtsp:\/\/{FRIGATE_RTSP_USER}:{FRIGATE_RTSP_PASSWORD}@192.0.2.10:554\/Streaming\/Channels\/101&quot;\n          input_args: preset-rtsp-generic\n          roles: [record]<\/code><\/pre>\n<p>Environment substitution is supported only in documented configuration fields. Here the password variable contains the URL-encoded value. A protected environment file reduces accidental sharing; runtime values are not a secret vault.<\/p>\n<p>A smaller detection stream can reduce decoding load, but distant targets may become too small. With the same field of view, reducing width from 3840 to 640 pixels reduces linear pixel density to one sixth. If an idealized target spans 172.8 pixels initially, the scaled image contains only 28.8 pixels. Cropping, perspective and encoding can change the practical result; this is not a detection guarantee.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>Does go2rtc always need only one camera connection?<\/h3>\n<p>Several consumers can share one upstream stream. Different main and substream sources can still require separate upstream connections. Device session limits vary by model; a universal two- or four-session limit is not justified.<\/p>\n<h3>Does a DHCP reservation solve every later failure?<\/h3>\n<p>A reservation helps keep an address predictable. Address conflicts, routing, power, firmware, service settings and account changes remain possible. A router restart does not necessarily change a lease.<\/p>\n<h3>What causes a stream to stop after some time?<\/h3>\n<p>Logs should distinguish transport loss, session expiry and client or device restarts. A supported RTSP keepalive and the server\u2019s session timeout matter; missing RTCP feedback is not the sole explanation. Automatic reconnect can restore service without identifying the original cause.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/ffmpeg.org\/ffmpeg-protocols.html\" target=\"_blank\" rel=\"noopener noreferrer\">FFmpeg: RTSP demuxer<\/a><\/li>\n<li><a href=\"https:\/\/ffmpeg.org\/ffprobe.html\" target=\"_blank\" rel=\"noopener noreferrer\">FFmpeg: ffprobe<\/a><\/li>\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc2326.txt\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 2326: RTSP 1.0<\/a><\/li>\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc3986.txt\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 3986: URI syntax<\/a><\/li>\n<li><a href=\"https:\/\/help.ui.com\/hc\/en-us\/articles\/218506997-Required-Ports-Reference\" target=\"_blank\" rel=\"noopener noreferrer\">Ubiquiti: Protect ports<\/a><\/li>\n<li><a href=\"https:\/\/support.reolink.com\/articles\/900000630706-Introduction-to-RTSP\/\" target=\"_blank\" rel=\"noopener noreferrer\">Reolink: RTSP paths<\/a><\/li>\n<li><a href=\"https:\/\/supportusa.hikvision.com\/a\/solutions\/articles\/17000129064\" target=\"_blank\" rel=\"noopener noreferrer\">Hikvision: RTSP stream<\/a><\/li>\n<li><a href=\"https:\/\/support.amcrest.com\/hc\/en-us\/articles\/360059019972-Accessing-Amcrest-Products-Using-RTSP\" target=\"_blank\" rel=\"noopener noreferrer\">Amcrest: RTSP products<\/a><\/li>\n<li><a href=\"https:\/\/developer.axis.com\/vapix\/network-video\/video-streaming\/\" target=\"_blank\" rel=\"noopener noreferrer\">Axis: video streaming<\/a><\/li>\n<li><a href=\"https:\/\/docs.frigate.video\/configuration\/config\/\" target=\"_blank\" rel=\"noopener noreferrer\">Frigate: configuration substitution<\/a><\/li>\n<li><a href=\"https:\/\/docs.frigate.video\/configuration\/cameras\/\" target=\"_blank\" rel=\"noopener noreferrer\">Frigate: camera input roles<\/a><\/li>\n<li><a href=\"https:\/\/docs.frigate.video\/configuration\/restream\/\" target=\"_blank\" rel=\"noopener noreferrer\">Frigate: restream<\/a><\/li>\n<li><a href=\"https:\/\/www.onvif.org\/specs\/srv\/media\/ONVIF-Media-Service-Spec.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">ONVIF Media 24.12: GetProfiles \/ GetStreamUri<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A reliable RTSP check separates the server address, authentication, transport and recorded video. This tutorial explains device-specific paths, credential encoding, a bounded ffprobe test and separate Frigate inputs for detection and recording.<\/p>\n","protected":false},"author":1,"featured_media":24046,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92648],"tags":[91398,91243,91219],"class_list":["post-12947","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-cctv","tag-monitoring-cctv-pl","tag-networking","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Building and Testing RTSP Stream URLs for IP Cameras | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"How an RTSP address is assembled part by part, which path each manufacturer uses, and how ffprobe tells a wrong path apart from a wrong password.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"How an RTSP address is assembled part by part, which path each manufacturer uses, and how ffprobe tells a wrong path apart from a wrong password.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-09T05:35:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-24T04:04:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12947-rtsp-20261024-dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras\",\"datePublished\":\"2026-09-09T05:35:00+00:00\",\"dateModified\":\"2026-10-24T04:04:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/\"},\"wordCount\":1008,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12947-rtsp-20261024-dark.png\",\"keywords\":[\"CCTV\",\"Networking\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/\",\"name\":\"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12947-rtsp-20261024-dark.png\",\"datePublished\":\"2026-09-09T05:35:00+00:00\",\"dateModified\":\"2026-10-24T04:04:55+00:00\",\"description\":\"How an RTSP address is assembled part by part, which path each manufacturer uses, and how ffprobe tells a wrong path apart from a wrong password.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12947-rtsp-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12947-rtsp-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras | Lukas Wojcik","description":"How an RTSP address is assembled part by part, which path each manufacturer uses, and how ffprobe tells a wrong path apart from a wrong password.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras | Lukas Wojcik","og_description":"How an RTSP address is assembled part by part, which path each manufacturer uses, and how ffprobe tells a wrong path apart from a wrong password.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-09T05:35:00+00:00","article_modified_time":"2026-10-24T04:04:55+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12947-rtsp-20261024-dark.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras","datePublished":"2026-09-09T05:35:00+00:00","dateModified":"2026-10-24T04:04:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/"},"wordCount":1008,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12947-rtsp-20261024-dark.png","keywords":["CCTV","Networking","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/","name":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12947-rtsp-20261024-dark.png","datePublished":"2026-09-09T05:35:00+00:00","dateModified":"2026-10-24T04:04:55+00:00","description":"How an RTSP address is assembled part by part, which path each manufacturer uses, and how ffprobe tells a wrong path apart from a wrong password.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12947-rtsp-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12947-rtsp-20261024-dark.png","width":1200,"height":630,"caption":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=12947"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12947\/revisions"}],"predecessor-version":[{"id":24052,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12947\/revisions\/24052"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/24046"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=12947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=12947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=12947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}