Rust 解析ID3V1标签

262 阅读1分钟

记录,使用Rust解析音频文件的ID3V1标签

  //Id3v1 tag
  let path="漫 步 人 生 路 .mp3";
    //打 开 文 件
    let file = File::open(path).expect("文 件 打 开 >
失 败 ");
  //获取文件的大小,单位字节
    let len = file.metadata().unwrap().len();
    //获取TAG标签,长度3
    let mut buffer = vec![0;3];
    //从文件末尾的第128字节读取3个字节
    file.read_at(&mut buffer, len-128).unwrap();
    //转 为 字 符 串
    let tag = String::from_utf8(buffer).expect(">
转 换 失 败 ");
    //打 印
    println!("{}\nTAG={}",path,tag);

歌名占空间30字节,从倒数第125个字节开始读,其他的标签同理 在转换的时候遇到了gbk的编码,utf8转换失败。这里使用用了第三方的编解码库进行解码

//歌 名 , 长 度 30
    let mut buffer=vec![0;30];
    file.read_at(&mut buffer, len-125).unwrap();
    let title=to_string(&mut buffer);
    println!("title={}",title);

//把byte转字符串的操作包装一下
fn to_string(buffer:&mut Vec<u8>)->String{
    //ID3V1的 标 签 是 固 定 长 度 , 多 余 的 会 用 0替 代
    //这 个 方 法 把 多 余 的 0去 掉
    buffer.retain(|s| *s!=0);
    let buffer=buffer.clone();
    //先 用 gbk解 码 , 如 果 失 败 就 用 utf8解 码
    let c =match GBK.decode(&buffer,DecoderTrap::Stri
ct){
        Ok(c)=>c,
        Err(_)=>{
            //utf8
            return String::from_utf8(buffer).unwrap()
;
        },
    };
    c
}

用到的第三方库

use encoding::{Encoding, DecoderTrap};
use encoding::all::GBK;

Toml文件

[dependencies]
encoding = "0.2"

参考资料:MP3文件结构解析(超详细)