17 · 引擎适配器全景:HLS/DASH/Vimeo/Mux/Cast

地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 空间智能实验室 Vol.19:地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 「把这块区域导成一张带地理坐标的高清图」是个很朴素的需求,但朴素不等于简单。你要在浏览器里框一个框、画几个箭头标个文字、叠一层 阅读详情

这篇讲 media/src/dom/ 下的引擎适配器全景。v10 怎么把 hls.js、dash.js、Vimeo、Google Cast 这些五花八门的播放源,统一塞进前面讲的能力契约和主机模型?答案是两种集成模式。看懂这两种模式,你就理解了 v10 的「异质媒体源」支持是怎么落地的。

两种集成模式

我读完所有适配器后发现,它们分成两种截然不同的集成方式:

模式谁用怎么做
Host-subclass(主机子类)hls-js, native-hls, dash, vimeo继承 HTMLVideoElementHost,重写 src/attach/detach 驱动 JS 引擎
Component/override(组件覆盖)google-cast是个 MediaComponent,靠 targetOverride 逐个属性接管

下面分别看。

Host-subclass 模式

hls.js 适配器

hls-js/media.ts:56:

export class HlsJsMedia extends HTMLVideoElementHost implements HlsMediaProps {
  #delegate: HlsJsOnlyMedia | NativeHlsMedia | null;
  // ...
}

它继承 HTMLVideoElementHost,持有一个 #delegate——根据特性支持在 hls.js MSE 播放和原生 Safari HLS 之间选择(HlsJsOnlyMedia 和 NativeHlsMedia,L6-8)。这是最丰富的适配器,有 live/stream-type/media-tracks/metadata-tracks/text-tracks/preload/airplay-bridge/errors 一堆文件。

配置命名空间是 HlsMediaConfig extends MediaConfig(L37-41),带 preferPlayback/contentType/hlsJs 子键。

native-hls(Safari 原生)

native-hls/media.ts:24:

export class NativeHlsMediaBase extends HTMLVideoElementHost
  implements Omit<NativeHlsMediaProps, 'streamType'> {
  // ...
}

它重写 src(L36-43)、preload(L46-53)、attach(L55-60)直接设 target.src——Safari 原生支持 HLS,不需要 JS 引擎。engine 返回 null(L32-34,注释说「Native HLS 没有 JS 引擎」)。

最终的 NativeHlsMedia(L63-65)通过三个 mixin 组合直播、流类型、错误处理:

NativeHlsMediaLiveMixin(NativeHlsMediaStreamTypeMixin(NativeHlsMediaErrorsMixin(base)))

这种 mixin 套娃是 v10 组合功能点的常见手法——每个 mixin 加一种能力。

dash.js 适配器

dash/media.ts:14-19:

export const DashMediaBase = MediaTracksMixin(HTMLVideoElementHost);
export class DashMedia extends DashMediaBase
  implements MediaEngineHost<dashjs.MediaPlayerClass, HTMLVideoElement>, DashMediaProps {
  // ...
}

它先用 MediaTracksMixin 给 host 加轨道能力,然后构建 dashjs.MediaPlayer().create() 引擎(L25),重写 attach/detach 调 engine.attachView(target)(L29-38),destroy(L40-44)先销毁引擎再销毁 host。

这是 MediaTracksMixin 如何通过 host 机制添加 targetOverride 轨道/rendition 的范例——dash.js 的轨道 API 和原生不同,靠 mixin 适配进契约。

Vimeo 适配器(最特殊)

vimeo/media.ts:49:

export const VimeoMediaBase = MediaPlayedRangesMixin(EventTarget);

Vimeo 不继承 HTMLVideoElementHost——它直接从 EventTarget 构建,包装 @vimeo/player 的 VimeoPlayer iframe API。因为 Vimeo 是通过 postMessage 驱动 iframe 的,没有原生媒体元素。

