{"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-09-09T07:35:00","modified_gmt":"2026-09-09T05:35:00","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 IP camera delivers its video over RTSP, and RTSP is standardised. The address that leads to the video is not. Every manufacturer invented a path of its own, and a camera asked on the wrong path answers exactly as it answers a wrong password: with nothing at all.<\/p>\n<p>Such an address has six parts. Four of them look the same on every camera, two have to be looked up per manufacturer. What follows is the order in which the parts are best assembled, and the single command that settles whether the result works &#8211; before it disappears into a recorder, where the mistake hides behind six other settings.<\/p>\n<figure class=\"lw-diagram\">\n<img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/rtsp-adressen-en.png\" width=\"1120\" height=\"580\" decoding=\"async\" loading=\"lazy\"\n     alt=\"An RTSP address split into six coloured segments with a legend explaining each part, beside a list of the stream paths used by four camera manufacturers\"><figcaption>Only the last two segments differ between manufacturers. Everything in front of them is identical on every camera.<\/figcaption><\/figure>\n<h2>The Six Parts of a Stream Address<\/h2>\n<p>An RTSP address is built like a web address: scheme, credentials, host, port, path, and on some cameras a query string that carries the stream number.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>rtsp:\/\/admin:Sommer%402026@192.168.1.64:554\/Streaming\/Channels\/102\nrtsp:\/\/admin:Sommer%402026@192.168.1.64:554\/cam\/realmonitor?channel=1&amp;subtype=1\nrtsps:\/\/192.168.1.1:7441\/aBcD1234EfGh?enableSrtp<\/code><\/pre>\n<p>The scheme is <code>rtsp<\/code> and the port 554, as long as nobody moved it. Ubiquiti is the exception worth remembering: UniFi Protect answers on <code>rtsps<\/code> at port 7441, refuses plain RTSP, and hands out an opaque alias instead of a readable path. That alias appears only after RTSP has been switched on for the individual camera in Protect.<\/p>\n<p>Host means the camera, never the recorder. A recorder can re-serve a stream, but then it serves its own address on its own port, and a mistake at that layer looks identical to a broken camera.<\/p>\n<h2>Why the Path Differs on Every Camera<\/h2>\n<p>The path carries two pieces of information that RTSP itself has no field for: which lens, and which of its streams. Nearly every camera offers at least two &#8211; a main stream at full resolution for recording, and a substream at a quarter of it for previews and motion analysis.<\/p>\n<table style=\"width:100%;border-collapse:collapse;table-layout:auto;\">\n<thead>\n<tr>\n<th style=\"white-space:nowrap;vertical-align:top;\">Manufacturer<\/th>\n<th style=\"vertical-align:top;\">Main stream<\/th>\n<th style=\"vertical-align:top;\">Substream<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">Hikvision<\/td>\n<td>\/Streaming\/Channels\/101<\/td>\n<td>\/Streaming\/Channels\/102<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">Dahua, Amcrest<\/td>\n<td>\/cam\/realmonitor?channel=1&amp;subtype=0<\/td>\n<td>\/cam\/realmonitor?channel=1&amp;subtype=1<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">Reolink<\/td>\n<td>\/h264Preview_01_main<\/td>\n<td>\/h264Preview_01_sub<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">Axis<\/td>\n<td>\/axis-media\/media.amp<\/td>\n<td>\/axis-media\/media.amp?resolution=640&#215;360<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The Hikvision numbering is the one most often mistyped. The three digits are channel and stream glued together: 1 and 01 becomes 101, the second stream of the first channel becomes 102. On a single-lens camera the channel is always 1; on a multi-sensor housing the second lens is 201 and 202.<\/p>\n<p>Guessing stops being necessary as soon as the camera speaks ONVIF. A <code>GetStreamUri<\/code> call returns the address the camera considers correct, including the path, and that answer beats every table.<\/p>\n<h2>Passwords That Break the Address<\/h2>\n<p>Credentials sit between the scheme and the host, separated by a colon and closed by an at sign. That is also where the most quietly destructive mistake lives: a password containing an at sign, a colon, a slash or a hash ends the credentials early, and the remainder of the password is read as a host name.<\/p>\n<p>The fix is percent-encoding. An at sign becomes <code>%40<\/code>, a colon <code>%3A<\/code>, a slash <code>%2F<\/code>, a hash <code>%23<\/code>, a question mark <code>%3F<\/code>. A password of <code>Sommer@2026<\/code> therefore appears as <code>Sommer%402026<\/code> in the address and stays untouched in the camera.<\/p>\n<p>Worth knowing about the other end of this: many cameras authenticate over RTSP digest rather than basic auth, so the password never travels in clear text even though it stands in clear text in the address. What does travel in clear text is the address itself &#8211; in shell history, in a Compose file, in a log line. Credentials for a camera belong in a separate account with viewing rights only, never in the administrator account.<\/p>\n<h2>Testing the Address Before It Goes Anywhere<\/h2>\n<p>One command answers the only question that matters at this stage. It opens the stream, reads the first packets, prints what it found and exits.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>ffprobe -hide_banner -rtsp_transport tcp \\\n  -i \"rtsp:\/\/admin:Sommer%402026@192.168.1.64:554\/Streaming\/Channels\/102\"<\/code><\/pre>\n<p>A working address prints a stream line with codec, resolution and frame rate within a second or two. Everything else is a diagnosis, and the four common answers each point somewhere different.<\/p>\n<table style=\"width:100%;border-collapse:collapse;table-layout:auto;\">\n<thead>\n<tr>\n<th style=\"white-space:nowrap;vertical-align:top;\">Answer<\/th>\n<th style=\"vertical-align:top;\">What it means<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">401 Unauthorized<\/td>\n<td>Host and path are right, the credentials are not &#8211; or the account has no stream permission<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">404 Not Found<\/td>\n<td>Credentials accepted, path wrong &#8211; a manufacturer or a stream number too far<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">Connection refused<\/td>\n<td>Nothing is listening on 554; RTSP is switched off in the camera, or the port was moved<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">Timeout after the handshake<\/td>\n<td>The session was established, the video packets are not arriving &#8211; almost always blocked UDP<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The last of the four explains why <code>-rtsp_transport tcp<\/code> stands in the command. By default the control channel runs over TCP and the video over UDP on separate ports. Across a VLAN boundary or a firewall, the handshake therefore succeeds and the picture never arrives. Forcing TCP costs a little latency and removes an entire class of faults.<\/p>\n<h2>Which Stream Belongs Where<\/h2>\n<p>Once the address works, the substream turns out to be the more useful half. Recording needs the main stream, because that is the material an insurer or a court will look at. Motion analysis and object detection need small pictures and get faster with them: a detector fed 4K frames spends its time scaling them down.<\/p>\n<p>Frigate makes that split explicit by assigning roles per stream, and the same idea applies to any recorder that accepts two inputs per camera.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>cameras:\n  driveway:\n    ffmpeg:\n      inputs:\n        - path: rtsp:\/\/admin:Sommer%402026@192.168.1.64:554\/Streaming\/Channels\/102\n          input_args: preset-rtsp-restream\n          roles: [detect]\n        - path: rtsp:\/\/admin:Sommer%402026@192.168.1.64:554\/Streaming\/Channels\/101\n          input_args: preset-rtsp-restream\n          roles: [record]<\/code><\/pre>\n<p>Two connections to one camera is also the ceiling on many models. Cheap cameras allow four RTSP sessions at once, sometimes only two, and the fifth attempt fails with a message that has nothing to do with the address. A restreamer such as go2rtc solves this by opening one session and handing copies to everyone else.<\/p>\n<h2>What Still Breaks Later<\/h2>\n<p>An address that worked once can stop working without anything about it changing. Three causes cover almost all of it.<\/p>\n<p>The first is DHCP. A camera addressed by its leased IP moves after a router restart, and the address points at whatever took the number. A reservation in the DHCP server, or a static address inside the camera VLAN, ends this permanently.<\/p>\n<p>The second is a firmware update that resets the RTSP switch or the viewer account. Both are worth checking first after an update, because the symptom &#8211; connection refused, then 401 &#8211; looks like a network fault.<\/p>\n<p>The third is time. Many cameras drop a session that has been idle without RTCP feedback, and some recorders never send it. What that looks like is a stream that runs for hours and disappears overnight, always at a slightly different time. A restreamer with a reconnect setting removes the symptom; a keepalive interval below the camera&#8217;s timeout removes the cause.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>RTSP is standardised, the path after the host name is not. Six parts make up a stream address, two of them differ per manufacturer &#8211; and one ffprobe call separates a wrong path from a wrong password before either disappears into a recorder.<\/p>\n","protected":false},"author":1,"featured_media":13210,"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 - Blog<\/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 - Blog\" \/>\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=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-12947-tutorial-building-and-testing-rtsp-strea.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=\"luky\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"luky\" \/>\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\":\"luky\",\"@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\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cctv\\\/tutorials-en-cctv\\\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\\\/\"},\"wordCount\":1097,\"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\\\/08\\\/hero-12947-tutorial-building-and-testing-rtsp-strea.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 - Blog\",\"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\\\/08\\\/hero-12947-tutorial-building-and-testing-rtsp-strea.png\",\"datePublished\":\"2026-09-09T05:35:00+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\\\/08\\\/hero-12947-tutorial-building-and-testing-rtsp-strea.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-12947-tutorial-building-and-testing-rtsp-strea.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\":\"luky\",\"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\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"],\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/author\\\/luky\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Building and Testing RTSP Stream URLs for IP Cameras - Lukas Wojcik - Blog","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 - Blog","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","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-12947-tutorial-building-and-testing-rtsp-strea.png","type":"image\/png"}],"author":"luky","twitter_card":"summary_large_image","twitter_misc":{"Written by":"luky","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":"luky","@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","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cctv\/tutorials-en-cctv\/tutorial-building-and-testing-rtsp-stream-urls-for-ip-cameras\/"},"wordCount":1097,"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\/08\/hero-12947-tutorial-building-and-testing-rtsp-strea.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 - Blog","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\/08\/hero-12947-tutorial-building-and-testing-rtsp-strea.png","datePublished":"2026-09-09T05:35:00+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\/08\/hero-12947-tutorial-building-and-testing-rtsp-strea.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-12947-tutorial-building-and-testing-rtsp-strea.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":"luky","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":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"],"url":"https:\/\/www.lukaswojcik.com\/blog\/author\/luky\/"}]}},"_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":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12947\/revisions"}],"predecessor-version":[{"id":16598,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12947\/revisions\/16598"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13210"}],"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}]}}