Кажется, что Chrome для мобильных устройств все еще требует, чтобы вы обрабатывали это из самого события пользовательского жеста (точно так же, как Safari, кстати) .
К моменту загрузки iframe срок действия вашего пользовательского жеста истечет, и вы не сможете ни автоматически воспроизводить, ни программно воспроизводить <video>
со звуком.
Хотя, , если ваш документ iframe находится в том же домене , это загрузить другой элемент <video>
из основного документа, внутри события пользовательского жеста, чтобы пометить его как пользователя одобрен (вызывая MediaElement.play () ) и после загрузки вашего iframe заменить элемент iframe на этот одобренный пользователем в документе iframe.
btn.onclick = e => { // we must have an user-gesture event
const iframe = document.createElement('iframe'); // your iframe
const frameContent = `<html>
<body>
<video src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm"></video>
</body>
</html>`;
const url = URL.createObjectURL(new Blob([frameContent], {type: "text/html"}));
// Our user-approved <video>
const vid = document.createElement('video');
vid.play().catch(e => null); // mark it as 'user-approved'
vid.autoplay = true;
iframe.onload = e => { // once our iframe have loaded
// swap both elements
const i_vid = iframe.contentDocument.querySelector('video');
i_vid.replaceWith(vid);
vid.src = i_vid.currentSrc;
};
iframe.src = url;
document.body.append(iframe);
};
защищенные iframes StackSnippet сверх- не позволят нам манипулировать этим внутренним фреймом, так что вот live jsfiddle .