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(())
}

功能说明

  1. 支持多种音频格式的元数据解析,包括MP3、FLAC、OGG等
  2. 提供宏支持简化元数据结构的定义和处理
  3. 可读写ID3标签和其他音频元数据
  4. 支持常见元数据字段如标题、艺术家、专辑、年份等
  5. 支持可选字段处理,如音轨号、流派、评论等

许可证

本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!("没有封面图片");
    }
}

示例说明

  1. 读取元数据:

    • 使用LoftyAttr::read_from_path读取音频文件
    • 通过primary_tag()获取主要标签
    • 打印各种元数据信息
  2. 修改元数据:

    • 使用tag_mut()获取可修改的标签
    • 设置各种元数据字段
    • 添加自定义封面图片
    • 使用save_to_path保存修改
  3. 错误处理:

    • 使用ResultBox<dyn Error>处理可能出现的错误
    • 检查文件是否存在
  4. 辅助函数:

    • print_tag_info函数用于整齐地打印标签信息

运行准备

  1. 准备一个测试用的音频文件(如MP3)
  2. 可选准备一个封面图片(cover.jpg)
  3. 在Cargo.toml中添加依赖
  4. 运行示例代码

这个完整示例展示了moosicbox_lofty_attr库的主要功能,包括读取、修改元数据以及错误处理,可以作为您项目开发的起点。

回到顶部