问题标签 [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.
javascript - Chrome:播放正在通过 fetch/XHR 下载的视频
我想要实现的是让 Chrome 将视频文件作为数据加载(通过 Fetch API、XHR 等)并<video>
在它仍在下载的同时使用它来播放它,而无需对同一 URL 发出两个单独的请求,也无需等到该文件已完全下载。
ReadableStream
从 Fetch API ( )中获取 a 很容易response.body
,但我找不到将其输入video
元素的方法。我发现我需要一个blob
可以使用MediaSource
对象创建的 URL。但是,SourceBuffer#appendStream
听起来正是需要的方法在 Chrome 中没有实现,因此我无法将流直接连接到MediaSource
对象。
我可能可以分块读取流,从中创建Uint8Array
s 并使用SourceBuffer#appendBuffer
,但这意味着播放不会立即开始,除非块大小非常小。此外,感觉就像手动做所有这些 API 应该能够开箱即用的事情。如果没有其他解决方案,而我走这条路,我应该注意什么?
是否有其他方法可以为 a 创建 blob URL ReadableStream
?或者有没有办法提出fetch
和<video>
分享请求?有这么多新的 API,我很容易错过一些东西。
stream - 使用 ReadableStream 作为请求正文进行获取
我正在尝试将fetch与ReadableStream一起使用。在这个例子中,ReadableStream 应该简单地重复“一些数据...”。
这行不通。Whilepull
执行一次,请求正文中不会发送任何数据。
如何使 ReadableStream(或任何可以写入动态数据的流)可用于 fetch?
或者,如果这还不可能,您能否指出这一点?谢谢你。
注意:这是一个更具体的衍生问题: Method for streaming data from browser to server via HTTP
javascript - 如果 reader.read() Promise 拒绝/错误,reader.read() 再次安全吗?
我的问题涉及对来自ReadableStreamDefaultReader
. 我猜是来自 Promise 的拒绝reader.read()
通常表明获取请求的网络故障(在这种情况下,我猜想继续阅读是不安全的,我应该完全停止使用该阅读器),但也许有可以安全继续阅读的其他可能错误?
那么在我收到 Promise 拒绝后reader.read()
,在哪些情况下我可以继续阅读,在哪些情况下我应该完全废弃阅读器?我是否需要反省错误的类型才能做出决定?
file-upload - 如何在浏览器中流式传输 HTTP POST 请求的正文
大局是我想将录制的音频从浏览器直接上传到谷歌驱动器。
这是一个宠物项目,所以我很乐意使用实验性网络技术。
我目前让浏览器使用MediaDevices.getUserMedia()
WebWorker 从麦克风获取提要并将其编码为 mp3。编码器返回一个rxjs.Observable<Int16Array>
将在订阅时生成编码文件的块。
我想使用可恢复上传来上传文件,最好采用“单一请求”样式。挑战在于上传由编码器生成的文件。
我很感激我可以通过使用他们的“多块”样式并将编码器的结果收集到 Blob 中并按间隔发送它们来实现类似的结果。我的问题是,上传的“实时”越多(块越小),我将发出的 POST 请求就越多。
XMLHttpRequest.send()确实指定我可以提供 ReadableStream 作为正文。但是,这种实验性技术似乎还不支持字节流
javascript - 如何使用 fetch() 和 WhatWG 流获取文件上传进度
注意:我不是在寻找任何替代品。我知道这可以通过 XMLHttpRequest 来完成。我也不关心浏览器支持。我只想了解新的/即将推出的标准。
我有一个 File对象,我可以像这样使用 fetch 上传它:
我怎样才能从中获得上传进度?
据我了解body
, fetch 选项可以是ReadableStream。那么也许有一种方法可以将 File 对象包装到 ReadableStream 并从中获取进度状态?
例如。像这样的东西
谢谢。
javascript - 以最小的延迟从 Icecast 解码 HTTP 音频流
我正在使用 Icecast 从内部麦克风流式传输实时音频,并希望听众的延迟尽可能小。
一个天真的解决方案是简单地访问http://myhostname:8000/my_mountpoint
以获取流,但<audio>
标签在播放之前会进行内部缓冲,并导致相当高的延迟。
当前解决方案:我使用ReadableStreams
API来解码(使用decodeAudioData
Web 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 上工作而另一个不能?
javascript - Firefox v57 可写流
Streams API是一种与浏览器中潜在的无限数据流交互的好方法。ReadableStreams
专门为您提供表示潜在无限数据源的方法;其中“处理”是逐块完成的。
WritableStreams
是这个概念的对偶 - 代表一个可以消耗潜在无限数据块的接收器。此外,还有一个额外的(在 MDN 上未记录)概念称为 a TransformStream
; 这只是两者的结合 - 表示数据的逐块转换。
我的问题很简单——当 Chrome 甚至 IE edge 都支持它时,为什么 Firefox 会放弃实现 WritableStream API?不实施它是否有特定的哲学原因?特别是流的变体(显然ByteStream
在规范中没有完全充实)我觉得很可疑。
javascript - 手动出错 ReadableStream 或 TransformStream 会导致错误被记录为未捕获的错误
当调用ReadableStreamDefaultController.error或TransformStreamDefaultController.error
使用 Error 对象手动错误输出流时,错误会在调用站点的浏览器控制台中记录为未捕获的错误,就好像.error()
方法本身正在重新抛出错误一样喂。
以下带有 ReadableStream 源和 WritableStream 目标的简短片段展示了该问题,但是,stackoverflow 片段控制台似乎无法记录错误(检查浏览器控制台,在 Chrome 80 上):
从错误信息来看,这可能是某处被拒绝的承诺,但我不知道在哪里。奇怪的是,尝试使用以下侦听器观察这个未捕获的错误也没有效果:
我会考虑abort
在目标 WritableStream 上定义该方法标记该流已启用错误处理,但该错误仍被记录为未捕获的错误(奇怪的是,该abort
方法同时被调用)。
对我来说,这个错误似乎完全无害,但确实很烦人。
我该如何摆脱它?在事物周围添加 atry ... catch
不会做任何事情。
javascript - 如何在不锁定正文流的情况下知道提取何时结束?
我正在向 API 发出请求,但他们的服务器只允许一定数量的活动连接,所以我想限制正在进行的提取次数。出于我的目的,只有在 HTTP 响应正文到达客户端时才完成(而不是正在进行)提取。
我想创建一个这样的抽象:
这会使事情变得更简单,但似乎无法知道其他代码使用的流何时结束,因为流在被读取时被锁定。可以使用ReadableStream.tee()
将流分成两部分,使用一个并将另一个返回给调用者(可能还Response
用它构造一个),但这会降低性能,对吗?
javascript - Streams API:可以撤消 .pipeTo()?
Streams API提供了一种将a管道ReadableStream
传输到WritableStream
using的简洁方法readableStream.pipeTo(writableStream)
。这似乎比获取readableStream.getReader()
并手动将其粘贴到writableStream.getWriter()
或直接粘贴到底层功能更方便。
我有一个用例,我提供了一个ReadableStream
最终可能需要“离开”并被新对象替换的ReadableStream
对象。最好使用单个自定义WritableStream
来包装这些ReadableStream
对象与之交互的功能,并根据需要将它们管道在一起,但还没有找到如何“撤消”管道过程。
问:是否可以“撤消”/“中断”/“拆除”使用创建的管道.pipeTo()
,或者管道是否“永久”且不适合此用例?
使用Serial API的示例,我希望能够在其中doConnectPort()
重复调用doDisconnectPort()
:
目前,我手动将东西粘合在一起并在需要断开端口时进行清理: