DOMException:无法加载,因为找不到支持的源

IT技术 javascript html
2021-03-17 17:51:38

我收到DOMException: Failed to load 因为在 video.play() 中找不到支持的源线。我只有在添加 video.setAttribute('crossorigin', 'anonymous'); 后才会遇到这个问题;我正在移动设备上开发应用程序,因此对于跨源,我需要添加此行。更新 chrome 50 版本后,我在它工作正常之前遇到了这个问题。

<!DOCTYPE html>
    <html>
    <head> 
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    </head> 
    <body>  
    <script>     
     var video = document.createElement( 'video' ); 

     video.id = 'video';    
     video.type = ' video/mp4; codecs="theora, vorbis" ';   
     video.src = "http://abcde.com/img/videos/what_is_design_thinking.mp4"; 
     video.volume = .1; 
     video.setAttribute('crossorigin', 'anonymous');    
     video.load(); // must call after setting/changing source   

     $('body').html(video);
     video.play();  

     var canvas = document.createElement('canvas');
     var ctx = canvas.getContext('2d');

     $('body').append(canvas);

     video.addEventListener('play', function() {
       var $this = this; //cache
       (function loop() {
       if (!$this.paused && !$this.ended) {
       ctx.drawImage($this, 0, 0);
       setTimeout(loop, 1000 / 30); // drawing at 30fps
       }
       })();
      }, 0);

    </script>
    </body> 
    </html>
6个回答

此问题出现在从 v50 开始的较新的 Chrome/Chromium 浏览器中

HTMLMediaElement.play()返回一个Promise谷歌开发者

在网络上自动播放音频和视频是一项强大的功能,并且在不同平台上受到不同限制。今天,大多数桌面浏览器将始终允许通过 JavaScript开始<video><audio>播放网页,而无需用户交互。然而,大多数移动浏览器在 JavaScript 启动的播放发生之前需要明确的用户手势。这有助于确保移动用户(其中​​许多人为带宽付费或可能在公共环境中)不会在没有明确与页面交互的情况下意外开始下载和播放媒体。

历史上很难确定是否需要用户交互才能开始播放,以及检测在(自动)播放尝试和失败时发生的故障。存在各种变通方法,但都不太理想。play()早就应该对底层方法进行改进以解决这种不确定性,现在已经在 Web 平台上进行了改进,并在 Chrome 50 中进行了初步实现。

play()上的一个电话<video><audio>元素现在返回的Promise。如果播放成功,则 Promise 完成,如果播放失败,则 Promise 将被拒绝,并显示一条解释失败的错误消息。这使您可以编写如下直观的代码:

var playPromise = document.querySelector('video').play();

// In browsers that don’t yet support this functionality,
// playPromise won’t be defined.
if (playPromise !== undefined) {
  playPromise.then(function() {
    // Automatic playback started!
  }).catch(function(error) {
    // Automatic playback failed.
    // Show a UI element to let the user manually start playback.
  });
}

除了检测 play() 方法是否成功之外,新的基于 Promise 的接口允许您确定该play()方法何时成功。在某些情况下,Web 浏览器可能会决定延迟开始播放——例如,桌面 Chrome<video>在选项卡可见之前不会开始播放Promise 在播放实际开始then()之前不会执行,这意味着在媒体播放之前,Promise 中的代码不会执行。之前确定是否play()成功的方法,例如等待播放事件的设定时间并假设它没有触发则失败,在延迟播放场景中容易出现误报。

致谢:无法加载,因为找不到支持的源。播放 HTML5 音频元素时

向 play() 添加Promise与问题中的 DOMException 错误无关。这是一个 CORS 问题。
2021-04-17 17:51:38
正如@MichaelFranzl 上面提到的,错误不是因为Promise,当作为源提供的 url 上没有音频时也可能发生错误
2021-05-15 17:51:38

我遇到了同样的错误,结果证明是 CORS 问题。

代替

video.setAttribute('crossorigin', 'anonymous');  

尝试更明确的方式:

video.crossOrigin = 'anonymous';

并确保服务器响应具有 header Access-Control-Allow-Origin: *或者代替星号通配符,指定允许从服务器访问视频的网站的域。

@PerQuestedAronsson 我认为属性名称应该都是小写,Michael 所拥有的似乎是正确的。developer.mozilla.org/en-US/docs/Web/HTML/Element/video
2021-04-20 17:51:38
请注意,在第一个版本中,您设置的是“crossorigin”,而在第二个“crossOrigin”中,Origin 中的大写字母为 O。这可能是造成差异的原因,而不是方法不同。
2021-05-14 17:51:38

我对 mp3 文件有同样的问题。我的解决方案是通过 javascript 向 html 添加内容。

我要在其中放置要播放的文件的 HTML 示例。

<span id="audio"></span>

在 javascript 中:

$('#audio').html('<audio autoplay><source src="audio/ding.mp3"></audio>');

这将播放音频,假设它与视频相同。

希望能帮助到你

我遇到了同样的问题,但原因是文件名包含“#”。

显然,如果文件名包含“#”,net::ERR_FILE_NOT_FOUND如果将 src 直接设置为字符串,我会得到

document.getElementById('audio').src = '../path/x#y.webm';
console.log(document.getElementById('audio').src); // C:\Users\x\y\z\path\x#y.webm

但是DOMException: The element has no supported sources.在使用节点时会得到一个path.resolve即使 html 元素的src属性是相同的

document.getElementById('audio').src = path.resolve('path', 'x#y.webm');
console.log(document.getElementById('audio').src); // C:\Users\x\y\z\path\x#y.webm

重命名文件名以x-y.webm解决问题。

这是在 Windows 上使用电子,在其他操作系统或网络应用程序上可能不是这种情况。

除了重命名文件之外,是否有针对此特定问题的解决方法?谢谢
2021-05-07 17:51:38

我在 VueJS 中遇到了同样的问题。对我有用的是替换:

const audio = new Audio(required('../assets/sound.mp3')) 
audio.play()

和:

import sound from '../assets/sound.mp3'
const audio = new Audio(sound)
audio.play()
这很好用,谢谢!
2021-04-20 17:51:38
在 Vue JS 3 中工作并且工作得非常棒!非常感谢你...
2021-05-03 17:51:38