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



在我看来,我们可以将本机HTMLAudioElement与src一起使用,从Node提供文件或流.js并让本机播放器使用它并产生声音。

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

还有什么其他方法? 每种方法的优缺点是什么? 这些中的任何一个是否能够加密所提供内容的"优点"?

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

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,客户端请求视频块,服务器使用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 项目。它是一个视频解析器,可让您将视频拆分为缓冲区块(并获取缓冲区的长度!这应该有助于拆分和流式传输缓冲区。

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

我在音乐流媒体平台上工作。我们必须提供多达 1-2 GB 的音频文件作为流。所以我这样做了。使用ffmpeg库格式化上传的音频。FFMPEG 应安装在您的计算机上。

require('child_process').exec(`ffmpeg -y -i ${dir_str} -codec copy -bsf:v h264_mp4toannexb -map 0 -f segment -segment_time 10 -segment_format mpegts -segment_list "${m3u8_path}/${soundId}.m3u8" -segment_list_type m3u8 "${m3u8_path}/ts%d.ts"`)

我认为这有加密的优点。

最新更新