如我所见,我们可以使用 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