You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两个video元素无法共用同一个Blob URL加载视频资源

问题原因

  • Blob URL存在安全上下文绑定:blob:https://odysee.com/xxx 中的域名标记了该Blob所属的页面安全上下文,只有同上下文的代码能访问对应内存对象。如果你的自定义video是在扩展的隔离上下文(如内容脚本独立作用域、扩展弹窗/侧边栏)创建,会无权限读取Blob数据,抛出MIME类型错误。
  • Odysee采用MediaSource Extensions(MSE)加载视频:你拿到的Blob URL指向的是动态分段加载的MediaSource实例,而非完整视频文件,这类流默认仅支持一个消费者,直接赋值给第二个video元素时会因流被锁定/消费完毕无法加载。
  • 站点会主动销毁临时Blob URL:Odysee的播放器逻辑会在特定时机调用URL.revokeObjectURL()回收创建的Blob链接,即使上下文相同也可能出现访问失效的情况。

解决方案

方案一:页面上下文内创建播放器(推荐)

通过内容脚本向Odysee页面注入JS代码,在页面本身的安全上下文内创建自定义video元素,避免跨上下文权限问题:

// 扩展内容脚本执行的注入逻辑
const injectedCode = document.createElement('script');
injectedCode.textContent = `
  // 页面上下文内执行的逻辑
  const originPlayer = document.querySelector('#player-container video');
  const customPlayer = document.createElement('video');
  customPlayer.controls = true;
  customPlayer.style.cssText = 'width: 500px; position: fixed; top: 20px; right: 20px; z-index: 99999;';

  // 优先复用srcObject,兼容性更好
  if (originPlayer.srcObject) {
    customPlayer.srcObject = originPlayer.srcObject;
  } else {
    customPlayer.src = originPlayer.src;
  }

  document.body.appendChild(customPlayer);
`;
document.documentElement.appendChild(injectedCode);
injectedCode.remove();

方案二:抓取原始视频地址绕开Blob

如果上述方案不满足需求,可以通过扩展的webRequest API拦截Odysee的视频请求,拿到真实的MP4/HLS流地址,直接赋值给自定义播放器,完全规避Blob URL的限制。

内容的提问来源于stack exchange,提问作者KevinHJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 03:36:03