Hi Yury,

This is a longstanding policy whose intent was to match the overall system 
behavior where multiple apps are prevented from playing audible content 
simultaneously. 

While it is true that, originally, all video+audio playback required that 
playback to take place in fullscreen mode. But since fullscreen mode itself was 
something of a singleton, that mechanism already prevented multiple video 
elements from playing simultaneously.

I am sympathetic to the video conferencing use case to allow multiple 
MediaStream-backed video elements to play simultaneously. However, IMO relaxing 
this policy for all video elements with no opt-in would lead to some pretty 
terrible behavior on unsophisticated web sites.

All that said, we’re currently investigating the idea of assigning particular 
AudioSessions to individual HTMLMediaElements. When multiple elements share a 
single AudioSession, that seems to be a good signal that those media elements 
can play simultaneously. Let’s figure out if that kind of more declarative, 
opt-in approach can solve the video conferencing use case.

-Jer

> On May 13, 2025, at 5:12 AM, Yury Yarashevich <yura.yaroshev...@gmail.com> 
> wrote:
> 
> Hi Eric Carlson, Jer Noble,
> 
> Could you please join the discussion to help assess whether the restriction 
> on concurrent playback of multiple <video> elements with audio is still 
> necessary on iOS?
> 
> I’ve traced the origin of this restriction back to Bug 126780 
> <https://bugs.webkit.org/show_bug.cgi?id=126780>, which was addressed in this 
> commit 
> <https://github.com/WebKit/WebKit/commit/5ae5b76ad011a7ed3bd964184b268c672a61fdcc>
>  by Eric Carlson in January 2014. Unfortunately, the bug description doesn’t 
> clearly explain what was meant by “Some platforms do not allow more than one 
> <video> element to play concurrently,” so the exact rationale remains unclear.
> 
> Later, in October 2016, inline playback via <video> on iOS was introduced 
> (blog post <https://webkit.org/blog/6784/new-video-policies-for-ios/>) 
> through this commit 
> <https://github.com/WebKit/WebKit/commit/99efb5e8e4efa797684804f65a4eeec119096f7c>
>  by Jer Noble. However, the concurrent playback restriction for multiple 
> audible videos still remains in effect on iOS.
> 
> After digging through the history, the original motivation behind this 
> restriction is still not fully clear. One possible explanation is that, prior 
> to the introduction of playsinline, video playback on iOS was always 
> fullscreen - so automatically pausing other videos might have made sense to 
> avoid background playback. But in today’s usage patterns, this seems more 
> like a concern for the web application to manage rather than something 
> enforced by the platform.
> 
> This restriction has repeatedly caused issues in scenarios such as 
> WebRTC-based video conferencing, as noted in the bug tracker. While WebRTC is 
> one example, my primary interest is in supporting concurrent playback of 
> multiple <video> elements delivering audio/video over LL-HLS. In such cases, 
> this restriction still applies and leads to playback interruptions - even 
> though technically there are no hard constraints that should prevent smooth, 
> simultaneous playback.
> 
> So I’d like to ask: if there are no longer any technical or policy reasons to 
> enforce this restriction, could it be reconsidered and potentially lifted?
> 
> If it’s decided that this restriction is no longer needed, I’d be happy to 
> begin working on a patch to lift it.
> 
> Thanks for your time and consideration!
> 
> 
> 
> On Wed, Apr 30, 2025 at 4:01 PM Yury Yarashevich <yura.yaroshev...@gmail.com 
> <mailto:yura.yaroshev...@gmail.com>> wrote:
>> Hi Jean-Yves,
>> 
>> Thanks for the quick and detailed response, and for the helpful links.
>> 
>> > Are you referring to audible video elements requiring a user gesture for 
>> > playback to start?
>> 
>> To clarify, I’m aware of the standard autoplay policies and user gesture 
>> requirements for unmuted playback, and I agree that those are 
>> well-documented and expected.
>> 
>> What I’m describing appears to be a distinct issue - not about autoplay 
>> initiation, but about ongoing playback being unexpectedly paused by the 
>> browser after it has already started, particularly when multiple unmuted 
>> <video> elements are playing concurrently. This happens even after a proper 
>> user gesture and successful play() call.
>> 
>> > I’m not aware of any such restrictions.
>> 
>> After capturing logs and digging into the WebKit source code, I found that 
>> the restriction I’m referring to is implemented as follows::
>> 1. The `ConcurrentPlaybackNotPermitted` policy is enforced only on iOS, 
>> which explains why there’s no issue on macOS (I haven’t tested on iPad). 
>> Source code: 
>> https://github.com/WebKit/WebKit/blob/45d0c14d08a78058a88d16460f1fbc10946634c0/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm#L85
>> 2. The logic that iterates over all media elements and enforces pause is 
>> here: 
>> https://github.com/WebKit/WebKit/blob/main/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp#L292-L300
>> 3. The implementation of the "can play concurrently" check, which 
>> effectively disallows concurrent playback of audible media unless the source 
>> is a MediaStream, is here: 
>> https://github.com/WebKit/WebKit/blob/45d0c14d08a78058a88d16460f1fbc10946634c0/Source/WebCore/platform/audio/PlatformMediaSession.cpp#L377-L390
>> 4. There are also tests that explicitly verify that calling play() on one 
>> video element pauses all others: 
>>     a) 
>> https://github.com/WebKit/WebKit/blob/main/LayoutTests/media/video-concurrent-playback-expected.txt;
>>     b) 
>> https://github.com/WebKit/WebKit/blob/main/LayoutTests/media/video-multiple-concurrent-playback-expected.txt.
>> 
>> To demonstrate the issue, I’ve created a test page:
>> https://mstyura.github.io/webkit-issues/audible-video-concurrent-playback/index.html
>> 
>> It contains 4 HLS video elements and two buttons: “Play All” and “Pause All.”
>> Clicking “Play All” results in only one video playing effectively. Repeating 
>> the action multiple times shows that behavior is non-deterministic.
>> 
>> There’s also a “workaround mode” that starts all videos muted. In that case, 
>> all 4 videos initially play—but later WebKit sometimes detects concurrent 
>> playback (during media element time updates from 
>> HTMLMediaElement::updatePlayState 
>> https://github.com/WebKit/WebKit/blob/156848f5d55261b92551457dec064ff946ca45b9/Source/WebCore/html/HTMLMediaElement.cpp#L6398)
>>  and starts pausing them again. 
>> This leads to the observed ping-pong effect between JavaScript and WebKit.
>> 
>> Demo source: 
>> https://github.com/mstyura/WebKit-Issues/blob/main/audible-video-concurrent-playback/index.html
>> 
>> My question is:
>> Is this behavior still considered desirable in 2025, especially given that 
>> developers can bypass it with more complex (but less power-efficient) 
>> workarounds like WebCodecs + <canvas> or/and VideoTrackGenerator + 
>> AudioContext.createMediaStreamDestination()?
>> 
>> Thanks again for your time and insights!
>> 
>> On Wed, Apr 30, 2025 at 2:28 PM Jean-Yves Avenard 
>> <jean-yves.aven...@apple.com <mailto:jean-yves.aven...@apple.com>> wrote:
>>> 
>>> 
>>>> On 30 Apr 2025, at 9:57 pm, Yury Yarashevich via webkit-dev 
>>>> <webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>> wrote:
>>>> 
>>>> Hi WebKit team,
>>>> 
>>>> I’m curious about the original rationale behind the restriction that 
>>>> prevents concurrent playback of multiple <video> elements. Was it 
>>>> primarily introduced to save battery life?
>>>> 
>>> 
>>> I’m not aware of any such restrictions.
>>> 
>>> Here is a test page that will literally let you play hundreds of video 
>>> elements at the same time.
>>> 
>>> It works on any Apple devices: iPhone, iPad, Vision Pro, Mac .
>>> 
>>>> In practice, this behavior appears to have unintended side effects. 
>>>> There’s a reproducible issue where playback can be started with the video 
>>>> muted and then immediately unmuted, effectively bypassing the restriction. 
>>>> However, this often results in videos being randomly paused 
>>>> later—sometimes very frequently—leading to a “play/pause ping-pong” 
>>>> between Safari/WebKit and JavaScript restarting playback. This erratic 
>>>> behavior may actually increase battery consumption, despite appearing to 
>>>> work smoothly from the user’s perspective.
>>>> 
>>> Are you referring to audible video elements requiring a user gesture for 
>>> playback to start?
>>> 
>>> This behaviour isn’t erratic and is well defined and and up to know I 
>>> thought it was well understood. For an audible element to play, the user 
>>> needs to first interact with the video element such as clicking on the 
>>> video or its controls.
>>> This behaviour is even defined through HTML5 specifications including how 
>>> you can detect if the User Agent will allow video to start autoplaying 
>>> without a user gesture.
>>> 
>>> Similar policies are implemented by other user agents such as Firefox and 
>>> Chrome.
>>> There’s an article on MDN on how to deal with them
>>> <mdn-social-share.d893525a4fb5fb1f67a2.png>
>>> Autoplay guide for media and Web Audio APIs - Media technologies on the web 
>>> | MDN
>>> developer.mozilla.org
>>>  
>>> <https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Autoplay>Autoplay
>>>  guide for media and Web Audio APIs - Media technologies on the web | MDN 
>>> <https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Autoplay>
>>> developer.mozilla.org 
>>> <https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Autoplay>
>>> Here is a more WebKit-focus article
>>> Auto-Play Policy Changes for macOS
>>> webkit.org
>>> <apple-touch-icon-precomposed.png>
>>>  
>>> <https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/>Auto-Play 
>>> Policy Changes for macOS 
>>> <https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/>
>>> webkit.org 
>>> <https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/>       
>>> <apple-touch-icon-precomposed.png> 
>>> <https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/>
>>> 
>>> Here is a similar article written by the Chrome team on the same topic
>>> 
>>> <liam-neeson-will-find-a2c50097288a9.jpeg>
>>> Autoplay policy in Chrome  |  Blog  |  Chrome for Developers
>>> developer.chrome.com
>>>  <https://developer.chrome.com/blog/autoplay/>Autoplay policy in Chrome  |  
>>> Blog  |  Chrome for Developers <https://developer.chrome.com/blog/autoplay/>
>>> developer.chrome.com <https://developer.chrome.com/blog/autoplay/>Here is 
>>> the HTML5 specifications related to this matter
>>> 
>>> HTML Standard
>>> spec.whatwg.org
>>> 
>>>  
>>> <https://html.spec.whatwg.org/multipage/media.html#eligible-for-autoplay>HTML
>>>  Standard 
>>> <https://html.spec.whatwg.org/multipage/media.html#eligible-for-autoplay>
>>> spec.whatwg.org 
>>> <https://html.spec.whatwg.org/multipage/media.html#eligible-for-autoplay>   
>>>  <https://html.spec.whatwg.org/multipage/media.html#eligible-for-autoplay>
>>>> Even if this workaround is eventually blocked, developers who rely on 
>>>> concurrent playback (e.g., outside of WebRTC contexts) will turn to more 
>>>> complex solutions, such as decoding video and audio using WebCodecs or/and 
>>>> WebAssembly, and rendering via <canvas> and AudioContext. While 
>>>> technically feasible, these approaches are likely to be significantly less 
>>>> power-efficient than simply allowing multiple <video> elements to play 
>>>> concurrently.
>>>> Another similarly inefficient workaround would be to synthesize a 
>>>> MediaStream using the VideoTrackGenerator API and 
>>>> AudioContext.createMediaStreamDestination().
>>>> 
>>>> Lastly, another issue is that creating a MediaElementSource from a <video> 
>>>> element and routing its audio through a shared AudioContext also does not 
>>>> disable the playback restriction—whereas it is disabled when the <video> 
>>>> element itself is muted. This feels inconsistent and may point to a 
>>>> separate bug.
>>>> 
>>>> Could you please clarify the motivation behind this restriction, and 
>>>> whether there are any plans to revisit or improve its behavior?
>>>> 
>>> 
>>> I believe I answered this question above, and through the various links 
>>> provided.
>>> 
>>> 
>>> Cheers
>>> JY

_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to