#encoder #flac #lossless #encoding

flacenc

为您的应用程序嵌入FLAC编码器的纯Rust库

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 音频

Download history 75/week @ 2024-04-08 561/week @ 2024-04-15 977/week @ 2024-04-22 647/week @ 2024-04-29 874/week @ 2024-05-06 1084/week @ 2024-05-13 212/week @ 2024-05-20 310/week @ 2024-05-27 245/week @ 2024-06-03 496/week @ 2024-06-10 399/week @ 2024-06-17 294/week @ 2024-06-24 270/week @ 2024-07-01 378/week @ 2024-07-08 493/week @ 2024-07-15 710/week @ 2024-07-22

1,880 每月下载次数
5 crates 中使用

Apache-2.0

410KB
9K SLoC

flacenc-rs

Build Status Crate Documentation

此crate提供了一些基本模块,用于在Rust程序中构建自定义的FLAC(Free Lossless Audio Codec)编码器。此crate提供的API目前支持以下用例

  1. 从自定义输入源执行FLAC编码。
  2. 检查编码流,启用对编码器结果的分析和序列化。

重要的是,此编码器是为了可修改性而设计的。它的便携性和(相对)干净的代码使其易于修改和适应您的特定用例。

如果您需要一个独立的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 提供了多种控制编码过程的方法。可能的定制可以归纳为三类

  1. 通过配置 config::Encoder 来自定义编码算法
  2. 通过实现 source::Source 特性来增强输入
  3. 通过 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