Crates.io | codec2 |
lib.rs | codec2 |
version | 0.3.0 |
source | src |
created_at | 2020-11-30 20:40:12.363727 |
updated_at | 2023-02-18 14:15:12.561087 |
description | A pure-Rust implementation of the Codec2 low-bitrate speech compression codec |
homepage | |
repository | https://github.com/scriptjunkie/codec2 |
max_upload_size | |
id | 318376 |
size | 285,722 |
Add this to your Cargo.toml
:
[dependencies]
codec2 = "0.3"
Currently 3200, 2400, 1600, 1400, 1300 and 1200 bitrates encoding and decoding are implemented.
Create a Codec2 object e.g. Codec2::new(Codec2Mode::MODE_3200)
then repeatedly obtain raw 8khz
16-bit audio samples and call encode
to encode blocks of samples_per_frame()
samples into
bits_per_frame()
compressed bits, in order. On the receiving end, create a Codec2 object and
repeatedly call decode
to decompress each chunk of received bytes into the next samples.
Complete example below. This example uses zerocopy to interpret the &[i16]
slices as &[u8]
for
I/O.
Cargo.toml:
[dependencies]
zerocopy = "0.3.0"
codec2 = "0"
main.rs:
use codec2::*;
use std::env::args;
use std::io::prelude::*;
use zerocopy::AsBytes;
fn main() -> std::io::Result<()> {
if args().len() != 4 || (args().nth(1).unwrap() != "enc" && args().nth(1).unwrap() != "dec") {
eprintln!("Usage: {} (enc|dec) inputfile outputfilename", args().nth(0).unwrap());
eprintln!("Files should be raw 16-bit signed 8khz audio");
return Ok(());
}
let mut fin = std::fs::File::open(args().nth(2).unwrap())?;
let mut fout = std::fs::File::create(args().nth(3).unwrap())?;
let mut c2 = Codec2::new(Codec2Mode::MODE_3200);
let mut samps = vec![0; c2.samples_per_frame()]; //i16 I/O buffer
let mut packed = vec![0; (c2.bits_per_frame() + 7) / 8]; //u8 I/O buffer for encoded bits
if args().nth(1).unwrap() == "enc" {
while fin.read_exact(samps.as_bytes_mut()).is_ok() {
c2.encode(&mut packed, &samps[..]);
fout.write_all(&packed)?;
}
} else {
while fin.read_exact(&mut packed).is_ok() {
c2.decode(&mut samps[..], &packed);
fout.write_all(samps.as_bytes())?;
}
}
Ok(())
}