#tags #audio-metadata #id3 #audiotags #format-file #read-write

audiotags2

不同类型音频元数据的统一IO(维护分支)

2个版本

0.3.1 2022年5月27日
0.3.0 2022年5月26日

#12 in #id3

MIT 许可证

2MB
1K SLoC

audiotags2

Crate Crate Crate Documentation

audiotags2audiotags 的分支,目前未维护。

这个crate使得解析、转换和写入不同文件类型音频文件中的元数据(也称为标签)变得更加容易。

这个crate旨在为不同音频文件格式的解析器和写入器提供一个统一的trait。这意味着你可以使用单个函数:Tag::default(). read_from_path() 解析mp3、flac和m4a文件中的标签,并通过直接调用其结果上的 .album().artist() 来获取字段。如果没有这个crate,你将需要学习 id3mp4ameta 等不同API来解析不同文件格式中的元数据。

性能

如果你想要猜测元数据格式(从文件扩展名),使用 audiotags2 会因为vtable而带来一点开销。除此之外,性能几乎与直接调用那些“专业”crate提供的函数相同。

如果你只需要读取和写入一种格式的元数据,则不会进行复制。如果你想在不同标签之间进行转换,无论使用 audiotags2 还是使用专门库提供的获取器和设置器,复制都是不可避免的。audiotags2 不会进行额外的、不必要的复制。

支持格式

文件格式 元数据格式 后端
mp3 id3v2.4 id3
m4a/mp4/... MPEG-4音频元数据 mp4ameta
flac Vorbis注释 metaflac

示例

阅读手册中的示例,但这里有一个快速示例

fn main() {
    // using `default()` or `new()` alone so that the metadata format is
    // guessed (from the file extension) (in this case, Id3v2 tag is read)
    let mut tag = Tag::new().read_from_path(MP3_FILE).unwrap();

    tag.set_title("foo title");
    assert_eq!(tag.title(), Some("foo title"));
    tag.remove_title();
    assert!(tag.title().is_none());
    tag.remove_title();
    // trying to remove a field that's already empty won't hurt

    let cover = Picture {
        mime_type: MimeType::Jpeg,
        data: &vec![0u8; 10],
    };

    tag.set_album_cover(cover.clone());
    assert_eq!(tag.album_cover(), Some(cover));
    tag.remove_album_cover();
    assert!(tag.album_cover().is_none());
    tag.remove_album_cover();

    tag.write_to_path(MP3_FILE).expect("Fail to save");
}

许可证:MIT

依赖项

~2.5MB
~39K SLoC