
Enables high-quality audio compression using the OPUS codec with flexible encoding settings, supporting multiple sample rates, channels, and audio formats, including PCM and floating-point.
A Kotlin Multiplatform library providing OPUS audio codec functionality for Android and iOS platforms.
Add the dependency to your build.gradle.kts:
dependencies {
implementation("io.voxkit:kopus:$kopus_version")
}import io.voxkit.kopus.*
// Create encoder
val encoder = Opus.encoder(
sampleRate = SampleRate.RATE_48K,
channels = Channels.STEREO,
application = OpusApplication.AUDIO
)
// Create decoder
val decoder = Opus.decoder(
sampleRate = SampleRate.RATE_48K,
channels = Channels.STEREO
)
// Encode PCM data
val pcmInput: ShortArray = // your audio samples
val frameSize = 960 // 20ms at 48kHz
val encodedBuffer = ByteArray(OpusEncoder.DEFAULT_OUTPUT_BUFFER_SIZE)
val encodedLength = encoder.encode(pcmInput, frameSize, encodedBuffer)
// Decode back to PCM
val decodedBuffer = ShortArray(frameSize * 2) // 2 channels
val encodedData = encodedBuffer.copyOf(encodedLength)
val decodedSamples = decoder.decode(encodedData, frameSize, decodedBuffer)
// Don't forget to close resources
encoder.close()
decoder.close()SampleRate.RATE_8K (8 kHz)SampleRate.RATE_12K (12 kHz)SampleRate.RATE_16K (16 kHz)SampleRate.RATE_24K (24 kHz)SampleRate.RATE_48K (48 kHz)Channels.MONO - Single channelChannels.STEREO - Two channelsOpusApplication.VOIP - Optimize for voice callsOpusApplication.AUDIO - Optimize for music/general audioOpusApplication.LOW_DELAY - Optimize for low-latency applications// Handle missing packets by passing null data
val missingSamples = decoder.decode(
data = null, // indicates packet loss
frameSize = expectedFrameSize,
pcm = outputBuffer
)// Decode with FEC to recover from errors
val recoveredSamples = decoder.decode(
data = corruptedPacket,
frameSize = expectedFrameSize,
pcm = outputBuffer,
decodeFec = true
)| Platform | Status | Implementation |
|---|---|---|
| Android | ✅ Supported | JNI/NDK with C++ bridge |
| iOS | ✅ Supported | Kotlin/Native cinterop |
Contributions are welcome! Please feel free to submit a Pull Request.
A Kotlin Multiplatform library providing OPUS audio codec functionality for Android and iOS platforms.
Add the dependency to your build.gradle.kts:
dependencies {
implementation("io.voxkit:kopus:$kopus_version")
}import io.voxkit.kopus.*
// Create encoder
val encoder = Opus.encoder(
sampleRate = SampleRate.RATE_48K,
channels = Channels.STEREO,
application = OpusApplication.AUDIO
)
// Create decoder
val decoder = Opus.decoder(
sampleRate = SampleRate.RATE_48K,
channels = Channels.STEREO
)
// Encode PCM data
val pcmInput: ShortArray = // your audio samples
val frameSize = 960 // 20ms at 48kHz
val encodedBuffer = ByteArray(OpusEncoder.DEFAULT_OUTPUT_BUFFER_SIZE)
val encodedLength = encoder.encode(pcmInput, frameSize, encodedBuffer)
// Decode back to PCM
val decodedBuffer = ShortArray(frameSize * 2) // 2 channels
val encodedData = encodedBuffer.copyOf(encodedLength)
val decodedSamples = decoder.decode(encodedData, frameSize, decodedBuffer)
// Don't forget to close resources
encoder.close()
decoder.close()SampleRate.RATE_8K (8 kHz)SampleRate.RATE_12K (12 kHz)SampleRate.RATE_16K (16 kHz)SampleRate.RATE_24K (24 kHz)SampleRate.RATE_48K (48 kHz)Channels.MONO - Single channelChannels.STEREO - Two channelsOpusApplication.VOIP - Optimize for voice callsOpusApplication.AUDIO - Optimize for music/general audioOpusApplication.LOW_DELAY - Optimize for low-latency applications// Handle missing packets by passing null data
val missingSamples = decoder.decode(
data = null, // indicates packet loss
frameSize = expectedFrameSize,
pcm = outputBuffer
)// Decode with FEC to recover from errors
val recoveredSamples = decoder.decode(
data = corruptedPacket,
frameSize = expectedFrameSize,
pcm = outputBuffer,
decodeFec = true
)| Platform | Status | Implementation |
|---|---|---|
| Android | ✅ Supported | JNI/NDK with C++ bridge |
| iOS | ✅ Supported | Kotlin/Native cinterop |
Contributions are welcome! Please feel free to submit a Pull Request.