如何使用 HTML 5 仅播放 Youtube 视频的音频?

新手上路,请多包涵

是否可以使用 HTML 5 和 Javascript 仅播放 YouTube 视频中的音频?

原文由 user979830 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 643
2 个回答

嵌入视频播放器并使用 CSS 隐藏视频。如果操作得当,您甚至可以只隐藏视频而不隐藏其下方的控件。

但是,我建议不要这样做,因为这会 违反 YouTube TOS 。如果您真的只想播放音频,请改用您自己的服务器。

原文由 Tom van der Woerdt 发布,翻译遵循 CC BY-SA 3.0 许可协议

2022 年更新

为演示添加了 webm 格式。您始终可以检查控制台日志并添加所需的所有格式。

2021 年更新

您可以解析 Youtube HTML 页面以获取可用于此特定视频的所有流,并提取仅音频流。

这是一个使用公共 Google Image 代理的示例(但您可以使用任何免费或您自己的 CORS 代理):

 var vid = "3r_Z5AYJJd4",
  audio_streams = {},
  audio_tag = document.getElementById('youtube');

fetch("https://images" + ~~(Math.random() * 33) + "-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=" + encodeURIComponent("https://www.youtube.com/watch?hl=en&v=" + vid)).then(response => {
  if (response.ok) {
    response.text().then(data => {

      var regex = /(?:ytplayer\.config\s*=\s*|ytInitialPlayerResponse\s?=\s?)(.+?)(?:;var|;\(function|\)?;\s*if|;\s*if|;\s*ytplayer\.|;\s*<\/script)/gmsu;

      data = data.split('window.getPageData')[0];
      data = data.replace('ytInitialPlayerResponse = null', '');
      data = data.replace('ytInitialPlayerResponse=window.ytInitialPlayerResponse', '');
      data = data.replace('ytplayer.config={args:{raw_player_response:ytInitialPlayerResponse}};', '');

      var matches = regex.exec(data);
      var data = matches && matches.length > 1 ? JSON.parse(matches[1]) : false;

      console.log(data);

      var streams = [],
        result = {};

      if (data.streamingData) {

        if (data.streamingData.adaptiveFormats) {
          streams = streams.concat(data.streamingData.adaptiveFormats);
        }

        if (data.streamingData.formats) {
          streams = streams.concat(data.streamingData.formats);
        }

      } else {
        return false;
      }

      streams.forEach(function(stream, n) {
        var itag = stream.itag * 1,
          quality = false;
        console.log(stream);
        switch (itag) {
          case 139:
            quality = "48kbps";
            break;
          case 140:
            quality = "128kbps";
            break;
          case 141:
            quality = "256kbps";
            break;
          case 249:
            quality = "webm_l";
            break;
          case 250:
            quality = "webm_m";
            break;
          case 251:
            quality = "webm_h";
            break;
        }
        if (quality) audio_streams[quality] = stream.url;
      });

      console.log(audio_streams);

      audio_tag.src = audio_streams['256kbps'] || audio_streams['128kbps'] || audio_streams['48kbps'];
      audio_tag.play();
    })
  }
});
 <audio id="youtube" autoplay controls loop></audio>

不适用于所有视频,很大程度上取决于获利设置或类似设置。

原文由 350D 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题