javascript - 从 Node 到浏览器,提供和播放 wav 音频文件的不同方式的优缺点

标签 javascript node.js audio http-live-streaming

<分区>

如我所见,我们可以使用 native HTMLAudioElement使用 src,从 Node.js 提供文件或流,并让本地播放器使用它并产生声音。

我们还可以将它拆分成 block (HLS/RTMP) 并使用可以像 hls.js 这样使用它的 JavaScript 播放器来使用它们或 mediaelement .这在音频文件较长(并且可能很重)的情况下会有所帮助,因此我们可以在拥有所有内容之前开始播放。我还看到了一个有趣的项目using websockets .

还有哪些方法呢?各自的优缺点是什么?这些是否是能够加密所提供内容的“专家”?

最佳答案

加密音频/视频可以由您的服务器手动完成。理想情况下,使用流。

const crypto = require("crypto")
const fs = require("fs")

const browser = getClientConnectionSomehow()

const encryptor = crypto.createCipheriv("aes256", "32 character long string", Buffer.alloc(16))

fs.createReadStream("path/to/video.mp4").pipe(encryptor).pipe(browser)

然后您可以将其以大流的形式发送给客户端。 另一种可能更好的方法是让客户端建立一个 WebSocket,客户端请求视频 block ,服务器使用 writeStreams 将选定的部分通过管道传输到客户端。

我使用 1 分钟的视频和本地主机在我的浏览器上进行了快速测试。它只是将视频通过管道传输到客户端,没有节流,而且效果很好。我没有实现节流,但在伪代码术语中,我会这样做:

客户:

<video src="/path/to/video">

</video>
let video = document.getElement("video")
WebSocket.send((currentVideoBuffer - video.currentTime) >= 10)
// say, we wait until there are 10 seconds left in the video to load the next chunk.

服务器:

http.createServer((req,res) => {
    let stream = fs.createReadStream("path/to/video.mp4")
    WebSocket.on((shouldSend) => {
        if (shouldSend) {
            res.write(stream.read(500000)
            // just a dummy number of bytes. change as needed.
        }
    })
})

这严重过度简化了它的实际工作方式。在它真正成为一个可行的选择之前,您需要对伪代码进行大量改进。但是对于直播音视频来说,这基本上就描述了所有的后端需求。如果您也需要加密,我建议使用此选项,但我不知道浏览器如何解密它,然后将其放入音频元素中。

从 nodejs 到客户端的流式传输相当简单(使用 express,只需将 res.write 连接到 FS 的 readStream 的读取函数即可。)

Node 是为流媒体内容而构建的,我建议研究一下他们的原生工具。我没有查看您链接的库,但它们似乎是可行的选择。

我认为这一切都取决于您需要多少工具。使用您自己的自定义实现,您可以添加和删除功能来制作您梦想中的视频/音频播放器。 (我确信有一种方法,就像 Opus 流一样,可以降低某些流的质量,使某些流的传输速度降低 kb/s)。

我想使用预制库最适合起步,但如果您的项目围绕此流式传输展开,或者您需要 AES-256 之类的东西或任何非正统的东西,我建议您自己实现。正如我在上面所演示的,它很复杂,但并不太难,这要归功于 nodejs。


编辑

我找到了这个 NodeJS 项目。它是一个视频解析器,可让您将视频拆分为缓冲区 block (并获取缓冲区的长度!)。这应该可以帮助您拆分和流式传输缓冲区。

https://github.com/gkozlenko/node-video-lib

关于javascript - 从 Node 到浏览器,提供和播放 wav 音频文件的不同方式的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61833542/

相关文章:

javascript - 链式方法调用不适用于原始元素或克隆元素,为什么?

node.js - 监控 MongoDB "background operations"?

audio - 具有多个输入文件的 ffmpeg 映射

ios - 录制时可以播放音频吗?

javascript - 将列表嵌入为字符串 javascript 的一部分

javascript - 为什么我的 Javascript 程序中的 Array.sort() 方法不稳定?

node.js - 从用户设置动态设置 LESS 变量

java - Maven 无法检测到我的 Node 安装

ios - iOS 上有html5 音频限制,是否可以同时播放背景音乐和音效?

javascript - 如何将js变量发送到Spring Controller ?