RESOLVED FIXED301507
REGRESSION (Safari 26): MediaRecorder emits empty Blobs for small timeslice values
https://bugs.webkit.org/show_bug.cgi?id=301507
Summary REGRESSION (Safari 26): MediaRecorder emits empty Blobs for small timeslice v...
register
Reported 2025-10-27 02:22:03 PDT
When using MediaRecorder.start(timeslice) with small timeslice values (e.g. ≤ 100 ms), Safari 26 on macOS 26 (Tahoe) and iOS 26 consistently fires dataavailable events containing empty Blobs (blob.size === 0). Only after ~1 second has passed will such an event contain a blob with the combined data from the full second. Larger timeslice values (≥ 1000 ms) work as expected, producing valid data. This regression did not occur on Safari on macOS 15/iOS 18, where small timeslice intervals produced usable chunks. Reproduction: 1. Open the minimal repro sandbox: https://codesandbox.io/p/sandbox/youthful-benz-jsxdzx?file=%2Findex.html%3A323%2C1 2. Grant microphone access. 3. Set Timeslice = 50 ms and press Start. 4. Observe console/log output — multiple dataavailable events fire with blob.size === 0. 5. Repeat with Timeslice = 1000 ms — valid non-empty Blobs are produced. Expected: Each dataavailable event should deliver a valid Blob containing encoded media, even for small timeslice values. Actual: dataavailable events fire but contain empty Blob objects (size 0) until the recorder is stopped or the slice value is increased. Notes: requestData() suffers the same problem and cannot be used as a workaround (can be tried in CodeSandbox as well). This issue showed while working on an implementation of a live visualization of voice input.
Attachments
Radar WebKit Bug Importer
Comment 1 2025-10-27 08:51:43 PDT
Jean-Yves Avenard [:jya]
Comment 2 2026-01-27 22:41:40 PST
Per spec ``` If timeslice is not undefined, then once a minimum of timeslice milliseconds of data have been collected, or some minimum time slice imposed by the UA, whichever is greater, start gathering data into a new Blob blob, and queue a task, using the DOM manipulation task source, that fires a blob event named dataavailable at recorder with blob. ``` [1] Emitting zero blob is I believe the correct behaviour. WebKit uses a 100ms minimum time slice. dataavailable has to be fired every 100ms, but webkit will not generate segment lesser than 1s long since bug 282320. [1] https://www.w3.org/TR/mediastream-recording/#mediarecorder-methods
Jean-Yves Avenard [:jya]
Comment 3 2026-01-27 22:44:20 PST
the limitation to 1s segment is that all segments generated by the MediaRecorder will start with a keyframe.
Jean-Yves Avenard [:jya]
Comment 4 2026-02-18 00:05:53 PST
EWS
Comment 5 2026-02-25 23:20:49 PST
Committed 308266@main (a18b47068781): <https://commits.webkit.org/308266@main> Reviewed commits have been landed. Closing PR #58910 and removing active labels.
Note You need to log in before you can comment on or make changes to this bug.