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"`)
我認為這有好處。
添加回答
舉報