播放前静音 YouTube 视频

Silent YouTube Video Before It Plays

我创建了一个非常简单的 WebView 浏览器,它将直接从某些 URL 打开 YouTube 视频,比如:https://www.youtube.com/watch?v=someId

我想要的只是默认静音此视频或播放之前(即加载后)。

我试过的是:

String muteScript = "window.onload = function() {\n" + 
                    "var videos = document.querySelectorAll('video'),\n" +
                    "audios = document.querySelectorAll('listen');\n" +
                    "[].forEach.call(videos, function(video) { video.muted = true; });\n" +
                    "[].forEach.call(audios, function(audio) { audio.muted = true; })}";

WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
        @Override
        public void changed(ObservableValue ov, Worker.State oS, Worker.State nS) {
               if (nS == Worker.State.SUCCEEDED) {
                   webEngine.executeScript(muteScript);
               }
        }});

问题是,视频声音正在播放 bit 然后停止。

有没有办法在播放之前静音?


更新

我仍在努力寻找可行的解决方案,但似乎几乎不可能。 不知何故,即使更改每个视频的属性 defaultMuted = true; 也没有任何效果。

值得一提的是,我无论如何都无法将视频静音,除非它严格播放一点(回到正题!)。这就是为什么我的以下解决方法失败了最后一步:

  1. 将 YouTube URL 转换为嵌入式并设置 autoplay=0
  2. 将所有视频的 muted 属性更改为 true
  3. 通过实用地执行 click() 来播放视频!

结果无影响

我还尝试在视频开头触发一个事件 onwaiting 以使其静音。但正如我所提到的,muted = true; 属性似乎严格地使视频 正在播放时静音,或者至少 播放 一点,即使它已暂停.

你尝试过 HTML DOM 静音 属性 吗?

var vid = document.getElementById("videoElementId");
vid.muted = true;

我认为上面的代码会对您有所帮助。或者在下面参考 link https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_video_muted

我试图破解 WebView 的 cookie,看看我是否可以使视频 muted 与其他流行的浏览器相似,因为它们记得用户之前的会话偏好。

从那里,我了解了如何嵌入静音的 YouTube 视频,只需将 mute=1 添加到视频 URL!!

做法如下:

  1. 获取视频 URL。
  2. 将其转换为嵌入式。
  3. autoplay=1&mute=1 添加到 URL 的末尾。

完成!

String convertToEmbed(String url) {
    String pattern = "(?<=watch\?v=|/videos/|embed\/|youtu.be\/|\/v\/|\/e\/|watch\?v%3D|watch\?feature=player_embedded&v=|%2Fvideos%2F|embed%\u200C\u200B2F|youtu.be%2F|%2Fv%2F)[^#\&\?\n]*";
    Pattern compiledPattern = Pattern.compile(pattern);
    Matcher matcher = compiledPattern.matcher(url);
    if (matcher.find()) {
        return "https://www.youtube.com/embed/" + matcher.group() + "?autoplay=1&mute=1";
    }
    return null;
}