为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

皈依舞 2022-08-18 10:08:27
正如我所看到的,我们可以将本机HTMLAudioElement与,从Node提供文件或流.js并让本机播放器使用它并产生声音。src我们还可以将其拆分为块(HLS / RTMP),并与JavaScript播放器一起使用它们,该播放器可以像hls.js或mediaelement一样使用它。这将有助于长音频文件(可能很重),因此我们可以在拥有所有内容之前开始播放。我还看到了一个使用websockets的有趣项目。还有哪些其他方法?每种方法的优缺点是什么?这些是否属于能够加密所提供内容的“优点”?
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

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


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,只需挂接到来自 FS 的读取函数即可)。res.writereadStream


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


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


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


编辑


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


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


查看完整回答
反对 回复 2022-08-18
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我在一个音乐流媒体平台上工作。我们必须提供多达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"`)

我认为这有好处。


查看完整回答
反对 回复 2022-08-18
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号