2 回答

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

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"`)
我认为这有好处。
添加回答
举报