#lossless #wav #codec #cpu #x3a

bin+lib x3

使用 X3 编解码器的高效音频编解码器

14 个版本

0.3.0 2020 年 9 月 28 日
0.2.2 2020 年 8 月 22 日
0.2.1 2019 年 4 月 11 日
0.1.9 2019 年 4 月 9 日
0.1.7 2019 年 3 月 25 日

#668音频

GPL-3.0 或更高版本

120KB
2K SLoC

X3 Rust 无损音频压缩

X3 是一个简单有效的针对低熵声音的无损音频压缩器。它基于 Shorten 并具有一些 FLAC 的功能,但专门设计用于水下声音记录标签和浮标。它的速度比 FLAC 快得多,但压缩率不如 FLAC。名称来源于它通常实现的压缩因子,即 3 倍。该算法在 《美国声学协会杂志》133:1387-1398, 2013 的论文中描述。

该仓库是从 原始作者 的 Matlab 代码移植到 Rust 的。

代码使用

编码和解码 .wav <-> .x3a


use x3::encodefile::wav_to_x3a;
use x3::decodefile::x3a_to_wav;

// Convert .wav to .x3a
wav_to_x3a("/path/to/input_file.x3a", "/path/to/output_file.wav").unwrap();

// Convert .x3a to .wav
x3a_to_wav("/path/to/input_file.wav", "/path/to/output_file.x3a").unwrap();

编码一组 wav 数据


  let wav: Vec<i16> = /* you need to add your wav data */;

  // Can only handle signed 16 bit data with one channel.
  let params = x3::Parameters::default();
  let sample_rate = 44100;
  let num_samples = wav.len();

  // Create the channel data
  let first_channel = x3::Channel::new(0, &wav, sample_rate, params);

  // Create the output data
  let x3_len = num_samples * 2;
  let mut x3_out = vec![0u8; x3_len];
  let bp = &mut BitPacker::new(&mut x3_out); // Packer where x3 compressed data is stored.

  encoder::encode(&[&first_channel], bp).unwrap();

  // Get the bytes
  let x3_bytes = bp.as_bytes().unwrap();

命令行使用

构建软件包将创建 x3 二进制可执行文件。您可以转换文件到/从 x3a/wav。

示例


# Convert from x3a to wav
./x3 --input /path/to/file.x3a --output /path/to/file.wav

# Convert from wav to x3a
./x3 --input /path/to/file.wav --output /path/to/file.x3a

待办事项

以下项目需要工作

  • 如果解码帧存在问题,则通知用户。
  • 错误处理可以更好。
  • 添加多通道功能 - 目前我们只能处理单声道。
  • 显式使用 #![no_std] 选项用于嵌入式设备。
  • 性能,它目前比 flac 编码器慢。
  • 编码文件时不太高效。它将预先分配所有内存。
  • 分离读取和解码。提前读取帧,可能以不同的方式。

许可证

Rust 实现的 X3 无损音频压缩协议。

版权 (C) 2019 Simon M. Werner [email protected]

本程序是自由软件;您可以根据自由软件基金会发布的GNU通用公共许可证的条款重新分发和/或修改它;许可证的版本可以是第3版,或者(根据您的选择)任何更高版本。

本程序的分发是希望它有用,但没有任何保证;甚至没有关于其商业性或针对特定用途的适用性的隐含保证。有关更多详情,请参阅GNU通用公共许可证。

您应该已随本程序收到GNU通用公共许可证的一份副本;如果没有,请参阅https://www.gnu.org/licenses

依赖关系

~3.5MB
~51K SLoC