3个版本 (重大变更)
0.3.0 | 2023年2月18日 |
---|---|
0.2.0 | 2020年12月1日 |
0.1.0 | 2020年11月30日 |
在音频类别中排名#400
每月下载量31次
285KB
4.5K SLoC
Codec2
将以下内容添加到您的Cargo.toml
[dependencies]
codec2 = "0.3"
使用方法
目前实现了3200、2400、1600、1400、1300和1200比特率的编码和解码。
创建一个Codec2对象,例如Codec2::new(Codec2Mode::MODE_3200)
,然后反复获取原始8kHz 16位音频样本,并调用encode
将samples_per_frame()
样本编码成bits_per_frame()
压缩比特。在接收端,创建一个Codec2对象,并反复调用decode
来解压缩接收到的每个字节块为下一个样本。
以下是一个完整的示例。此示例使用zerocopy将&[i16]
切片解释为&[u8]
进行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(())
}