【Rust GUI开发入门】编写一个本地音乐播放器(8. 从文件中提取歌曲元信息) - Jordan

news/2025/9/30 18:25:50/文章来源:https://www.cnblogs.com/Jordan-Haidee/p/19121627

本系列教程对应的代码已开源在 Github zeedle

目的是从.mp3/.flac/.wav/...文件中提取歌曲名称/艺术家/音频时长信息/歌词信息/专辑封面

添加依赖

使用lofty这个全能解析库,将其添加到Cargo.toml中:

lofty = "0.22.4"

解析元信息

解析歌名/歌手/时长

这些信息在应用启动后,即刻被加载到音乐列表面板中(SongInfo已于前几篇文章中定义):

/// Read meta info from audio file `fp`, return a SongInfo
pub fn read_meta_info(fp: &PathBuf) -> Option<SongInfo> {if let Ok(tagged) = lofty::read_from_path(fp) {let dura = tagged.properties().duration().as_secs_f32();if let Some(tag) = tagged.primary_tag() {let song_name = tag.title();let song_name = song_name.as_deref().unwrap_or(fp.file_stem().map(|x| x.to_str()).flatten().unwrap_or("unknown"),);let singer_name = tag.artist();let singer_name = singer_name.as_deref().unwrap_or("unknown");let item = SongInfo {id: 0,song_path: fp.display().to_shared_string(),song_name: song_name.into(),singer: singer_name.into(),duration: format!("{:02}:{:02}", (dura as u32) / 60, (dura as u32) % 60).to_shared_string(),};return Some(item);}}None
}

解析歌词

歌词只有在播放该文件时才应该被加载,所以单独解析:

/// Read lyrics from audio file `p`, return a list of LyricItem
pub fn read_lyrics(p: PathBuf) -> Vec<LyricItem> {if let Ok(tagged) = lofty::read_from_path(&p) {if let Some(tag) = tagged.primary_tag() {if let Some(lyric_item) = tag.get(&ItemKey::Lyrics) {let mut lyrics = lyric_item.value().text().unwrap().split("\n").map(|line| {let (time_str, text) = line.split_once(']').unwrap_or(("", ""));let time_str = time_str.trim_start_matches('[');let dura = time_str.split(':').map(|x| x.parse::<f32>().unwrap_or(0.)).rev().reduce(|acc, x| acc + x * 60.).unwrap_or(0.);LyricItem {time: dura,text: text.to_shared_string(),duration: 0.0,}}).filter(|ins| ins.time > 0. && !ins.text.is_empty()).collect::<Vec<_>>();for i in 0..lyrics.len() - 1 {lyrics[i].duration = lyrics[i + 1].time - lyrics[i].time;}lyrics.last_mut().map(|ins| ins.duration = 100.0);return lyrics;}}}return Vec::new();
}

解析专辑封面

同上,该图像只有在播放该文件时才应该被加载,所以单独解析:

