2 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
加密音頻/視頻可以由服務(wù)器手動(dòng)完成。理想情況下,使用流。
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)
然后,您可以在大流中將其發(fā)送到客戶端。另一種可能更好的方法是讓客戶端建立一個(gè)WebSocket,客戶端請(qǐng)求視頻塊,服務(wù)器使用將所選部分向下管道傳輸?shù)娇蛻舳?。writeStreams
我用1分鐘的視頻和本地主機(jī)在瀏覽器上運(yùn)行了一個(gè)快速測(cè)試。它只是將視頻通過管道傳輸?shù)娇蛻舳?,沒有限制,并且運(yùn)行良好。我沒有實(shí)現(xiàn)限制,但在偽代碼術(shù)語中,我這樣做的方式是:
客戶:
<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.
服務(wù)器:
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.
}
})
})
這嚴(yán)重簡化了它的實(shí)際工作方式。你需要對(duì)偽代碼進(jìn)行大量改進(jìn),然后才能真正成為一個(gè)可行的選擇。但對(duì)于直播音頻/視頻,這基本上描述了所有后端需求。如果您需要加密,我建議使用此選項(xiàng),但我不知道瀏覽器如何解密它,然后將其塞入音頻元素中。
從 nodejs 流式傳輸?shù)娇蛻舳讼喈?dāng)簡單(使用 express,只需掛接到來自 FS 的讀取函數(shù)即可)。res.writereadStream
Node是為流媒體內(nèi)容而構(gòu)建的,我建議研究他們的原生工具。我沒有研究過你鏈接的庫,但它們似乎是可行的選擇。
我認(rèn)為這一切都取決于你想要多少工具。使用您自己的自定義實(shí)現(xiàn),您可以添加和刪除功能以制作您夢(mèng)寐以求的視頻/音頻播放器。(我相信有一種方法可以像Opus流一樣,降低某些流的質(zhì)量,使某些流花費(fèi)更少的kb / s)。
我認(rèn)為使用預(yù)制庫最適合起步,但是如果您的項(xiàng)目圍繞此流,或者您需要像AES-256之類的東西或任何非正統(tǒng)的東西,我建議您自己實(shí)現(xiàn)。正如我上面所演示的,它很復(fù)雜,但不太難,這要?dú)w功于nodejs。
編輯
我找到了這個(gè)NodeJS項(xiàng)目。它是一個(gè)視頻解析器,可讓您將視頻拆分為緩沖區(qū)塊(并獲取緩沖區(qū)的長度!這應(yīng)該可以幫助您拆分和流式傳輸緩沖區(qū)。
https://github.com/gkozlenko/node-video-lib

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
我在一個(gè)音樂流媒體平臺(tái)上工作。我們必須提供多達(dá)1-2 GB的音頻文件作為流。所以我做了這個(gè)。使用ffmpeg庫來格式化上傳的音頻。ffmpeg 應(yīng)該安裝在您的計(jì)算機(jī)上。
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"`)
我認(rèn)為這有好處。
添加回答
舉報(bào)