{"id":4620,"date":"2022-04-25T09:30:30","date_gmt":"2022-04-25T07:30:30","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=4620"},"modified":"2024-03-21T07:54:49","modified_gmt":"2024-03-21T06:54:49","slug":"low-latency-streaming-of-audio-data","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/","title":{"rendered":"Arduino Low Latency Streaming of Audio Data &#8211; Using TCP\/IP ?"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Traditional streaming protocols, such as <strong>RTSP and RTMP<\/strong>, support low-latency streaming. These are quite complex to implement and I did not find any efficient library which would work properly on a microcontroller e.g. on an ESP32. I tried to migrate the <a href=\"https:\/\/github.com\/pschatzmann\/live555\">live555<\/a> project, but so far I did not manage to have it working properly.<\/p>\n<p>We could use <strong>Bluetooth<\/strong> with my <a href=\"https:\/\/github.com\/pschatzmann\/ESP32-A2DP\">A2DP library<\/a> but the lag (of more then half a second) is too big to be useful if we want to use an instrument and live playing. If you do not care about latency, it is however still an good option.<\/p>\n<p>Finally you can also just implement a <strong>Webserver<\/strong> which just returns audio data as demonstrated in <a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\/tree\/main\/examples\/examples-webserver\">these examples<\/a><\/p>\n<p>So I thought it is best to make one step back and just use <strong>regular communication protocols<\/strong> to send Audio just as raw binary data over the wire.<\/p>\n<h2>Data Synchronization<\/h2>\n<p>In theory, if we send the data out in one defined rate and we process output it on the receiving system with the same rate, we should be fine. In practice however if the clocks and speeds of both systems are not synchronized, we will run into buffer overflows or underflows. It is thus far easier to send the data <strong>as fast as possible<\/strong> and just <strong>block on the receiving<\/strong> system when the buffer is full. This approach works well with all recorded data or data which is created via DSP algorithms. This is by the way also how A2DP works!<br \/>\nLatency can be controlled with the buffer size: A small buffer size leads to a low latency.<\/p>\n<h2>Data Representation<\/h2>\n<p>On Microcontrollers, audio data is usually just <strong>a stream of int16_t data<\/strong>. A problem is, that different processors represent numbers in different ways: <strong>Endianness<\/strong> is the order or sequence of bytes of a word of digital data in computer memory. It is primarily expressed as <strong>big-endian<\/strong> or <strong>little-endian<\/strong>. To simplify things we assume that we just exchange data between systems with the same endianness!<\/p>\n<h2>Protocols<\/h2>\n<h3>TCP\/IP<\/h3>\n<p>This is by far the simplest solution. We can use TCP\/IP to push audio data from the sender to a receiver. If we use blocking I2S writes, the protocol will make sure that the sending is stalled when the I2S buffer is full. So we do not need to provide any specific synchronization logic and we can control the <strong>latency<\/strong> with the <strong>I2S buffer size<\/strong>.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\/blob\/main\/examples\/examples-communication\/communication-ip-send\/communication-ip-send.ino\">communication_ip_send<\/a><\/li>\n<\/ul>\n<p>First I tested the sending speed to my McBook with the help of netcat: &#8220;nc -l -p 8000 > \/dev\/null&#8221;: I was getting a thruput of <strong>32000 to 37000 bytes per second!<\/strong>. This corresponds to a <strong>sample rate<\/strong> of 8000 using stereo and <strong>16000 samples per second in mono<\/strong> using int16_t data.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\/blob\/main\/examples\/examples-communication\/communication-ip-receive\/communication-ip-receive.ino\">communication_ip_receive<\/a><\/li>\n<\/ul>\n<p>To my disappointment however I will get on the receiving side just <strong>3000 bytes per second<\/strong> (which some bursts where it is getting to normal speed: around 32000 bytes per second). So there is definitely something wrong on the receiving side!<br \/>\nStrangely the related tests with netcat (e.g. nc -w 2 192.168.1.39 8000 &lt; x.data) were giving real good rates around 130&#8217;000 bytes!<\/p>\n<p>So it seems that <strong>the issue is only in the transmission between 2 ESP32 devices<\/strong>!<\/p>\n<p>After some research I found that the issue is related to the modem sleep setting: calling <strong>esp_wifi_set_ps(WIFI_PS_NONE)<\/strong> disables modem sleep entirely and with this I am getting a <strong>stable 32000 bytes per second<\/strong>!<\/p>\n<p>With this low band width however we will need to use a <strong>codec<\/strong> to get some reasonable sampling rates.<\/p>\n<p>In the <a href=\"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/27\/low-latency-streaming-of-audio-data-using-esp-now\/\">next blog<\/a> we will looking at <strong>ESP-Now<\/strong>&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Traditional streaming protocols, such as RTSP and RTMP, support low-latency streaming. These are quite complex to implement and I did not find any efficient library which would work properly on a microcontroller e.g. on an ESP32. I tried to migrate the live555 project, but so far I did not [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[20,22],"tags":[46],"class_list":["post-4620","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-machine-sound","tag-communications"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Arduino Low Latency Streaming of Audio Data - Using TCP\/IP ? - Phil Schatzmann<\/title>\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.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arduino Low Latency Streaming of Audio Data - Using TCP\/IP ? - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"Introduction Traditional streaming protocols, such as RTSP and RTMP, support low-latency streaming. These are quite complex to implement and I did not find any efficient library which would work properly on a microcontroller e.g. on an ESP32. I tried to migrate the live555 project, but so far I did not [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-25T07:30:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-21T06:54:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/transmitting.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"Arduino Low Latency Streaming of Audio Data &#8211; Using TCP\\\/IP ?\",\"datePublished\":\"2022-04-25T07:30:30+00:00\",\"dateModified\":\"2024-03-21T06:54:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/\"},\"wordCount\":615,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/transmitting.jpg\",\"keywords\":[\"Communications\"],\"articleSection\":[\"Arduino\",\"Machine Sound\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/\",\"name\":\"Arduino Low Latency Streaming of Audio Data - Using TCP\\\/IP ? - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/transmitting.jpg\",\"datePublished\":\"2022-04-25T07:30:30+00:00\",\"dateModified\":\"2024-03-21T06:54:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/transmitting.jpg\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/transmitting.jpg\",\"width\":800,\"height\":800},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2022\\\/04\\\/25\\\/low-latency-streaming-of-audio-data\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Arduino Low Latency Streaming of Audio Data &#8211; Using TCP\\\/IP ?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Arduino Low Latency Streaming of Audio Data - Using TCP\/IP ? - Phil Schatzmann","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.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/","og_locale":"en_US","og_type":"article","og_title":"Arduino Low Latency Streaming of Audio Data - Using TCP\/IP ? - Phil Schatzmann","og_description":"Introduction Traditional streaming protocols, such as RTSP and RTMP, support low-latency streaming. These are quite complex to implement and I did not find any efficient library which would work properly on a microcontroller e.g. on an ESP32. I tried to migrate the live555 project, but so far I did not [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/","og_site_name":"Phil Schatzmann","article_published_time":"2022-04-25T07:30:30+00:00","article_modified_time":"2024-03-21T06:54:49+00:00","og_image":[{"width":800,"height":800,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/transmitting.jpg","type":"image\/jpeg"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"Arduino Low Latency Streaming of Audio Data &#8211; Using TCP\/IP ?","datePublished":"2022-04-25T07:30:30+00:00","dateModified":"2024-03-21T06:54:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/"},"wordCount":615,"commentCount":2,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/transmitting.jpg","keywords":["Communications"],"articleSection":["Arduino","Machine Sound"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/","url":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/","name":"Arduino Low Latency Streaming of Audio Data - Using TCP\/IP ? - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/transmitting.jpg","datePublished":"2022-04-25T07:30:30+00:00","dateModified":"2024-03-21T06:54:49+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/transmitting.jpg","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/transmitting.jpg","width":800,"height":800},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2022\/04\/25\/low-latency-streaming-of-audio-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"Arduino Low Latency Streaming of Audio Data &#8211; Using TCP\/IP ?"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/4620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=4620"}],"version-history":[{"count":38,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/4620\/revisions"}],"predecessor-version":[{"id":4701,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/4620\/revisions\/4701"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/4622"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=4620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=4620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=4620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}