Rust音频元数据处理库moosicbox_lofty_attr的使用:高效解析和操作MP3、FLAC等音频文件的ID3标签和属性
Rust音频元数据处理库moosicbox_lofty_attr的使用
安装
在你的项目目录中运行以下Cargo命令:
cargo add moosicbox_lofty_attr
或者在Cargo.toml中添加以下行:
moosicbox_lofty_attr = "0.1.0"
示例代码
以下是使用moosicbox_lofty_attr处理音频文件元数据的完整示例:
use moosicbox_lofty_attr::LoftyAttr;
use lofty::{AudioFile, TaggedFileExt};
// 定义音频元数据结构体,使用LoftyAttr派生宏
#[derive(LoftyAttr)]
struct AudioMetadata {
title: String,
artist: String,
album: String,
year: Option<u32>,
track_number: Option<u32>,
genre: Option<String>,
}
fn main() {
// 读取音频文件
let path = "example.mp3";
let tagged_file = lofty::read_from_path(path).expect("Failed to read file");
// 提取元数据到自定义结构体
let metadata: AudioMetadata = tagged_file.into();
// 打印元数据信息
println!("音频元数据:");
println!("标题: {}", metadata.title);
println!("艺术家: {}", metadata.artist);
println!("专辑: {}", metadata.album);
if let Some(year) = metadata.year {
println!("年份: {}", year);
}
if let Some(track) = metadata.track_number {
println!("音轨号: {}", track);
}
if let Some(genre) = metadata.genre {
println!("流派: {}", genre);
}
// 修改并保存元数据
let mut tagged_file = lofty::read_from_path(path).expect("Failed to read file");
tagged_file.set_title("新标题");
tagged_file.set_artist("新艺术家");
tagged_file.save_to_path(path).expect("Failed to save changes");
}
完整示例代码扩展
以下是一个更完整的示例,展示如何处理多个音频文件并添加更多元数据字段:
use moosicbox_lofty_attr::LoftyAttr;
use lofty::{AudioFile, TaggedFileExt};
use std::path::PathBuf;
// 扩展元数据结构体
#[derive(LoftyAttr, Debug)]
struct EnhancedAudioMetadata {
title: String,
artist: String,
album: String,
year: Option<u32>,
track_number: Option<u32>,
track_total: Option<u32>,
genre: Option<String>,
comment: Option<String>,
composer: Option<String>,
duration: Option<u32>, // 以秒为单位
}
fn process_audio_file(path: &str) -> anyhow::Result<()> {
// 读取音频文件
let tagged_file = lofty::read_from_path(path)?;
// 提取元数据到增强结构体
let metadata: EnhancedAudioMetadata = tagged_file.into();
println!("处理文件: {}", path);
println!("{:#?}", metadata);
// 修改元数据
let mut tagged_file = lofty::read_from_path(path)?;
// 更新部分字段
tagged_file.set_album(format!("{} (Remastered)", metadata.album));
tagged_file.set_comment("Processed by moosicbox_lofty_attr".to_string());
// 保存更改
tagged_file.save_to_path(path)?;
println!("文件 {} 的元数据已更新", path);
Ok(())
}
fn main() -> anyhow::Result<()> {
let audio_files = vec![
"song1.mp3",
"song2.flac",
"song3.ogg",
];
for file in audio_files {
if let Err(e) = process_audio_file(file) {
eprintln!("处理文件 {} 时出错: {}", file, e);
}
}
Ok(())
}
功能说明
- 支持多种音频格式的元数据解析,包括MP3、FLAC、OGG等
- 提供宏支持简化元数据结构的定义和处理
- 可读写ID3标签和其他音频元数据
- 支持常见元数据字段如标题、艺术家、专辑、年份等
- 支持可选字段处理,如音轨号、流派、评论等
许可证
本crate采用MIT或Apache-2.0许可证。
1 回复
Rust音频元数据处理库moosicbox_lofty_attr使用指南
概述
moosicbox_lofty_attr是一个Rust库,专门用于高效解析和操作音频文件的元数据(如ID3标签)。它支持多种音频格式,包括MP3、FLAC、AAC、WAV等,提供了简单易用的API来读取和修改音频文件的元信息。
主要特性
- 支持多种音频格式:MP3(ID3v1/ID3v2)、FLAC、Vorbis、MP4、AAC等
- 读取和写入音频元数据
- 支持封面图片(专辑艺术)的提取和修改
- 高性能的元数据解析
- 零拷贝设计,减少内存开销
安装
在Cargo.toml中添加依赖:
[dependencies]
moosicbox_lofty_attr = "0.1" # 请使用最新版本
完整示例代码
下面是一个结合了读取、修改元数据以及错误处理的完整示例:
use moosicbox_lofty_attr::{LoftyAttr, Tag, PictureType};
use std::error::Error;
use std::path::Path;
fn main() -> Result<(), Box<dyn Error>> {
// 定义音频文件路径
let audio_path = "test_song.mp3";
// 检查文件是否存在
if !Path::new(audio_path).exists() {
return Err("音频文件不存在".into());
}
// 1. 读取音频元数据
println!("=== 读取音频元数据 ===");
let audio_file = LoftyAttr::read_from_path(audio_path)?;
// 打印文件格式信息
println!("文件格式: {:?}", audio_file.file_type());
// 获取主标签(如果有)
if let Some(tag) = audio_file.primary_tag() {
print_tag_info(&tag);
} else {
println!("文件没有主要标签");
}
// 2. 修改音频元数据
println!("\n=== 修改音频元数据 ===");
let mut audio_file = LoftyAttr::read_from_path(audio_path)?;
let mut tag = audio_file.tag_mut().unwrap_or_else(|| audio_file.create_tag());
// 设置新元数据
tag.set_title("新的歌曲标题");
tag.set_artist("新的艺术家");
tag.set_album("新的专辑");
tag.set_year(2023);
tag.set_track(1);
tag.set_track_total(10);
tag.set_genre("流行");
// 添加自定义图片
if let Ok(picture_data) = std::fs::read("cover.jpg") {
tag.insert_picture(
PictureType::CoverFront,
"image/jpeg",
picture_data
);
println!("已添加封面图片");
}
// 保存修改后的文件
let modified_path = "modified_song.mp3";
audio_file.save_to_path(modified_path)?;
println!("已保存修改到: {}", modified_path);
Ok(())
}
// 打印标签信息的辅助函数
fn print_tag_info(tag: &Tag) {
println!("--- 元数据信息 ---");
println!("标题: {:?}", tag.title());
println!("艺术家: {:?}", tag.artist());
println!("专辑: {:?}", tag.album());
println!("年份: {:?}", tag.year());
println!("音轨号: {}/{}",
tag.track().unwrap_or(0),
tag.track_total().unwrap_or(0)
);
println!("光盘号: {}/{}",
tag.disk().unwrap_or(0),
tag.disk_total().unwrap_or(0)
);
println!("流派: {:?}", tag.genre());
// 检查是否有封面图片
if let Some(picture) = tag.picture() {
println!("封面图片类型: {:?}", picture.pic_type());
println!("封面图片大小: {} 字节", picture.data().len());
} else {
println!("没有封面图片");
}
}
示例说明
-
读取元数据:
- 使用
LoftyAttr::read_from_path
读取音频文件 - 通过
primary_tag()
获取主要标签 - 打印各种元数据信息
- 使用
-
修改元数据:
- 使用
tag_mut()
获取可修改的标签 - 设置各种元数据字段
- 添加自定义封面图片
- 使用
save_to_path
保存修改
- 使用
-
错误处理:
- 使用
Result
和Box<dyn Error>
处理可能出现的错误 - 检查文件是否存在
- 使用
-
辅助函数:
print_tag_info
函数用于整齐地打印标签信息
运行准备
- 准备一个测试用的音频文件(如MP3)
- 可选准备一个封面图片(cover.jpg)
- 在Cargo.toml中添加依赖
- 运行示例代码
这个完整示例展示了moosicbox_lofty_attr库的主要功能,包括读取、修改元数据以及错误处理,可以作为您项目开发的起点。