/// Read album cover from audio file `p`
pub fn read_album_cover(p: PathBuf) -> Option<(Vec<u8>, u32, u32)> {if let Ok(tagged) = lofty::read_from_path(&p) {if let Some(tag) = tagged.primary_tag() {if let Some(picture) = tag.pictures().iter().find(|pic| {pic.pic_type() == PictureType::CoverFront|| pic.pic_type() == PictureType::CoverBack}) {if let Ok(img) = image::load_from_memory(picture.data()) {let rgba = img.into_rgba8();let (width, height) = rgba.dimensions();let buffer = rgba.into_vec();return Some((buffer, width, height));}}}}None
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tita项目与绩效一体化管理:重构组织效能的数字化中枢

在数字化转型的深水区,企业正面临一个核心命题:如何让项目管理从成本中心转变为价值创造引擎?Tita项目经营管理一体化平台以”项目-绩效-人才”三位一体为设计原点,通过打破传统管理系统的数据孤岛,构建起覆盖战略…

深入解析:【网络编程】套接字入门:网络字节序与套接字种类剖析

深入解析:【网络编程】套接字入门:网络字节序与套接字种类剖析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

网站开发google四川网站建设费用

Lucene查询语法&#xff0c;适用于 ELk Kibana 查询 Elasticsearch 构建在 Lucene 之上&#xff0c;过滤器语法和 Lucene 相同。本语法可用于 Kibana 界面的检索和 Grafana 看板对接 ES 的检索规则。 Kibana 上的检索语法Grafana 上的检索语法 全文搜索 在搜索栏输入login&…

地产行业,居然还有这样的开发商 - 智慧园区

今年《政府工作报告》明确提出,抓紧构建房地产发展新模式,促进房地产高质量发展。 从过去的“探索推动”到今年的“加快构建”,表明房地产新模式已进入实质落地阶段。 房企转型,要过去的以开发为主,转向开发与经营…

公司网站建设教程哪个网站有摄影作品

深度学习中常用的损失函数多种多样&#xff0c;具体选择取决于任务类型和问题的性质。以下是一些常见的深度学习任务和相应的常用损失函数&#xff1a; 分类任务&#xff1a; 交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff1a;用于二分类和多类别分类任务…

免费域名网站创建石灰土做击实检测网站怎么填

OSI 七层模型 七层模型协议各层实现的功能 简要 详细 TCP/IP协议 组成 1.传输层协议 TCP 2.网络层协议 IP 协议数据单元&#xff08;PDU&#xff09;和 封装 数据收发过程 数据发送过程 1. 2.终端用户生成数据 3.数据被分段&#xff0c;并加上TCP头 4.网络层添加IP地址信息…

【半导体物理 | 笔记】 第三章 半导体中的载流子分布

一、状态密度 状态密度\(g(E)=\frac{\mathrm d Z}{\mathrm d E}\),即晶体的能带中能量\(E\)附近每单位能量间隔内的量子态数 \(\boldsymbol k\)空间中量子态的分布 晶体线度限制: [ k_x=\frac{2\pi n_x}{L}(n_x=0,\pm …

vscode提交github时报错:fatal: origin does not appear to be a git repository

在创建新分支,本地开始新项目后,提交到远程master时,报错:fatal: origin does not appear to be a git repository。 解决方法: 1.执行:git remote -v,查看远程分支 2. 执行:git branch -v ,确认当前分支 3. …

2025.9.30——1黄

普及/提高- P6111 [USACO18JAN] MooTube S 简单的树上dfs,wpmx推荐做的,但他居然以为自己交的是数据范围更大的加强版???

VMware vSphere Replication 9.0.4 发布 - 虚拟机复制和数据保护

VMware vSphere Replication 9.0.4 发布 - 虚拟机复制和数据保护VMware vSphere Replication 9.0.4 - 虚拟机复制和数据保护 vSphere Replication 9.0 Update 4 请访问原文链接:https://sysin.org/blog/vmware-vspher…

【半导体物理 | 笔记】第二章 半导体中杂质和缺陷能级

一、硅、锗晶体中的杂质能级 替位式杂质和间隙式杂质间隙式杂质:杂质原子位于晶格原子间的间隙位置替位式杂质:杂质原子取代晶格原子而位于晶格点处杂质浓度:单位体积中的杂质原子数(数密度) 施主杂质浓度 \(N_\mat…

VMware Live Site Recovery 9.0.4 发布 - 数据中心灾难恢复 (DR)

VMware Live Site Recovery 9.0.4 发布 - 数据中心灾难恢复 (DR)VMware Live Site Recovery 9.0.4 - 数据中心灾难恢复 (DR) Site Recovery Manager 9.0 Update 4 请访问原文链接:https://sysin.org/blog/vmware-live…

【kafka】基于python发送kafka消息

一、场景测试过程中,需要对kafka发送消息,以模拟相关业务场景二、环境pip install kafka-python 三、脚本import json import time import uuid import datetime import requests from kafka import KafkaProduce…

做网站需要哪些参考文献模板建站是什么意思

填坑&#xff0c;整理下Java的常用异常。正确使用异常在实际编码中非常重要&#xff0c;但面试中的意义相对较小&#xff0c;因为对异常的理解和应用很难通过几句话或几行代码考查出来&#xff0c;不过我们至少应答出三点&#xff1a;异常类的继承关系、常用异常类、常用异常类…

VMware Tools 13.0.5.0 发布 - 客户机操作系统无缝交互必备组件

VMware Tools 13.0.5.0 发布 - 客户机操作系统无缝交互必备组件VMware Tools 13.0.5.0 发布 - 客户机操作系统无缝交互必备组件 VMware 虚拟机必备组件 (驱动和交互式服务) 请访问原文链接:https://sysin.org/blog/vm…

VMware Tools 12.5.4 下载 - 客户机操作系统无缝交互必备组件

VMware Tools 12.5.4 下载 - 客户机操作系统无缝交互必备组件VMware Tools 12.5.4 下载 - 客户机操作系统无缝交互必备组件 VMware 虚拟机必备组件 (驱动和交互式服务) 请访问原文链接:https://sysin.org/blog/vmware…

广东网站制作报价什么网站可以看到绵阳建设

1、profile生效命令 . /etc/profiel 或 source /etc/profile说明&#xff1a;source命令也称为“点命令”&#xff0c;也就是一个点符号&#xff08;.&#xff09;转载于:https://www.cnblogs.com/Small-sunshine/p/10895426.html

怎样做网站的优化排名开发公司成本如何管控

一张网页带你了解中秋节的前世今生&#x1f317;序言一、&#x1f319;题材选取1. 诗词赏析2. 原型图抢先看3. 界面设计二、&#x1f31b;编码阶段1. 项目目录结构2. html设计&#xff08;1&#xff09;nav结构设计&#xff08;2&#xff09;banner结构设计&#xff08;3&#…

中石油第七建设公司网站精通网站建设 100

1 、百度云盘永久下载地址 : 链接&#xff1a; https://pan.baidu.com/s/13pBco75qXU6bLxlTtZ29TQ 提取码&#xff1a; ixkg 2 、官方下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 3 、注意&#xff1a;下载时候要选择自己的系统和对应的电脑 CPU 位数&a…