#解码器 #有损

pure_vorbis

纯Rust实现的Vorbis解码器

1个不稳定版本

使用旧的Rust 2015

0.0.1 2016年9月6日

#7#有损

BSD-3-Clause

120KB
3K SLoC

纯Vorbis

Vorbis 在纯Rust中的解码器实现。

文档

https://docs.rs/pure_vorbis

安装

将其添加到您的 Cargo.toml

[dependencies]
pure_vorbis = "0.0"

并到crate根目录

extern crate pure_vorbis;

用法

use std::io::Cursor;
use vorbis::{BitReader, Decoder};

let ident_packet = &[]; // Replace with real data.
let comment_packet = &[]; // Replace with real data.
let setup_packet = &[]; // Replace with real data.

let mut builder = Decoder::builder();
builder.read_ident_packet(&mut BitReader::new(Cursor::new(ident_packet)))
        .expect("Couldn't read ident packet");
builder.read_comment_packet(&mut BitReader::new(Cursor::new(comment_packet)))
        .expect("Couldn't read comment packet");
builder.read_setup_packet(&mut BitReader::new(Cursor::new(setup_packet)))
        .expect("Couldn't read setup packet");
let mut decoder = builder.build();

let mut sample_buf = Vec::with_capacity(decoder.header().frame_lens().long() * decoder.header().channel_count());

loop {
    let audio_packet = &[]; // Replace with real data.
    decoder.decode(&mut BitReader::new(Cursor::new(audio_packet)))
            .expect("Couldn't decode audio packet");
    if decoder.samples().is_empty() {
        continue;
    }
    sample_buf.truncate(0);
    sample_buf.extend(decoder.samples().interleave()
            .map(|s| (s * 32767.0 + 0.5).floor() as i16));

    // Do something with the sample_buf.
}

也可以参考 play 示例

已知问题/限制

  • 不支持0级地板。
  • 未实现0级残差。找不到或生成使用它的Vorbis文件。
  • 此实现比参考实现慢约2倍。

许可证

版权(c)2016 Dmytro Lysai

只要满足以下条件,允许以源代码和二进制形式重新分发和使用,无论是否修改:

  • 源代码重新分发必须保留上述版权声明、本条件列表和以下免责声明。

  • 二进制形式的重新分发必须在文档和/或其他与分发一起提供的材料中重新生产上述版权声明、本条件列表和以下免责声明。

  • 未经事先书面许可,不得使用原始作者或贡献者的姓名来认可或推广源自本软件的产品。

本软件由版权所有者和贡献者提供,“按原样”提供,并明确或暗示放弃包括但不限于商销性和适用于特定目的的暗示保证。在任何情况下,基金会或贡献者均不对任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代货物或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论此类损害是否因使用本软件引起,即使已被告知此类损害的可能性。

依赖关系

~250KB