{"id":6749,"date":"2025-06-09T08:30:22","date_gmt":"2025-06-09T06:30:22","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=6749"},"modified":"2025-06-09T14:13:50","modified_gmt":"2025-06-09T12:13:50","slug":"pimping-up-your-containerm4a","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/","title":{"rendered":"Pimping up your ContainerM4A"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">In <a href=\"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/05\/vibe-coding-adding-m4a-audio-playback-support-to-the-audiotools\/\">my last blog<\/a>, I described you I added <strong>M4A support<\/strong> to my <a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\">Arduino Audio Tools<\/a> project and how to use it.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">As highlited we need to access and store the <strong>stsz size tabe<\/strong> to play back the audio: a typical size table contains aournd 40 &#8211; 80 kbytes, but for long audio this can get much bigger: This is not an amount of data, that you would like to have to store on a Microcontroller.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">In this document I present a couple of <strong>solution<\/strong> <strong>approaches<\/strong> that avoid the need to store this amount of data in RAM<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Avoiding the Container Class<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\" data-start=\"885\" data-end=\"1115\">My existing container classes use a streaming-based approach: you feed data in small chunks, which makes the processing logic independent of the data source type. To support M4A playback more efficiently, I introduced a new class:<\/p>\r\n<h3 data-start=\"1117\" data-end=\"1142\"><a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_m4_a_audio_file_demuxer.html\"><code data-start=\"1121\" data-end=\"1142\">M4AAudioFileDemuxer<\/code><\/a><\/h3>\r\n<p data-start=\"1144\" data-end=\"1291\">This class acts as a demuxer for M4A\/MP4 files, designed to extract audio data directly from a file without buffering the sample size table in RAM.<\/p>\r\n<ul data-start=\"1293\" data-end=\"1578\">\r\n<li data-start=\"1293\" data-end=\"1356\">\r\n<p data-start=\"1295\" data-end=\"1356\">It locates the <code data-start=\"1310\" data-end=\"1316\">mdat<\/code> and <code data-start=\"1321\" data-end=\"1327\">stsz<\/code> boxes using the <code data-start=\"1344\" data-end=\"1355\">MP4Parser<\/code>.<\/p>\r\n<\/li>\r\n<li data-start=\"1357\" data-end=\"1406\">\r\n<p data-start=\"1359\" data-end=\"1406\">You assign a <code data-start=\"1372\" data-end=\"1386\">MultiDecoder<\/code> in the constructor.<\/p>\r\n<\/li>\r\n<li data-start=\"1407\" data-end=\"1460\">\r\n<p data-start=\"1409\" data-end=\"1460\">You start processing by calling <code data-start=\"1441\" data-end=\"1459\">begin(File file)<\/code>.<\/p>\r\n<\/li>\r\n<li data-start=\"1461\" data-end=\"1578\">\r\n<p data-start=\"1463\" data-end=\"1578\">It offers a <code data-start=\"1475\" data-end=\"1483\">copy()<\/code> method to extract frames by reading the sample sizes directly from the <code data-start=\"1555\" data-end=\"1561\">stsz<\/code> box in the file.<\/p>\r\n<\/li>\r\n<\/ul>\r\n<p data-start=\"1580\" data-end=\"1751\">Because the sample sizes are read on-the-fly from the file, this solution is very memory-efficient. Data is passed directly to the decoder or an optional <code data-start=\"1734\" data-end=\"1750\">frame_callback<\/code>..<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Buffers<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Initially, I was storing the size table in a <a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_vector.html\">Vector<\/a> of uint32_t. In order to half the memory requirements, I changed the data type to <strong>uint16_t<\/strong>: this is really <strong>sufficient for audio<\/strong>! In the next step, I replaced the Vector with a <a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_base_buffer.html\">BaseBuffer<\/a>, so that we can use any supported Buffer type and add it with the setSampleSizesBuffer() method.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Here are some of the most relevant buffer classes:<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_ring_buffer_file.html\">RingBufferFile<\/a><\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_ring_buffer_file.html\">RingBufferFile<\/a> is a file backed ring buffer. Instead of storing the data in RAM we just store it in a separate file.<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">\r\n<span class=\"hljs-comment\">\/\/ Define global variables<\/span>\r\nMultiDecoder multi_decoder;\r\nContainerM4A dec_m4a(multi_decoder);\r\nFile buffer_file;\r\nRingBufferFile&lt;File,stsz_sample_size_t&gt; file_buffer(<span class=\"hljs-number\">0<\/span>);\r\n\r\n<span class=\"hljs-comment\">\/\/ in setup call<\/span>\r\nbuffer_file = SD.open(<span class=\"hljs-string\">\"\/home\/pschatzmann\/tmp.tmp\"<\/span>, O_RDWR | O_CREAT);\r\nfile_buffer.begin(buffer_file);\r\ndec_m4a.setSampleSizesBuffer(file_buffer);\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_redis_buffer.html\">RedisBuffer<\/a><\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\" data-start=\"2569\" data-end=\"2712\">This implementation uses a <strong>Redis<\/strong> list as a circular buffer. Data is buffered locally and pushed\/popped in batches to minimize network overhead.<\/p>\r\n<ul data-start=\"2714\" data-end=\"2922\">\r\n<li data-start=\"2714\" data-end=\"2764\">\r\n<p data-start=\"2716\" data-end=\"2764\">Uses <code data-start=\"2721\" data-end=\"2728\">RPUSH<\/code> for writing and <code data-start=\"2745\" data-end=\"2751\">LPOP<\/code> for reading.<\/p>\r\n<\/li>\r\n<li data-start=\"2765\" data-end=\"2801\">\r\n<p data-start=\"2767\" data-end=\"2801\">Built on the Arduino <code data-start=\"2788\" data-end=\"2796\">Client<\/code> API.<\/p>\r\n<\/li>\r\n<li data-start=\"2802\" data-end=\"2844\">\r\n<p data-start=\"2804\" data-end=\"2844\">Supports automatic Redis key expiration.<\/p>\r\n<\/li>\r\n<li data-start=\"2845\" data-end=\"2884\">\r\n<p data-start=\"2847\" data-end=\"2884\">The local batch size is configurable.<\/p>\r\n<\/li>\r\n<li data-start=\"2885\" data-end=\"2922\">\r\n<p data-start=\"2887\" data-end=\"2922\">Works well for streaming scenarios.<\/p>\r\n<\/li>\r\n<\/ul>\r\n<p>.<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ Define global variables<\/span>\r\nMultiDecoder multi_decoder;\r\nContainerM4A dec_m4a(multi_decoder);\r\nWiFiClient client;\r\nRedisBuffer&lt;stsz_sample_size_t&gt; redis(client,<span class=\"hljs-string\">\"m4a-buffer1\"<\/span>,<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1024<\/span>, <span class=\"hljs-number\">0<\/span>);\r\n\r\n<span class=\"hljs-comment\">\/\/ in setup call<\/span>\r\nWiFi.begin(<span class=\"hljs-string\">\"ssid\"<\/span>,<span class=\"hljs-string\">\"pwd\"<\/span>);\r\n<span class=\"hljs-keyword\">while<\/span> ( WiFi.status() != WL_CONNECTED) {\r\n   Serial.<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\".\"<\/span>);\r\n}\r\n<span class=\"hljs-keyword\">if<\/span> (!client.connect(IPAddress(<span class=\"hljs-number\">192<\/span>,<span class=\"hljs-number\">168<\/span>,<span class=\"hljs-number\">1<\/span>,<span class=\"hljs-number\">10<\/span>),<span class=\"hljs-number\">6379<\/span>)){\r\n  Serial.println(<span class=\"hljs-string\">\"redis error\"<\/span>);\r\n  stop();\r\n}\r\ndec_m4a.setSampleSizesBuffer(redis);\r\n\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_m4_a_file_sample_size_buffer.html\">M4AFileSampleSizeBuffer<\/a><\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\" data-start=\"3479\" data-end=\"3663\">This class reuses the <code data-start=\"3501\" data-end=\"3522\">M4AAudioFileDemuxer<\/code> functionality and mimics a buffer interface. It reads sample sizes directly from an M4A file during playback without storing them in memory.<\/p>\r\n<ul data-start=\"3665\" data-end=\"3831\">\r\n<li data-start=\"3665\" data-end=\"3716\">\r\n<p data-start=\"3667\" data-end=\"3716\">Works only with file-based sources (not streams).<\/p>\r\n<\/li>\r\n<li data-start=\"3717\" data-end=\"3749\">\r\n<p data-start=\"3719\" data-end=\"3749\">Integrates with <code data-start=\"3735\" data-end=\"3748\"><a href=\"https:\/\/pschatzmann.github.io\/arduino-audio-tools\/classaudio__tools_1_1_audio_player.html\">AudioPlayer<\/a>:<\/code>it registers a <code data-start=\"3764\" data-end=\"3793\">setOnStreamChangeCallback()<\/code> to automatically handle file changes.<\/p>\r\n<\/li>\r\n<\/ul>\r\n<div class=\"contain-inline-size rounded-2xl border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\r\n<div class=\"sticky top-9\"><\/div>\r\n<\/div>\r\n<pre class=\"wp-block-code has-border-color has-white-border-color\"><code><br \/>\/\/ Define global variables\r\nMultiDecoder multi_decoder;\r\nAudioPlayer player(source, out, multi_decoder);\r\nContainerM4A dec_m4a(multi_decoder);\r\nM4AFileSampleSizeBuffer sizes_buffer(player, dec_m4a);\r\n\r\n\/\/ in setup call\r\ndec_m4a.setSampleSizesBuffer(sizes_buffer);\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\" data-start=\"4119\" data-end=\"4426\">These buffering strategies offer a lot of flexibility for optimizing your sketches to support M4A audio playback. Depending on your use case\u2014whether you&#8217;re streaming, using files, or dealing with long audio content\u2014you can choose the most appropriate approach to minimize RAM usage and maximize performance.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">&nbsp;<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>In my last blog, I described you I added M4A support to my Arduino Audio Tools project and how to use it. As highlited we need to access and store the stsz size tabe to play back the audio: a typical size table contains aournd 40 &#8211; 80 kbytes, but [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6726,"comment_status":"open","ping_status":"closed","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":[59],"class_list":["post-6749","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-machine-sound","tag-m4a"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pimping up your ContainerM4A - 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\/2025\/06\/09\/pimping-up-your-containerm4a\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pimping up your ContainerM4A - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"In my last blog, I described you I added M4A support to my Arduino Audio Tools project and how to use it. As highlited we need to access and store the stsz size tabe to play back the audio: a typical size table contains aournd 40 &#8211; 80 kbytes, but [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-09T06:30:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-09T12:13:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/06\/m4a.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"196\" \/>\n\t<meta property=\"og:image:height\" content=\"257\" \/>\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\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"Pimping up your ContainerM4A\",\"datePublished\":\"2025-06-09T06:30:22+00:00\",\"dateModified\":\"2025-06-09T12:13:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/\"},\"wordCount\":476,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/m4a.jpeg\",\"keywords\":[\"M4A\"],\"articleSection\":[\"Arduino\",\"Machine Sound\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/\",\"name\":\"Pimping up your ContainerM4A - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/m4a.jpeg\",\"datePublished\":\"2025-06-09T06:30:22+00:00\",\"dateModified\":\"2025-06-09T12:13:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/m4a.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/m4a.jpeg\",\"width\":196,\"height\":257},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/06\\\/09\\\/pimping-up-your-containerm4a\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pimping up your ContainerM4A\"}]},{\"@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":"Pimping up your ContainerM4A - 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\/2025\/06\/09\/pimping-up-your-containerm4a\/","og_locale":"en_US","og_type":"article","og_title":"Pimping up your ContainerM4A - Phil Schatzmann","og_description":"In my last blog, I described you I added M4A support to my Arduino Audio Tools project and how to use it. As highlited we need to access and store the stsz size tabe to play back the audio: a typical size table contains aournd 40 &#8211; 80 kbytes, but [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/","og_site_name":"Phil Schatzmann","article_published_time":"2025-06-09T06:30:22+00:00","article_modified_time":"2025-06-09T12:13:50+00:00","og_image":[{"width":196,"height":257,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/06\/m4a.jpeg","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\/2025\/06\/09\/pimping-up-your-containerm4a\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"Pimping up your ContainerM4A","datePublished":"2025-06-09T06:30:22+00:00","dateModified":"2025-06-09T12:13:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/"},"wordCount":476,"commentCount":0,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/06\/m4a.jpeg","keywords":["M4A"],"articleSection":["Arduino","Machine Sound"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/","url":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/","name":"Pimping up your ContainerM4A - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/06\/m4a.jpeg","datePublished":"2025-06-09T06:30:22+00:00","dateModified":"2025-06-09T12:13:50+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/06\/m4a.jpeg","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/06\/m4a.jpeg","width":196,"height":257},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/06\/09\/pimping-up-your-containerm4a\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"Pimping up your ContainerM4A"}]},{"@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\/6749","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=6749"}],"version-history":[{"count":14,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6749\/revisions"}],"predecessor-version":[{"id":6754,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6749\/revisions\/6754"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/6726"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=6749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=6749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=6749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}