Ich erfasse Opus -Rahmen, die vor der Verschlüsselung von einer Discord Lavalink -Gabel leben und sie auf die Festplatte fallen lassen (und/oder sie über WebSocket streamen). Jedes Paket ist geschrieben als: < /p>
Code: Select all
2‑byte big-endian length (N)
N bytes of Opus payload (48 kHz, ~20 ms per frame, Discord voice compatible)
< /code>
Beispiel Logik Schreiben Sie Logik (Kotlin, mit dem relevanten Teil begegnet): < /p>
override fun retrieveOpusFrame(buf: ByteBuf) {
// Duplicate the buffer to copy bytes for dumping
val ro = buffer.duplicate()
ro.flip()
val len = ro.remaining()
val bytes = ByteArray(len)
ro.get(bytes)
// Send frame to Discord
buf.writeBytes(buffer.flip())
// Dump frame to file: [2-byte big-endian length][Opus payload]
out.write((len ushr 8) and 0xFF)
out.write(len and 0xFF)
out.write(bytes)
}
Die resultierende .OpusDump -Datei ist nur eine Folge von RAW -Opus -Paketen (kein OGG/Webm -Container). Format-Hex ):
Code: Select all
00000000 00 03 FC FF FE 00 03 FC FF FE 00 03 FC FF FE 00
00000010 03 FC FF FE 00 03 FC FF FE 00 03 FC FF FE 00 03
00000020 FC FF FE 00 03 FC FF FE 00 03 FC FF FE 00 03 FC
00000030 FF FE 00 03 FC FF FE 00 03 FC FF FE 00 03 FC FF
Ich möchte dieses Audio in Echtzeit in einem einfachen HTML/JS-Front-End (Chrome/Firefox) abspielen, idealerweise durch Streaming von Paketen auf den Browser, während sie produziert werden. Im Idealfall würde der Browser die Wiedergabe direkt von RAW -OPUS -Frames oder kleinen Webm -Segmenten behandeln.
Ich möchte die serverseitige Konvertierung oder Transkodierung vermeiden. Audio. Browser in Echtzeit? Können sie direkt an Web Audio/WebCodecs gefüttert werden oder müssen sie in einen Container wie WebM gewickelt werden? (SourceBuffer mit Typ 'audio/webm; codecs = opus')? Länge vorgefertigte rohe Opusrahmen direkt, oder wird ein kleiner Demuxer zuerst benötigt? /> Einschränkungen
Front-End: Plain HTML/JS (keine native App).>