RTVBP 类型脚本 SDK
@babelforce/rtvbp 是生成的 RTVBP 协议表面外加节点.js 的手写运行时间
和永恒的浏览器。 根导出为平台中立. 导入运输和浏览器介质
仅从其专用切入点:
import {
Handler,
Session,
babelforceV1,
classicV1,
profileMediaFormat,
profiles,
} from "@babelforce/rtvbp";
import {
BrowserAudioDevice,
BrowserWebRtcTransport,
babelforceBearerSubprotocols,
browserWebRtcTransport,
browserWebSocketTransport,
} from "@babelforce/rtvbp/browser";
导入 @babelforce/rtvbp/node 仅来自节点入口; 浏览器模块和示例永远不会
解决其节点内置或 ws 依赖性.
以下片段假设生成的应用程序执行 VoiceHandler 财务报告和审定财务报表
VoiceEventHandler 合同名称 voiceHandler 财务报告和审定财务报表 voiceEvents编辑
公共类型脚本快速启动
显示每种所需方法的完全最低限度实施.
从 npm 公共登记册安装 :
npm install @babelforce/rtvbp
浏览器音频
BrowserAudioDevice 明确拥有它创造的资源。 它要求一个麦克风轨道,
启动一个 AudioContext,运行抓取和播放 AudioWorklet状态
设备速率 QQ 8 kHz 转换为 WebSocket 音频, 限制播放, 并停止其音轨和
上下文 close()。 。 。 .
对于 rtvbp.v1,配置生成的配置格式,并在处理器后附加适配器
接受音频 :
const device = new BrowserAudioDevice();
const format = profileMediaFormat(profiles.PROFILE_RTVBP_V1, "audio");
const handler = new Handler({
adapter: babelforceV1.voiceAdapter(voiceHandler, voiceEvents),
onBegin: async (context) => {
await context.acceptAudio();
await device.attachWebSocket(context.audio);
},
});
const session = new Session({
envelope: classicV1.classicV1Envelope,
handler,
transportFactory: browserWebSocketTransport({
url: "wss://voice.example/rtvbp",
audioFormat: format,
}),
});
const running = session.run();
try {
await session.ready;
// In the generated audio.buffer.clear handler:
const removedBytes = device.clearPlayback();
await running;
} finally {
await session.close().catch(() => {});
await device.close();
}
从一个用户手势( 如呼叫按钮) 启动会话 。 有些浏览器不会恢复
创建 AudioContext 用于从背景调用麦克风/讲机的工作; 自动播放失败
报告为 media_autoplay。 。 。 .
rtvbp.v1 携带精确的 L16/8000/16- bit/mono/20 ms 帧作为 WebSocket 二进制
留言。 适配器转换浏览器 Float32 音频之间不重设重印相
工作块.
对于 rtvbp.webrtc.v1,将同一设备传递给本地的 WebRTC 运输:
const device = new BrowserAudioDevice();
const session = new Session({
envelope: classicV1.classicV1Envelope,
handler: new Handler({
adapter: babelforceV1.voiceAdapter(voiceHandler, voiceEvents),
onBegin: async (context) => await context.acceptAudio(),
}),
transportFactory: browserWebRtcTransport({
url: "wss://voice.example/rtvbp",
audioDevice: device,
rtcConfiguration: {
iceServers: [{ urls: "stun:stun.example:3478" }],
},
}),
});
const running = session.run();
try {
await session.ready;
const transport = session.transport;
if (!(transport instanceof BrowserWebRtcTransport)) {
throw new Error("WebRTC transport was not selected");
}
const report = await transport.getStats();
await running;
} finally {
await session.close().catch(() => {});
await device.close();
}
浏览器拥有ICE,DTLS,SRTP,捕获,渲染和PCMU. RTVBP控制仍为经典
webSocket上的信封文本 。 信号仍为一带式、完整式、非三角形
transport.webrtc.offer 请求和相互关联的答复。 原始内容 session.audio.read() 编号 : write() 为:
因此无法用于浏览器本地 WebRTC; 使用 BrowserAudioDevice 以及运输统计.
目前被冻结的装订允许双向音频轨道, PCMU/8000/1 仅限, 没有微调的 ICE, 没有重新谈判,也没有重启 ICE 。 明确供应STUN/TURN配置;SDK包含无 默认服务或证书.
浏览器认证
本地浏览器 WebSocket 无法设置 Authorization 升级标题 。 认证仍然是
部署问题:
- 同源饼干由浏览器发送;
- 当部署政策允许时,可将查询参数列入调用人提供的URL;
- 可应用注入的套接字执行
headers在本地浏览器之外; - bailforce浏览器的部署可以使用下面的明确帮助.
function authenticatedTransport(url: string, oauthAccessToken: string) {
return browserWebSocketTransport({
url,
protocols: babelforceBearerSubprotocols(
profiles.PROFILE_RTVBP_V1,
oauthAccessToken,
),
audioFormat: profileMediaFormat(profiles.PROFILE_RTVBP_V1, "audio"),
});
}
帮助者发布 RTVBP 简介,然后是 bearer.<base64url(UTF-8 token)>,没有铺垫.
接受端点会解码无记名载体,但只回放选定的RTVBP配置. 使用
wss://浏览器 Origin,尽可能在 URL 和 日志中保留符号,永远不要
将证书放入申请包.
内容安全政策
默认音频适配器创建短寿命 blob: AudioWorklet 模块并取消其 URL
装入后。 有了更严格的CSP, 自动主机字符串返回
browserAudioWorkletModuleSource() 并传递其信任的同源 URL 与 workletModuleUrl。 。 。 .
节点.js
节点 22 或 更新器可以直接注入升级头 :
import { nodeWebSocketTransport } from "@babelforce/rtvbp/node";
function authenticatedNodeTransport(token: string) {
return nodeWebSocketTransport({
url: "wss://voice.example/rtvbp",
headers: { authorization: `Bearer ${token}` },
});
}
节点入口也出口 NodeWebSocketServer;支持两个生成的角色
客户端和服务器会话.