问题标签 [whatwg-streams-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3305 浏览

javascript - Chrome:播放正在通过 fetch/XHR 下载的视频

我想要实现的是让 Chrome 将视频文件作为数据加载(通过 Fetch API、XHR 等)并<video>在它仍在下载的同时使用它来播放它,而无需对同一 URL 发出两个单独的请求,也无需等到该文件已完全下载。

ReadableStream从 Fetch API ( )中获取 a 很容易response.body,但我找不到将其输入video元素的方法。我发现我需要一个blob可以使用MediaSource对象创建的 URL。但是,SourceBuffer#appendStream听起来正是需要的方法在 Chrome 中没有实现,因此我无法将流直接连接到MediaSource对象。

我可能可以分块读取流,从中创建Uint8Arrays 并使用SourceBuffer#appendBuffer,但这意味着播放不会立即开始,除非块大小非常小。此外,感觉就像手动做所有这些 API 应该能够开箱即用的事情。如果没有其他解决方案,而我走这条路,我应该注意什么?

是否有其他方法可以为 a 创建 blob URL ReadableStream?或者有没有办法提出fetch<video>分享请求?有这么多新的 API,我很容易错过一些东西。

0 投票
1 回答
9195 浏览

stream - 使用 ReadableStream 作为请求正文进行获取

我正在尝试将fetchReadableStream一起使用。在这个例子中,ReadableStream 应该简单地重复“一些数据...”。

这行不通。Whilepull执行一次,请求正文中不会发送任何数据。

如何使 ReadableStream(或任何可以写入动态数据的流)可用于 fetch?

或者,如果这还不可能,您能否指出这一点?谢谢你。

注意:这是一个更具体的衍生问题: Method for streaming data from browser to server via HTTP

0 投票
1 回答
68 浏览

javascript - 如果 reader.read() Promise 拒绝/错误,reader.read() 再次安全吗?

我的问题涉及对来自ReadableStreamDefaultReader. 我猜是来自 Promise 的拒绝reader.read()通常表明获取请求的网络故障(在这种情况下,我猜想继续阅读是不安全的,我应该完全停止使用该阅读器),但也许有可以安全继续阅读的其他可能错误?

那么在我收到 Promise 拒绝后reader.read(),在哪些情况下我可以继续阅读,在哪些情况下我应该完全废弃阅读器?我是否需要反省错误的类型才能做出决定?

0 投票
0 回答
420 浏览

file-upload - 如何在浏览器中流式传输 HTTP POST 请求的正文

大局是我想将录制的音频从浏览器直接上传到谷歌驱动器。

这是一个宠物项目,所以我很乐意使用实验性网络技术。

我目前让浏览器使用MediaDevices.getUserMedia()WebWorker 从麦克风获取提要并将其编码为 mp3。编码器返回一个rxjs.Observable<Int16Array>将在订阅时生成编码文件的块。

我想使用可恢复上传来上传文件,最好采用“单一请求”样式。挑战在于上传由编码器生成的文件。

我很感激我可以通过使用他们的“多块”样式并将编码器的结果收集到 Blob 中并按间隔发送它们来实现类似的结果。我的问题是,上传的“实时”越多(块越小),我将发出的 POST 请求就越多。

XMLHttpRequest.send()确实指定我可以提供 ReadableStream 作为正文。但是,这种实验性技术似乎还不支持字节流

0 投票
2 回答
6961 浏览

javascript - 如何使用 fetch() 和 WhatWG 流获取文件上传进度

注意:我不是在寻找任何替代品。我知道这可以通过 XMLHttpRequest 来完成。我也不关心浏览器支持。我只想了解新的/即将推出的标准。

我有一个 File对象,我可以像这样使用 fetch 上传它:

我怎样才能从中获得上传进度?

据我了解body, fetch 选项可以是ReadableStream。那么也许有一种方法可以将 File 对象包装到 ReadableStream 并从中获取进度状态?

例如。像这样的东西

谢谢。

0 投票
3 回答
3140 浏览

javascript - 以最小的延迟从 Icecast 解码 HTTP 音频流

我正在使用 Icecast 从内部麦克风流式传输实时音频,并希望听众的延迟尽可能小。

一个天真的解决方案是简单地访问http://myhostname:8000/my_mountpoint以获取流,但<audio>标签在播放之前会进行内部缓冲,并导致相当高的延迟。

当前解决方案:我使用ReadableStreamsAPI来解码(使用decodeAudioDataWeb Audio API)并通过将解码后的数据路由到音频上下文目标(内部扬声器)来播放数据块。这有效并显着降低了延迟。

问题:这个流 API 虽然是实验性的,但在技术上应该可以在最新的 Chrome、Safari、Opera、FF 上运行(在设置特定标志之后)。decodeAudioData但是,除了 Chrome 和 Opera 之外,我在所有其他浏览器中都遇到了问题。我认为 FF 和 Safari 无法解码部分 MP3 数据,因为当我开始流式传输时,我通常会听到扬声器的短暂激活。在 Safari 上,decodeAudioData从不调用成功的回调,FF 只是说EncodingError: The given encoding is not supported.

如果我想至少让它在 Safari 和 FF 上工作,有什么解决方法吗?Chrome 和 Safari 上的decodeAudioData实现实际上是否不同,以至于一个可以在部分 MP3 上工作而另一个不能?

0 投票
1 回答
263 浏览

javascript - Firefox v57 可写流

Streams API是一种与浏览器中潜在的无限数据流交互的好方法。ReadableStreams专门为您提供表示潜在无限数据的方法;其中“处理”是逐块完成的。

WritableStreams是这个概念的对偶 - 代表一个可以消耗潜在无限数据块的接收器此外,还有一个额外的(在 MDN 上未记录)概念称为 a TransformStream; 这只是两者的结合 - 表示数据的逐块转换。

我的问题很简单——当 Chrome 甚至 IE edge 都支持它时,为什么 Firefox 会放弃实现 WritableStream API?不实施它是否有特定的哲学原因?特别是流的变体(显然ByteStream在规范中没有完全充实)我觉得很可疑。

0 投票
1 回答
179 浏览

javascript - 手动出错 ReadableStream 或 TransformStream 会导致错误被记录为未捕获的错误

当调用ReadableStreamDefaultController.errorTransformStreamDefaultController.error使用 Error 对象手动错误输出流时,错误会在调用站点的浏览器控制台中记录为未捕获的错误,就好像.error()方法本身正在重新抛出错误一样喂。

以下带有 ReadableStream 源和 WritableStream 目标的简短片段展示了该问题,但是,stackoverflow 片段控制台似乎无法记录错误(检查浏览器控制台,在 Chrome 80 上):

从错误信息来看,这可能是某处被拒绝的承诺,但我不知道在哪里。奇怪的是,尝试使用以下侦听器观察这个未捕获的错误也没有效果:

我会考虑abort在目标 WritableStream 上定义该方法标记该流已启用错误处理,但该错误仍被记录为未捕获的错误(奇怪的是,该abort方法同时被调用)。

对我来说,这个错误似乎完全无害,但确实很烦人。

我该如何摆脱它?在事物周围添加 atry ... catch不会做任何事情。

0 投票
1 回答
230 浏览

javascript - 如何在不锁定正文流的情况下知道提取何时结束?

我正在向 API 发出请求,但他们的服务器只允许一定数量的活动连接,所以我想限制正在进行的提取次数。出于我的目的,只有在 HTTP 响应正文到达客户端时才完成(而不是正在进行)提取。

我想创建一个这样的抽象:

这会使事情变得更简单,但似乎无法知道其他代码使用的流何时结束,因为流在​​被读取时被锁定。可以使用ReadableStream.tee()将流分成两部分,使用一个并将另一个返回给调用者(可能还Response用它构造一个),但这会降低性能,对吗?

0 投票
1 回答
299 浏览

javascript - Streams API:可以撤消 .pipeTo()?

Streams API提供了一种将a管道ReadableStream传输到WritableStreamusing的简洁方法readableStream.pipeTo(writableStream)。这似乎比获取readableStream.getReader()并手动将其粘贴到writableStream.getWriter()或直接粘贴到底层功能更方便。

我有一个用例,我提供了一个ReadableStream最终可能需要“离开”并被新对象替换的ReadableStream对象。最好使用单个自定义WritableStream来包装这些ReadableStream对象与之交互的功能,并根据需要将它们管道在一起,但还没有找到如何“撤消”管道过程。

问:是否可以“撤消”/“中断”/“拆除”使用创建的管道.pipeTo(),或者管道是否“永久”且不适合此用例?

使用Serial API的示例,我希望能够在其中doConnectPort()重复调用doDisconnectPort()

目前,我手动将东西粘合在一起并在需要断开端口时进行清理: