Summary: | MediaRecorder generates huge chunks when pausing & resuming camera access on macOS and iOS | ||
---|---|---|---|
Product: | WebKit | Reporter: | octavn <octavian> |
Component: | Media | Assignee: | Nobody <webkit-unassigned> |
Status: | NEW --- | ||
Severity: | Normal | CC: | eric.carlson, jer.noble, webkit-bug-importer, youennf |
Priority: | P2 | Keywords: | InRadar |
Version: | Safari 17 | ||
Hardware: | Unspecified | ||
OS: | Unspecified |
Description
octavn
2024-09-10 02:50:09 PDT
Here's another log which includes the `onmute` and `onunmute` events. The final .mp4 recording was 53277239 bytes in size which is the sum of all chunks including the larger ones. ``` 2024-09-27T11:56:17.137Z Start recording... 2024-09-27T11:56:17.137Z Using video/mp4 2024-09-27T11:56:17.138Z audio:{"deviceId":"4370A5A545A85F31A3C7B8ACD8166B6CD916E00B","echoCancellation":true,"groupId":"08B91934E4B5EC23217E8F7C9B2ED1C2C3413DDF","sampleRate":48000,"volume":1} 2024-09-27T11:56:17.138Z video:{"aspectRatio":1.7777777777777777,"deviceId":"A176E28C74D4A44566239B973AEA27A0382E1EB5","frameRate":30,"groupId":"B87E91C05B2542B28532739EAFA3B2303DE1EC39","height":720,"width":1280} 2024-09-27T11:56:17.141Z mediaRecorder.onstart, mediaRecorder.state = recording 2024-09-27T11:56:17.142Z onstart - Audio track.readyState=live, track.muted=false 2024-09-27T11:56:17.142Z onstart - Video track.readyState=live, track.muted=false 2024-09-27T11:56:18.143Z mediaRecorder.ondataavailable, e.data.size=1185745, e.timecode=0 2024-09-27T11:56:19.149Z mediaRecorder.ondataavailable, e.data.size=1307271, e.timecode=1.0026666666666666 2024-09-27T11:56:20.156Z mediaRecorder.ondataavailable, e.data.size=1340063, e.timecode=2.005333333333333 2024-09-27T11:56:21.160Z mediaRecorder.ondataavailable, e.data.size=1288266, e.timecode=3.008 2024-09-27T11:56:22.168Z mediaRecorder.ondataavailable, e.data.size=1292348, e.timecode=4.010666666666666 2024-09-27T11:56:22.708Z audio track.onmute track.readyState=live, track.muted=true 2024-09-27T11:56:22.708Z video track.onmute track.readyState=live, track.muted=true 2024-09-27T11:56:23.175Z mediaRecorder.ondataavailable, e.data.size=688381, e.timecode=5.013333333333334 2024-09-27T11:56:24.176Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:25.178Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:26.180Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:27.181Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:28.183Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:29.186Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:30.188Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:31.190Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:32.192Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:33.194Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:34.195Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:35.198Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:36.200Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:37.201Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:38.204Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:39.205Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:40.207Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:41.208Z mediaRecorder.ondataavailable, e.data.size=0, e.timecode=5.568 2024-09-27T11:56:44.573Z audio track.onunmute track.readyState=live, track.muted=false 2024-09-27T11:56:44.574Z video track.onunmute track.readyState=live, track.muted=false 2024-09-27T11:56:44.601Z mediaRecorder.ondataavailable, e.data.size=18126, e.timecode=5.568 2024-09-27T11:56:45.616Z mediaRecorder.ondataavailable, e.data.size=4429680, e.timecode=6.810666666666667 2024-09-27T11:56:46.632Z mediaRecorder.ondataavailable, e.data.size=5074715, e.timecode=7.824 2024-09-27T11:56:47.646Z mediaRecorder.ondataavailable, e.data.size=4964964, e.timecode=8.837333333333333 2024-09-27T11:56:48.664Z mediaRecorder.ondataavailable, e.data.size=5486805, e.timecode=9.856 2024-09-27T11:56:49.672Z mediaRecorder.ondataavailable, e.data.size=2706574, e.timecode=10.869333333333334 2024-09-27T11:56:50.684Z mediaRecorder.ondataavailable, e.data.size=2539160, e.timecode=11.882666666666667 2024-09-27T11:56:51.696Z mediaRecorder.ondataavailable, e.data.size=2722593, e.timecode=12.890666666666666 2024-09-27T11:56:52.706Z mediaRecorder.ondataavailable, e.data.size=2515794, e.timecode=13.904 2024-09-27T11:56:53.720Z mediaRecorder.ondataavailable, e.data.size=2601201, e.timecode=14.917333333333334 2024-09-27T11:56:54.727Z mediaRecorder.ondataavailable, e.data.size=2631340, e.timecode=15.925333333333333 2024-09-27T11:56:55.737Z mediaRecorder.ondataavailable, e.data.size=2634556, e.timecode=16.933333333333334 2024-09-27T11:56:56.747Z mediaRecorder.ondataavailable, e.data.size=2213167, e.timecode=17.946666666666665 2024-09-27T11:56:57.763Z mediaRecorder.ondataavailable, e.data.size=1779012, e.timecode=18.954666666666668 2024-09-27T11:56:58.773Z mediaRecorder.ondataavailable, e.data.size=1915310, e.timecode=19.973333333333333 2024-09-27T11:56:59.777Z mediaRecorder.ondataavailable, e.data.size=1305331, e.timecode=20.981333333333332 2024-09-27T11:57:00.303Z mediaRecorder.ondataavailable, e.data.size=636837, e.timecode=0 2024-09-27T11:57:00.303Z mediaRecorder.onstop, mediaRecorder.state = inactive ``` ffprobe might reveal what's in those big chunks. A quick inspection with `ffprobe -show_frames video.mp4` revealed a continuous stream of audio frames during the *paused* period but no video frames. Thanks for the investigation. This is indeed an issue, WebKit::MediaRecorderPrivate::audioSamplesAvailable is handling muting locally and should actually notify GPUProcess about that. Ditto with MediaRecorderPrivateAVFImpl::audioSamplesAvailable |