{"id":19927,"date":"2026-09-17T20:12:51","date_gmt":"2026-09-17T18:12:51","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/browser-audio-codec-support\/"},"modified":"2026-09-17T20:12:51","modified_gmt":"2026-09-17T18:12:51","slug":"browser-audio-codec-support","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/","title":{"rendered":"Audio Codec Support in the Browser: which formats this browser plays, streams and records"},"content":{"rendered":"<div class=\"lw-cs\" id=\"cs-wurzel\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<style>\n.lw-cs .cs-kacheln { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin: 14px 0 4px; }\n.lw-cs .cs-kachel { background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 11px 14px; min-width: 0; }\n.lw-cs .cs-kachel-name { font-size: 0.74rem; color: var(--text-secondary, #a0a0b0); text-transform: uppercase; letter-spacing: 0.4px; }\n.lw-cs .cs-kachel-wert { font-family: monospace; font-size: 1.4rem; font-weight: 700; color: var(--text-primary, #e8e8ee); line-height: 1.25; white-space: nowrap; }\n.lw-cs .cs-tabelle { overflow-x: auto; margin-top: 6px; }\n.lw-cs table { border-collapse: collapse; width: 100%; font-size: 0.86rem; }\n.lw-cs th, .lw-cs td { text-align: left; padding: 6px 10px; border-bottom: 1px solid var(--border, #2a2a35); white-space: nowrap; }\n.lw-cs th { color: var(--text-primary, #e8e8ee); }\n.lw-cs td { color: var(--text-primary, #e8e8ee); }\n.lw-cs td.cs-typ { font-family: monospace; color: var(--text-secondary, #a0a0b0); }\n.lw-cs .cs-ja { color: var(--ok, #7ee787); font-weight: 700; }\n.lw-cs .cs-vielleicht { color: var(--cs-warn); font-weight: 700; }\n.lw-cs .cs-nein { color: var(--text-secondary, #a0a0b0); }\n.lw-cs { --cs-warn: #e8a33d; }\n:root[data-theme=\"light\"] .lw-cs { --cs-warn: #8f5300; }\n.lw-cs .cs-h { font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 24px 0 8px; }\n.lw-cs .cs-klein { font-size: 0.84rem; color: var(--text-secondary, #a0a0b0); line-height: 1.55; }\n.lw-cs .cs-knopf { background: transparent; color: var(--text-secondary, #a0a0b0); border: 1px solid var(--border, #2a2a35); padding: 9px 14px; border-radius: 6px; cursor: pointer; font-size: 0.9rem; margin-top: 14px; }\n.lw-cs a { color: var(--accent, #2ba6df); }\n@media (max-width: 480px) {\n    .lw-cs .cs-kacheln { grid-template-columns: 1fr 1fr; gap: 8px; }\n    .lw-cs .cs-kachel-wert { font-size: 1.15rem; }\n    .lw-cs th, .lw-cs td { padding: 6px 6px; }\n}\n<\/style>\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 18px;\">Which audio formats a browser plays decides what arrives on a page and which format an audio sample needs. The check asks this browser directly: the audio element through canPlayType, Media Source Extensions for streaming and MediaRecorder for recordings. Nothing is loaded or sent, these are plain queries.<\/p>\n<div id=\"cs-kacheln\" class=\"cs-kacheln\" data-mp-mask aria-live=\"polite\"><\/div>\n<div class=\"cs-h\">Playback<\/div>\n<div class=\"cs-tabelle\">\n<table>\n<thead>\n<tr>\n<th>Format<\/th>\n<th>MIME type<\/th>\n<th>Audio element<\/th>\n<th>MediaSource<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"cs-abspielen\" data-mp-mask><\/tbody>\n<\/table><\/div>\n<p class=\"cs-klein\" style=\"margin: 8px 0 0;\">\u201cProbably\u201d means, according to the HTML Standard, that the browser is confident; \u201cmaybe\u201d is the careful answer the standard recommends as long as support can be neither confirmed nor ruled out.<\/p>\n<div class=\"cs-h\">Recording in the browser<\/div>\n<div class=\"cs-tabelle\">\n<table>\n<thead>\n<tr>\n<th>Format<\/th>\n<th>MIME type<\/th>\n<th>MediaRecorder<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"cs-aufnehmen\" data-mp-mask><\/tbody>\n<\/table><\/div>\n<p class=\"cs-klein\" style=\"margin: 8px 0 0;\">MediaRecorder concerns recordings in the browser, for example a voice memo on a page. Without that interface every row reads \u201cunknown\u201d.<\/p>\n<p>    <button id=\"cs-kopieren\" type=\"button\" class=\"cs-knopf\">Copy result<\/button><br \/>\n    <span id=\"cs-kopiert\" data-mp-mask class=\"cs-klein\" style=\"margin-left: 10px;\"><\/span><\/p>\n<div class=\"cs-h\">What the answers mean<\/div>\n<p class=\"cs-klein\" style=\"margin: 0 0 6px;\">According to the HTML Standard, canPlayType on the audio element answers with an empty string when the browser knows it cannot render the type, with \u201cmaybe\u201d when it can neither confirm nor rule out support, and with \u201cprobably\u201d when it is confident.<\/p>\n<p class=\"cs-klein\" style=\"margin: 0 0 6px;\">MediaSource.isTypeSupported only states that a SourceBuffer can be created for this type; the specification points out that a later addSourceBuffer can still fail when the resources are missing.<\/p>\n<p class=\"cs-klein\" style=\"margin: 0 0 6px;\">MediaRecorder.isTypeSupported names the containers and codecs this browser can record into. That list often differs from the list of formats it plays.<\/p>\n<p class=\"cs-klein\" style=\"margin: 20px 0 0;\">Sources:<br \/>\n        <a href=\"https:\/\/html.spec.whatwg.org\/multipage\/media.html#mime-types\" rel=\"noopener\">HTML Standard, 4.8.11.3 MIME types<\/a> \u00b7<br \/>\n        <a href=\"https:\/\/www.w3.org\/TR\/media-source-2\/\" rel=\"noopener\">Media Source Extensions<\/a>\n    <\/p>\n<p class=\"cs-klein\" style=\"font-size: 0.8rem; margin: 14px 0 0;\">The answers apply to this browser on this device, including the operating system and its hardware decoders; another device can answer differently. What is checked are the browser&#039;s own statements, not the playback itself.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Which audio formats a browser plays decides what arrives on a page and which format an audio sample needs. The check asks this browser directly: the audio element through canPlayType, Media Source Extensions for streaming and MediaRecorder for recordings. Nothing is loaded or sent, these are plain queries.\",\"h_abspielen\":\"Playback\",\"h_aufnehmen\":\"Recording in the browser\",\"sp_format\":\"Format\",\"sp_typ\":\"MIME type\",\"sp_element\":\"Audio element\",\"sp_mediasource\":\"MediaSource\",\"sp_recorder\":\"MediaRecorder\",\"abspielen_hinweis\":\"\u201cProbably\u201d means, according to the HTML Standard, that the browser is confident; \u201cmaybe\u201d is the careful answer the standard recommends as long as support can be neither confirmed nor ruled out.\",\"aufnehmen_hinweis\":\"MediaRecorder concerns recordings in the browser, for example a voice memo on a page. Without that interface every row reads \u201cunknown\u201d.\",\"knopf_kopieren\":\"Copy result\",\"kopiert\":\"copied\",\"kopieren_fehler\":\"copying not possible\",\"k_spielbar\":\"Playable\",\"k_sicher\":\"Confirmed\",\"k_quelle\":\"Via MediaSource\",\"k_aufnahme\":\"Recording formats\",\"wert_probably\":\"probably\",\"wert_maybe\":\"maybe\",\"wert_ja\":\"yes\",\"wert_nein\":\"no\",\"wert_unbekannt\":\"unknown\",\"h_erklaerung\":\"What the answers mean\",\"erkl_canplaytype\":\"According to the HTML Standard, canPlayType on the audio element answers with an empty string when the browser knows it cannot render the type, with \u201cmaybe\u201d when it can neither confirm nor rule out support, and with \u201cprobably\u201d when it is confident.\",\"erkl_mediasource\":\"MediaSource.isTypeSupported only states that a SourceBuffer can be created for this type; the specification points out that a later addSourceBuffer can still fail when the resources are missing.\",\"erkl_aufnahme\":\"MediaRecorder.isTypeSupported names the containers and codecs this browser can record into. That list often differs from the list of formats it plays.\",\"quellen_titel\":\"Sources\",\"grenze\":\"The answers apply to this browser on this device, including the operating system and its hardware decoders; another device can answer differently. What is checked are the browser\\u0027s own statements, not the playback itself.\"};<\/p>\n<p>    \/\/ KERN-ANFANG ------------------------------------------------------------\n    \/\/ Gefragt wird der Browser selbst: canPlayType am Audio-Element,\n    \/\/ MediaSource.isTypeSupported und MediaRecorder.isTypeSupported. Alle drei\n    \/\/ kommen als Funktionen herein, damit die Pruefung eigene einsetzen kann.<\/p>\n<p>    var ABSPIELEN = [\n        { id: 'wav', name: 'WAV (PCM)', typ: 'audio\/wav' },\n        { id: 'aiff', name: 'AIFF', typ: 'audio\/aiff' },\n        { id: 'flac', name: 'FLAC', typ: 'audio\/flac' },\n        { id: 'flac_mp4', name: 'FLAC in MP4', typ: 'audio\/mp4; codecs=\"flac\"' },\n        { id: 'mp3', name: 'MP3', typ: 'audio\/mpeg' },\n        { id: 'mp3_mp4', name: 'MP3 in MP4', typ: 'audio\/mp4; codecs=\"mp3\"' },\n        { id: 'aac_lc', name: 'AAC-LC in MP4', typ: 'audio\/mp4; codecs=\"mp4a.40.2\"' },\n        { id: 'he_aac', name: 'HE-AAC in MP4', typ: 'audio\/mp4; codecs=\"mp4a.40.5\"' },\n        { id: 'alac', name: 'ALAC in MP4', typ: 'audio\/mp4; codecs=\"alac\"' },\n        { id: 'vorbis_ogg', name: 'Vorbis in Ogg', typ: 'audio\/ogg; codecs=\"vorbis\"' },\n        { id: 'opus_ogg', name: 'Opus in Ogg', typ: 'audio\/ogg; codecs=\"opus\"' },\n        { id: 'opus_webm', name: 'Opus in WebM', typ: 'audio\/webm; codecs=\"opus\"' },\n        { id: 'vorbis_webm', name: 'Vorbis in WebM', typ: 'audio\/webm; codecs=\"vorbis\"' },\n        { id: 'ac3', name: 'AC-3 in MP4', typ: 'audio\/mp4; codecs=\"ac-3\"' },\n        { id: 'ec3', name: 'E-AC-3 in MP4', typ: 'audio\/mp4; codecs=\"ec-3\"' }\n    ];\n    var AUFNEHMEN = [\n        { id: 'webm_opus', name: 'Opus in WebM', typ: 'audio\/webm;codecs=opus' },\n        { id: 'webm', name: 'WebM (Vorgabe)', typ: 'audio\/webm' },\n        { id: 'ogg_opus', name: 'Opus in Ogg', typ: 'audio\/ogg;codecs=opus' },\n        { id: 'mp4_aac', name: 'AAC in MP4', typ: 'audio\/mp4;codecs=mp4a.40.2' },\n        { id: 'mp4', name: 'MP4 (Vorgabe)', typ: 'audio\/mp4' },\n        { id: 'wav', name: 'WAV (PCM)', typ: 'audio\/wav' },\n        { id: 'mpeg', name: 'MP3', typ: 'audio\/mpeg' }\n    ];<\/p>\n<p>    function pruefen(kannSpielen, quelleStuetzt, nimmtAuf) {\n        var abspielen = ABSPIELEN.map(function (f) {\n            var antwort = null;\n            if (kannSpielen) {\n                try { antwort = String(kannSpielen(f.typ) || ''); } catch (e) { antwort = null; }\n            }\n            var quelle = null;\n            if (quelleStuetzt) {\n                try { quelle = !!quelleStuetzt(f.typ); } catch (e) { quelle = null; }\n            }\n            return { id: f.id, name: f.name, typ: f.typ, element: antwort, quelle: quelle };\n        });\n        var aufnehmen = AUFNEHMEN.map(function (f) {\n            var kann = null;\n            if (nimmtAuf) {\n                try { kann = !!nimmtAuf(f.typ); } catch (e) { kann = null; }\n            }\n            return { id: f.id, name: f.name, typ: f.typ, kann: kann };\n        });\n        return { abspielen: abspielen, aufnehmen: aufnehmen };\n    }<\/p>\n<p>    function bewerten(e) {\n        var sicher = 0, vielleicht = 0, quelle = 0, aufnahme = 0, quelleBekannt = false, aufnahmeBekannt = false;\n        e.abspielen.forEach(function (z) {\n            if (z.element === 'probably') { sicher++; }\n            else if (z.element === 'maybe') { vielleicht++; }\n            if (z.quelle !== null) { quelleBekannt = true; if (z.quelle) { quelle++; } }\n        });\n        e.aufnehmen.forEach(function (z) {\n            if (z.kann !== null) { aufnahmeBekannt = true; if (z.kann) { aufnahme++; } }\n        });\n        return {\n            gesamt: e.abspielen.length, sicher: sicher, vielleicht: vielleicht, spielbar: sicher + vielleicht,\n            quelle: quelle, quelleBekannt: quelleBekannt, aufnahme: aufnahme, aufnahmeBekannt: aufnahmeBekannt,\n            aufnahmeGesamt: e.aufnehmen.length\n        };\n    }<\/p>\n<p>    function bericht(e) {\n        var zeilen = [T.h_abspielen];\n        e.abspielen.forEach(function (z) {\n            zeilen.push('  ' + z.name + ' (' + z.typ + '): ' + antwortText(z.element) + ' | MediaSource: ' + jaNein(z.quelle));\n        });\n        zeilen.push(T.h_aufnehmen);\n        e.aufnehmen.forEach(function (z) {\n            zeilen.push('  ' + z.name + ' (' + z.typ + '): ' + jaNein(z.kann));\n        });\n        return zeilen.join('\\n');\n    }\n    \/\/ KERN-ENDE --------------------------------------------------------------<\/p>\n<p>    function antwortText(a) {\n        if (a === 'probably') { return T.wert_probably; }\n        if (a === 'maybe') { return T.wert_maybe; }\n        if (a === '') { return T.wert_nein; }\n        return T.wert_unbekannt;\n    }\n    function jaNein(w) { return w === null ? T.wert_unbekannt : (w ? T.wert_ja : T.wert_nein); }\n    function klasse(a) {\n        if (a === 'probably' || a === true) { return 'cs-ja'; }\n        if (a === 'maybe') { return 'cs-vielleicht'; }\n        return 'cs-nein';\n    }\n    function text(schluessel, werte) {\n        return String(T[schluessel]).replace(\/\\{(\\w+)\\}\/g, function (m, k) { return werte && werte[k] !== undefined ? werte[k] : m; });\n    }\n    function el(id) { return document.getElementById(id); }<\/p>\n<p>    function kachel(name, wert) {\n        var d = document.createElement('div'), n = document.createElement('div'), w = document.createElement('div');\n        d.className = 'cs-kachel'; n.className = 'cs-kachel-name'; w.className = 'cs-kachel-wert';\n        n.textContent = name;\n        w.textContent = wert;\n        w.setAttribute('data-kachel', name);\n        d.appendChild(n); d.appendChild(w);\n        return d;\n    }<\/p>\n<p>    function darstellen(e) {\n        var z = bewerten(e);\n        var k = el('cs-kacheln');\n        k.textContent = '';\n        k.appendChild(kachel(T.k_spielbar, z.spielbar + ' \/ ' + z.gesamt));\n        k.appendChild(kachel(T.k_sicher, String(z.sicher)));\n        k.appendChild(kachel(T.k_quelle, z.quelleBekannt ? (z.quelle + ' \/ ' + z.gesamt) : T.wert_unbekannt));\n        k.appendChild(kachel(T.k_aufnahme, z.aufnahmeBekannt ? (z.aufnahme + ' \/ ' + z.aufnahmeGesamt) : T.wert_unbekannt));<\/p>\n<p>        var tb = el('cs-abspielen');\n        tb.textContent = '';\n        e.abspielen.forEach(function (zeile) {\n            var tr = document.createElement('tr');\n            [[zeile.name, ''], [zeile.typ, 'cs-typ'], [antwortText(zeile.element), klasse(zeile.element)], [jaNein(zeile.quelle), klasse(zeile.quelle)]]\n                .forEach(function (feld) {\n                    var td = document.createElement('td');\n                    td.textContent = feld[0];\n                    if (feld[1]) { td.className = feld[1]; }\n                    tr.appendChild(td);\n                });\n            tb.appendChild(tr);\n        });<\/p>\n<p>        var ta = el('cs-aufnehmen');\n        ta.textContent = '';\n        e.aufnehmen.forEach(function (zeile) {\n            var tr = document.createElement('tr');\n            [[zeile.name, ''], [zeile.typ, 'cs-typ'], [jaNein(zeile.kann), klasse(zeile.kann)]].forEach(function (feld) {\n                var td = document.createElement('td');\n                td.textContent = feld[0];\n                if (feld[1]) { td.className = feld[1]; }\n                tr.appendChild(td);\n            });\n            ta.appendChild(tr);\n        });\n        return e;\n    }<\/p>\n<p>    function messen() {\n        var audio = null;\n        try { audio = document.createElement('audio'); } catch (e) { audio = null; }\n        var kannSpielen = audio && audio.canPlayType ? function (t) { return audio.canPlayType(t); } : null;\n        var Quelle = window.MediaSource || window.WebKitMediaSource;\n        var quelleStuetzt = Quelle && Quelle.isTypeSupported ? function (t) { return Quelle.isTypeSupported(t); } : null;\n        var Rec = window.MediaRecorder;\n        var nimmtAuf = Rec && Rec.isTypeSupported ? function (t) { return Rec.isTypeSupported(t); } : null;\n        return pruefen(kannSpielen, quelleStuetzt, nimmtAuf);\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.CS = {\n        T: T, ABSPIELEN: ABSPIELEN, AUFNEHMEN: AUFNEHMEN, pruefen: pruefen, bewerten: bewerten, bericht: bericht,\n        darstellen: darstellen, messen: messen, antwortText: antwortText, jaNein: jaNein, text: text\n    };<\/p>\n<p>    if (!el('cs-wurzel') || !el('cs-kacheln')) { return; }\n    var ergebnis = darstellen(messen());\n    var kopieren = el('cs-kopieren'), kopiert = el('cs-kopiert');\n    if (kopieren) {\n        kopieren.addEventListener('click', function () {\n            var t = bericht(ergebnis);\n            function gut() { kopiert.textContent = T.kopiert; }\n            if (navigator.clipboard && navigator.clipboard.writeText) {\n                navigator.clipboard.writeText(t).then(gut, function () { kopiert.textContent = T.kopieren_fehler; });\n            } else {\n                kopiert.textContent = T.kopieren_fehler;\n            }\n        });\n    }\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Asks this browser directly which audio formats it can play through the audio element, stream through Media Source Extensions and record with MediaRecorder, and lists the answer per container and codec with the meaning of \u201cprobably\u201d and \u201cmaybe\u201d.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92901],"class_list":["post-19927","page","type-page","status-publish","hentry","tag-music-production"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Audio Codec Support in the Browser: which formats this browser plays, streams and records - Lukas Wojcik - Blog<\/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.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Audio Codec Support in the Browser: which formats this browser plays, streams and records - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Asks this browser directly which audio formats it can play through the audio element, stream through Media Source Extensions and record with MediaRecorder, and lists the answer per container and codec with the meaning of \u201cprobably\u201d and \u201cmaybe\u201d.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\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\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/browser-audio-codec-support\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/browser-audio-codec-support\\\/\",\"name\":\"Audio Codec Support in the Browser: which formats this browser plays, streams and records - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-17T18:12:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/browser-audio-codec-support\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/browser-audio-codec-support\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/browser-audio-codec-support\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Audio Codec Support in the Browser: which formats this browser plays, streams and records\"}]},{\"@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":"Audio Codec Support in the Browser: which formats this browser plays, streams and records - Lukas Wojcik - Blog","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\/toolbox\/browser-audio-codec-support\/","og_locale":"en_US","og_type":"article","og_title":"Audio Codec Support in the Browser: which formats this browser plays, streams and records - Lukas Wojcik - Blog","og_description":"Asks this browser directly which audio formats it can play through the audio element, stream through Media Source Extensions and record with MediaRecorder, and lists the answer per container and codec with the meaning of \u201cprobably\u201d and \u201cmaybe\u201d.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/","name":"Audio Codec Support in the Browser: which formats this browser plays, streams and records - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-17T18:12:51+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/browser-audio-codec-support\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Audio Codec Support in the Browser: which formats this browser plays, streams and records"}]},{"@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\/pages\/19927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"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=19927"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/19927\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=19927"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=19927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}