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

正如我所看到的,我们可以将本机HTMLAudioElement与,从Node提供文件或流.js并让本机播放器使用它并产生声音。src

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

还有哪些其他方法?每种方法的优缺点是什么?这些是否属于能够加密所提供内容的“优点”?


皈依舞
浏览 143回答 2
2回答

慕桂英4014372

加密音频/视频可以由服务器手动完成。理想情况下,使用流。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) => {&nbsp; &nbsp; let stream = fs.createReadStream("path/to/video.mp4")&nbsp; &nbsp; WebSocket.on((shouldSend) => {&nbsp; &nbsp; &nbsp; &nbsp; if (shouldSend) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.write(stream.read(500000)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // just a dummy number of bytes. change as needed.&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; })})这严重简化了它的实际工作方式。你需要对伪代码进行大量改进,然后才能真正成为一个可行的选择。但对于直播音频/视频,这基本上描述了所有后端需求。如果您需要加密,我建议使用此选项,但我不知道浏览器如何解密它,然后将其塞入音频元素中。从 nodejs 流式传输到客户端相当简单(使用 express,只需挂接到来自 FS 的读取函数即可)。res.writereadStreamNode是为流媒体内容而构建的,我建议研究他们的原生工具。我没有研究过你链接的库,但它们似乎是可行的选择。我认为这一切都取决于你想要多少工具。使用您自己的自定义实现,您可以添加和删除功能以制作您梦寐以求的视频/音频播放器。(我相信有一种方法可以像Opus流一样,降低某些流的质量,使某些流花费更少的kb / s)。我认为使用预制库最适合起步,但是如果您的项目围绕此流,或者您需要像AES-256之类的东西或任何非正统的东西,我建议您自己实现。正如我上面所演示的,它很复杂,但不太难,这要归功于nodejs。编辑我找到了这个NodeJS项目。它是一个视频解析器,可让您将视频拆分为缓冲区块(并获取缓冲区的长度!这应该可以帮助您拆分和流式传输缓冲区。https://github.com/gkozlenko/node-video-lib

慕田峪4524236

我在一个音乐流媒体平台上工作。我们必须提供多达1-2 GB的音频文件作为流。所以我做了这个。使用ffmpeg库来格式化上传的音频。ffmpeg 应该安装在您的计算机上。require('child_process').exec(`ffmpeg&nbsp;-y&nbsp;-i&nbsp;${dir_str}&nbsp;-codec&nbsp;copy&nbsp;-bsf:v&nbsp;h264_mp4toannexb&nbsp;-map&nbsp;0&nbsp;-f&nbsp;segment&nbsp;-segment_time&nbsp;10&nbsp;-segment_format&nbsp;mpegts&nbsp;-segment_list&nbsp;"${m3u8_path}/${soundId}.m3u8"&nbsp;-segment_list_type&nbsp;m3u8&nbsp;"${m3u8_path}/ts%d.ts"`)我认为这有好处。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript