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

标签 javascript html audio youtube

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

最佳答案

2022 年更新

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

2021 年更新

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

这是一个使用公共(public) Google 图像代理的示例(但您可以使用任何免费或您自己的 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>

并非对所有视频都有效,很大程度上取决于获利设置或类似设置。

关于javascript - 如何使用 HTML 5 仅播放 Youtube 视频的音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690255/

相关文章:

javascript - 缩放 fabric js Canvas 及其所有对象

java - 声音将在 Eclipse 中播放,但不会在导出的 jar 文件中播放

javascript - 水平菜单不显示

javascript - 为什么某些 JavaScript 函数使用共轭名称而不是其他函数?

javascript - 避免 "undo"表单上的后退按钮历史记录条目

android - 循环播放音频文件的问题

html - 2013年常见的html5音频格式?

javascript - 自定义 Y 轴标签并在 d3 中打勾

javascript - 使用 .parent 选择 div

javascript - 向下滚动时标题褪色 - 也适用于向上滚动