6个版本 (3个重大更新)
0.4.0 | 2024年3月5日 |
---|---|
0.3.1 | 2023年10月30日 |
0.2.0 | 2023年10月9日 |
0.1.1 | 2023年9月20日 |
0.1.0 | 2022年6月6日 |
#42 in 音频
1,880 每月下载次数
在 5 crates 中使用
410KB
9K SLoC
flacenc-rs
此crate提供了一些基本模块,用于在Rust程序中构建自定义的FLAC(Free Lossless Audio Codec)编码器。此crate提供的API目前支持以下用例
- 从自定义输入源执行FLAC编码。
- 检查编码流,启用对编码器结果的分析和序列化。
重要的是,此编码器是为了可修改性而设计的。它的便携性和(相对)干净的代码使其易于修改和适应您的特定用例。
如果您需要一个独立的FLAC编码器,而不是可嵌入的库,请尝试我们的配套CLI工具,flacenc-bin
。
有关此编码器的特性与FLAC参考实现的详细比较,请参阅自动生成的报告。
用法
将以下行添加到您的Cargo.toml
flacenc = "0.4.0"
此crate旨在与portable_simd
一起使用,并且上述默认配置使用“fake”的portable_simd
实现,以便在稳定工具链中构建。如果您可以使用夜间工具链,请使用此crate并启用SIMD功能,如下所示
flacenc = { version = "0.4.0", features = ["simd-nightly"] }
示例
有关FLAC编码器的示例实现,请参阅flacenc-bin
子crate的源代码。
给定录制样本在&[i32]
中实现FLAC编码的最简单方法是以下
use flacenc::component::BitRepr;
use flacenc::error::Verify;
let samples: &[i32] = &[0i32; 4096]; // replace this with real samples.
let (channels, bits_per_sample, sample_rate) = (2, 16, 44100);
let config = flacenc::config::Encoder::default().into_verified().expect(
"Config data error."
);
let source = flacenc::source::MemSource::from_samples(
samples, channels, bits_per_sample, sample_rate);
let flac_stream = flacenc::encode_with_fixed_block_size(
&config, source, config.block_size
).expect("Encode failed.");
// `Stream` imlpements `BitRepr` so you can obtain the encoded stream via
// `ByteSink` struct that implements `BitSink`.
let mut sink = flacenc::bitsink::ByteSink::new();
flac_stream.write(&mut sink);
// Then, e.g. you can write it to a file.
std::fs::write("/dev/null", sink.as_slice());
// or you can write only a specific frame.
let mut sink = flacenc::bitsink::ByteSink::new();
flac_stream.frame(0).unwrap().write(&mut sink);
samples
这里是一个交错序列,例如在立体声输入的情况下,它是一个如下的序列 [left[0], right[0], left[1], right[1], ...]
其中 left[t]
和 right[t]
分别表示从左和右声道获取的 t-第个样本。所有样本都假设在以下范围内:- 2.pow(bits_per_samples - 1) .. 2.pow(bits_per_samples - 1)
,即如果 bits_per_samples == 16
,则 samples[t]
必须满足 -32768 <= samples[t] <= 32767
。
自定义编码器行为
注意:目前,flacenc
处于初始开发阶段(主要版本为零)。因此,API 可能会频繁更改。在主要版本为零阶段,当发生破坏性 API 变更时,我们会增加次要版本(版本 "x.Y.z" 中的 "Y")。
当前的 API 提供了多种控制编码过程的方法。可能的定制可以归纳为三类
- 通过配置
config::Encoder
来自定义编码算法 - 通过实现
source::Source
特性来增强输入 - 通过
component
子模块中的结构体添加自定义后处理
功能标志
flacenc
有几个 Cargo 功能可以改变内部行为和 API。
experimental
:启用实验性编码算法,通常速度较慢。由于其实验性质,没有关于如何激活每个算法的文档。您可能需要探索flacenc::config
模块或源代码以更好地理解。log
:(此功能默认启用)启用日志记录,以便应用程序程序可以通过链接日志处理程序 crate(如env_logger
crate)来处理日志。日志记录不在代码的性能关键部分进行,因此此功能引起的计算成本应该可以忽略不计。simd-nightly
:激活 rust 夜间工具链的portable-simd
功能,并使用真正的 SIMD 处理而不是默认使用的虚假处理。mimalloc
:启用mimalloc
全局分配器。这可以在par
模式下提高性能。par
:(此功能默认启用)如果config
参数配置正确,则在encode_with_fixed_block_size
函数中启用多线程编码(当par
启用时,默认配置启用多线程模式)。如果您想禁用多线程模式并缩小依赖树,可以通过default-features = false
来实现。par
增加了对crossbeam-channel
包的依赖。
在示例编码器flacenc-bin
中,除了simd-nightly
外,所有功能默认启用。此外,在基准测试脚本中使用了simd-nightly
。
贡献
有关详细信息,请参阅CONTRIBUTING.md
。
许可证
Apache 2.0;有关详细信息,请参阅LICENSE
。
免责声明
此项目不是官方的Google项目。Google不支持此项目,并且Google明确声明对其质量、适销性或特定用途的适用性不承担任何保证。
依赖项
~1.4–3MB
~63K SLoC