它定义自己的 VimeoMediaProps(L23-34,大得多的平面状态),完全独立的适配器。这是「异质源」的极端情况——v10 的契约设计让它也能接入,虽然不能继承 host。

Component/override 模式:Google Cast

这是最值得讲的,因为它是「部分能力实现」的典型范例。

google-cast/media.ts:27:

export class GoogleCast implements GoogleCastProps, MediaComponent {
  static readonly configKey = 'googleCast';   // L28
  // ...
}

它是 MediaComponent,不是 host 子类。回忆 15 篇——组件靠 targetOverride 逐个属性接管。Cast 把这套机制用到了极致。

配置键的模块增强

media.ts:21-25:

declare module '../media-host' {
  interface MediaComponentConfig {
    googleCast: GoogleCastProps;
  }
}

通过模块增强把 googleCast 配置键加进类型化的 MediaComponentConfig。这样 <mux-video config='{"googleCast": {...}}'> 的配置是类型安全的——TS 知道 googleCast 字段的存在和形状。

部分能力接管:targetOverride

Cast 的核心是 targetOverride 的动态切换。setMedia(host)(L43-52)初始化时,#override 只暴露 remote:

// media.ts:78-85 简化
#createRemoteOverride() {
  return { get remote() { return this.#remotePlayback; } };
}

不投屏时,host 的 getMediaOwner('remote') 命中 Cast 的 override,其他属性(paused/currentTime/play…)都 fallback 到本地 <video>。所以 Cast 按钮可见,但播放还是本地的。

投屏时(#onStateChange L68-76),#override 被整个 provider 替换:

// 投屏时
this.#override = this.#provider;   // 暴露完整播放接口

现在 host 的 paused/currentTime/play()/pause() 全部解析到远程接收端。本地 <video> 不再直接播放。

这就是「逐个属性地选择进入/退出契约」。Cast 组件不需要继承 host,它只是在投屏时把自己的整个接口暴露成 targetOverride,host 的 getMediaOwner 自动路由过去。

RemotePlayback 的规范实现

google-cast/remote-playback.ts:30:

export class RemotePlayback extends EventTarget {
  // state, watchAvailability, cancelWatchAvailability, prompt
  // 事件 connecting/connect/disconnect
}

这是 W3C RemotePlayback API 的规范一致性实现。文件头(L15-29)明确警告不要加非规范成员——因为代码用类型断言假设它符合 W3C 规范。状态由 GoogleCastProvider 通过 provider.bindHooks({ setState, setAvailable }) 推送(L39-42)。

为什么两种模式

我读的时候琢磨了为什么 Cast 用组件模式而其他用子类模式。区别在于接管粒度:

  • hls.js/dash.js/Vimeo 是全程接管——媒体源从头到尾由它们处理。继承 host、重写 src/attach 是自然的。
  • Google Cast 是条件接管——只有投屏时才接管,不投屏时本地元素照常工作。组件模式让它在「只暴露 remote」和「暴露全部」之间动态切换,子类模式做不到这种粒度。

这套设计让 v10 能同时支持「始终异质」(Vimeo)和「动态切换」(Cast)两类场景。

小结

引擎适配器两种模式,各有适用场景:

  1. Host-subclass(hls-js/native-hls/dash/vimeo)——全程接管,继承 host 重写生命周期。
  2. Component/override(google-cast)——条件接管,靠 targetOverride 逐个属性切换。

带走几个点:

  • mixin 套娃组合功能点(native-hls 三个 mixin 叠加)。
  • 配置键模块增强让配置类型安全。
  • Cast 的动态 targetOverride 是部分能力实现的典范。
  • Vimeo 完全独立(不继承 host),证明契约设计能容纳极端异质源。
  • RemotePlayback 规范实现,不加非规范成员。

下一篇讲媒体轨道和 rendition 列表的实现——v10 怎么在没有原生支持的浏览器里 polyfill 音视频轨道和清晰度列表。

QLIB使用tushare更新每日行情 0. 介绍 qlib每日数据的源是yahoo,更新速度较慢并且不稳定。tushare每日行情是免费接口,速度较快。 1. 获取行情数据,保存为csv格式。 def GetDataFromTushare(self, today, fpath): pro = ts.pro_api() df = pro.daily(trade_date=today) for index, row in df.iterrows(): code = row['ts_code'] 阅读详情

相关推荐

从零到一:YOLOv8在边缘设备上的轻量化部署实战

本文详细介绍了YOLOv8在边缘设备上的轻量化部署实战,涵盖模型优化、TensorRT加速、剪枝与知识蒸馏等关键技术。通过工业质检和智能门禁项目案例,展示了如何将YOLOv8高效部署到树莓派、Jetson Nano等资源受限设备,显著提升推理速度和降低内存占用。文章还提供了动态分辨率调整、多模型级联部署等实用技巧,助力开发者实现边缘AI应用的高效落地。

weixin_29040367的博客 379

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 140

在trae CN中使用conda环境(已解决)

Trae CN 是字节跳动于 2025 年 3 月 3 日发布的国内首个 AI 原生集成开发环境(AI IDE)123。

zwzscnds的博客 6937

Jackson 序列化 / 反序列化注解 完整版笔记

Jackson 序列化 / 反序列化注解 完整版笔记

handsome_sai的博客 272

HC32F460的GPIO重映射实战:如何用3步搞定SPI引脚冲突问题

本文详细介绍了HC32F460的GPIO重映射功能,通过三步操作解决SPI引脚冲突问题。文章解析了HC32F460的FuncGroup功能分组机制,提供了具体的寄存器配置步骤和验证技巧,并对比了与传统方案的性能优势,帮助工程师灵活配置引脚,优化硬件设计。

t4y5u6i7o的博客 918

centos7安装db2 version11.1

centos7安装db2 version11.1

AKA石头 1062

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

【OpenClaw从入门到精通】第11篇:OpenClaw 2026多模态实战全攻略:OCR/语音/图像自动化(附完整代码+双部署方案)

本文聚焦OpenClaw 2026版核心升级的多模态能力,从底层架构原理到实操落地全流程拆解。先解析“统一指令解析+多工具适配器”的核心设计逻辑,再提供阿里云规模化部署(适合批量任务)与本地汉化版部署(适合隐私数据调试)的详细步骤,含依赖安装、配置验证完整操作;随后落地三大高频实战场景——OCR合同信息结构化提取、会议录音自动转写纪要、电商商品图片智能打标,每个场景均提供可直接运行的完整代码、执行结果演示及流程说明;最后补充多模态任务避坑指南、性能优化技巧与成本控制方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2611

MCP 协议会成为前端 AI 工程的标准接口吗?

MCP(Model Context Protocol)正在成为连接 AI 模型与外部工具、数据源的一层通用协议。本文从 MCP 的核心机制出发,分析它在浏览器与前端工程中的落地边界,讨论它能否成为前端 AI 工程的标准接口,并给出当下更务实的架构选择建议。

m0_62937412的博客 336

100 道大数据开发技术原理与实战面试宝典(必过答案详细解析)I

在数字化浪潮席卷全球的今天,大数据开发工程师已成为企业数字化转型的核心力量。无论是互联网巨头的用户行为分析,还是金融机构的风险控制,亦或是智慧城市的数据中枢,都离不开大数据技术的支撑。然而,面对BAT等头部企业严格的面试要求,候选人不仅需要掌握扎实的理论基础,更需具备将技术落地的实战能力。本文基于历年高频面试题与企业真实场景需求,梳理100道必考题目,涵盖基础概念、框架原理、算法设计、性能优化等核心领域,助你构建完整的知识体系,从容应对面试挑战。

AI天才研究院 1386

【2026年华为暑期实习(AI)-6月3日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要: 本文探讨了深度学习与计算机科学中的多个关键概念和技术,包括CUDA双缓冲技术、神经网络训练问题、优化算法、概率模型、Transformer架构特性、量化技术、损失函数选择等。通过20道选择题和多项选择题,涵盖了梯度消失/爆炸、神经元死亡、牛顿迭代法、朴素贝叶斯分类、Adam优化器、KV Cache压缩等核心知识点。特别关注了大模型训练中的计算效率、数值稳定性问题,以及实际应用场景如客服Agent的记忆机制优化。题目设计既考察基础理论(如概率分布、指数分布特性),又结合前沿技术(如MoE架构、注意

m0_73659489的博客 81

LangGraph 本地 build 频频翻车,最终在服务器跑通流式对话

先说结论:我本地那个,一次都没成功过。三次,三次,全挂在拉镜像上。而顺得像刚上过油。这就很像我高中那辆自行车:骑着能走,一上锁就坏。那天晚上我盯着终端里那行红字看了很久,想的不是技术方案,想的是——为什么同一个工具,可以一边让我觉得自己很行,一边让我觉得自己不太行。

人工智能AI技术 97

【图像去噪】基于加权核范数最小化算法实现图像去噪附matlab代码

1 简介 WNNM是一种约束矩阵奇异值稀疏性的低秩算法,在NNM理论基础上增加了核范数权重,有效利用了自然图像的先验信息并提高了核范数的灵活性. 2 部分代码 ​clcclear allclose allnSig = 100;O_Img = double(imread('Monarch.png'));​randn('seed', 0);N_Img = O_Img + nSig* randn(size(O_Img)); ..

qq_59747472的博客 3114

海外平台频繁弹验证?从 DNS、WebRTC 到浏览器指纹的环境异常排查清单

在运营多地区海外平台账号时,即使代理节点通畅、TCP 握手成功,仍可能遇到频繁人机验证、地区限制、播放失败等异常。核心结论是:这类问题往往不在网络传输层,而在浏览器环境参数与网络出口之间的逻辑自洽性。本文从 DNS 泄漏、WebRTC 穿透、时区与语言匹配、Canvas/WebGL 指纹、TLS 特征五个维度,给出一份可复现的环境异常排查清单,并对比个人手动配置与工程化环境管理方案的适用边界。适用于跨境运营、多账号运维团队。

P1Browser【p1指纹浏览器】的博客 183

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 773

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

信号链电路怎么选运放?奥特四款信号链运放解析【选型参考】

在模拟电路设计中,运放作为信号链的“第一道门槛”,其微小误差往往决定了整个系统的成败。

naNa_1120的博客 191

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

流式输出 SSE:实现 AI 对话打字机效果后端开发

摘要解决传统 HTTP 请求在 LLM 长文本生成时导致的客户端长时间阻塞与 TTFT 极高的问题。适用于需为 AI 应用提供打字机效果、优化交互体验的后端开发工程师。读完可获得基于 FastAPI 与 SSE(Server-Sent Events)技术的流式响应实现代码、协议规范及生产环境避坑指南。关键词SSE、流式输出、FastAPI、打字机效果、TTFT、大模型推理背景与问题大模型(LLM)生成完整回复通常耗时数秒至数十秒,传统请求-响应模型导致用户界面长时间无响应,体验极差。

2402_85729970的博客 181

基于 YOLOv8 的森林火灾检测系统(Web 版)

本项目面向林区早期火情识别场景,使用YOLOv8完成火焰(Fire)与烟雾(Smoke)两类目标的检测模型训练,并以FastAPI构建 Web 检测平台,把模型能力封装为可直接登录使用的系统。平台除常规的图片、批量、视频、摄像头检测外,还提供同图多权重对比、数据集浏览与标注核对、模型热切换,以及把训练搬到网页上的能力:可在浏览器配置超参数发起真实训练,训练中在线调整学习率、查看进度与动态曲线,训练完成后下载产物或直接应用到检测。

Michael_Jay的博客 62

身份验证漏洞专题(三):持久登录、密码重置与密码修改中的凭据绑定缺陷

密码登录与双因素认证是身份验证的主干流程,但一个完整的认证体系还依赖三类辅助机制:持久登录("记住我")、密码重置、密码修改。这三类机制的共同特征是:它们同样携带或验证凭据,同样直接决定认证状态的归属,但实现时获得的防护强度往往远低于登录页面本身。攻击者绕不开登录接口时,常常可以从这些辅助入口进入。

2401_85321170的博客 630

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268

Vue 前端开发 AI 对话页面:流式消息渲染、文件上传

关键点是不能手动设置 Content-Type 为 multipart/form-data,必须由浏览器自动生成带有 boundary 的请求头,否则后端无法解析。思路:将对象序列化为 JSON 字符串,作为 FormData 的一个普通字段(如 formData.append(‘payload’, JSON.stringify(data))),后端接收该字段后再反序列化。若上传大文件(>10MB),需实现独立的分片上传接口,在提交对话前先获取文件 id 或 url,再随文本发送引用。移除输入框的禁用态;

2402_85729970的博客 388

在Open-WebUI中提升向量化速度

让Open-WebUI AI聊天的向量化过程不超过10秒,而不是默认的20+分钟……

xyzzklk的博客 574

Writeup 4 0xGame 2021 · command (WEB)

前端限制不可信:永远不要相信前端的任何限制(如disabled按钮、JS 验证等)。攻击者可以直接构造 HTTP 数据包绕过前端校验,所有的安全限制必须在后端实现。命令执行/注入(RCE):Web 应用如果直接调用系统命令且未对输入进行严格过滤,攻击者可以利用;||等符号拼接恶意命令。绕过技巧:在 CTF 中,如果遇到命令执行被过滤,常见的绕过方式包括:${IFS}$IFS$9等。。cat /fla?或cat /fl*。Linux 基础。

hengdonghui的博客 131

使用HTML+CSS+JavaScript实现文件上传弹窗

使用HTML+CSS+JavaScript实现文件上传弹窗

bjzhang75的博客 207

ArkWeb 混合开发的内存清理与桥接陷阱

起初我以为是 H5 内部的定时器没有清理,结果接了 DevEco Studio 的 Profiler 一看,全是 ArkTS 侧的原生对象没有释放。改用 RESIZE 后,键盘弹出只会压缩窗口高度,底部的输入框会自适应滚动到可视区域,页面顶部的元素则岿然不动。综上所述,混合开发绝不是简单的拼接,管好桥接的生命周期,做好跨域兜底,才是稳定运行的前提。如果不去主动干预,它会把你的原生内存吃得连骨头都不剩。在 H5 的输入框打字时,软键盘一弹出来,整个 Web 页面就被顶得飞起,连顶部的原生导航栏都不见了。

2502_91284977的博客 235

热工测点布线改造难题?IDCB 远程 I/O 采集前端简化现场布线

IDCB智能数据采集前端基于Modbus-RTU协议,支持热电偶、热电阻、直流信号多类型混采,单设备多通道接入,减少模块选型压力。双总线冗余设计保障数据连续性,适配锅炉、窑炉等高可靠性工况。采用总线式布线替代点对点接线,大幅减少电缆用量,配合组态软件或LCD面板,实现远程监控与现场调试便捷化。适用于脱硫脱硝、就地监控及系统改造项目,具备抗干扰、隔离保护、掉电存参等特性,有效提升热工测点采集系统的稳定性与运维效率。

wxyzzdh200988的博客 192
上一篇: 16 · `custom-media-element`:属性拦截与转发
下一篇: ZLMediaKit 前端播放器怎么选?xgplayer / DPlayer / ckplayer / ZWPlayer 横向对比
逻辑玩家
博客等级 码龄19年 75粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值