.net从MP3中提取歌曲信息

Windows 10/11下用MP3Stego提取音频隐写信息,一条命令搞定(附密码参数详解) 本文详细介绍了在Windows 10/11环境下使用MP3Stego工具提取音频隐写信息的完整指南。通过解析核心命令参数、提供密码处理技巧和实战操作流程,帮助用户快速掌握音频隐写分析技术,适用于数字取证和网络安全竞赛场景。 阅读详情


       一首MP3歌曲除了音乐信息外,还包含了如歌名、演唱者等信息,当我们用winamp软件听音乐时,播放清单就自动将这些信息读出来。大部分人都喜欢从网上下载音乐,但下载下来的MP3文件名都是文件上传系统自动取名的,和歌曲本身根本不相符,所以,给用户带来了很大的麻烦。但是,懒人有懒人的做法,我们何不自己写一个程序,将歌曲信息自动读出来并为MP3文件自动更名呢?

 

       下面我就以C#为工具,把开发过程写出来。

 

       一首MP3的额外信息存放在文件的最后面,共占128个字节,其中包括以下的内容(我们定义一个结构说明):

       public struct Mp3Info

        {

            public string identify;//TAG,三个字节

            public string Title;//歌曲名,30个字节

            public string Artist;//歌手名,30个字节

            public string Album;//所属唱片,30个字节

            public string Year;//年,4个字符

            public string Comment;//注释,28个字节

 

            public char reserved1;//保留位,一个字节

            public char reserved2;//保留位,一个字节

            public char reserved3;//保留位,一个字节

        }

 

       所以,我们只要把MP3文件的最后128个字节分段读出来并保存到该结构里就可以了。函数定义如下:

              /// <summary>

        /// 获取MP3文件最后128个字节

        /// </summary>

        /// <param name="FileName">文件名</param>

        /// <returns>返回字节数组</returns>

        private byte[] getLast128(string FileName)

        {

            FileStream fs = new FileStream(FileName,FileMode.Open,FileAccess.Read);

            Stream stream = fs;

 

            stream.Seek(-128,SeekOrigin.End);

 

            const int seekPos = 128;

            int rl = 0;

            byte[] Info = new byte[seekPos];

            rl = stream.Read(Info,0,seekPos);

 

            fs.Close();

            stream.Close();

 

            return Info;

        }

 

       再对上面返回的字节数组分段取出,并保存到Mp3Info结构中返回。

              /// <summary>

        /// 获取MP3歌曲的相关信息

        /// </summary>

        /// <param name = "Info">从MP3文件中截取的二进制信息</param>

        /// <returns>返回一个Mp3Info结构</returns>

        private Mp3Info getMp3Info(byte[] Info)

        {

            Mp3Info mp3Info = new Mp3Info();

 

            string str = null;

            int i;

            int position = 0;//循环的起始值

            int currentIndex = 0;//Info的当前索引值

            //获取TAG标识

            for(i = currentIndex;i<currentIndex+3;i++)

            {

                str = str+(char)Info[i];

   

                position++;

            }

            currentIndex = position;

            mp3Info.identify = str;

 

            //获取歌名

            str = null;

            byte[] bytTitle = new byte[30];//将歌名部分读到一个单独的数组中

            int j = 0;

            for(i = currentIndex;i<currentIndex+30;i++)

            {

                bytTitle[j] = Info[i];   

                position++;

                j++;

            }

            currentIndex = position;

            mp3Info.Title = this.byteToString(bytTitle);

 

            //获取歌手名

            str = null;

            j = 0;

            byte[] bytArtist = new byte[30];//将歌手名部分读到一个单独的数组中

            for(i = currentIndex;i<currentIndex+30;i++)

            {

                bytArtist[j] = Info[i];   

                position++;

                j++;

            }

            currentIndex = position;

            mp3Info.Artist = this.byteToString(bytArtist);

 

            //获取唱片名

            str = null;

            j = 0;

            byte[] bytAlbum = new byte[30];//将唱片名部分读到一个单独的数组中

            for(i = currentIndex;i<currentIndex+30;i++)

            {

                bytAlbum[j] = Info[i];   

                position++;

                j++;

            }

            currentIndex = position;

            mp3Info.Album = this.byteToString(bytAlbum);

 

            //获取年

            str = null;

            j = 0;

            byte[] bytYear = new byte[4];//将年部分读到一个单独的数组中

            for(i = currentIndex;i<currentIndex+4;i++)

            {

                bytYear[j] = Info[i]; 

                position++;

                j++;

            }

            currentIndex = position;

            mp3Info.Year = this.byteToString(bytYear);

           

            //获取注释

            str = null;

            j = 0;

            byte[] bytComment = new byte[28];//将注释部分读到一个单独的数组中

            for(i = currentIndex;i<currentIndex+25;i++)

            {

                bytComment[j] = Info[i];   

                position++;

                j++;

            }

            currentIndex = position;

            mp3Info.Comment = this.byteToString(bytComment);

 

            //以下获取保留位

            mp3Info.reserved1 = (char)Info[++position];

            mp3Info.reserved2 = (char)Info[++position];

            mp3Info.reserved3 = (char)Info[++position];

 

            return mp3Info;

        }

       上面程序用到下面的方法:

              /// <summary>

        /// 将字节数组转换成字符串

        /// </summary>

        /// <param name = "b">字节数组</param>

        /// <returns>返回转换后的字符串</returns>

        private string byteToString(byte[] b)

        {

            Encoding enc = Encoding.GetEncoding("GB2312");

            string str = enc.GetString(b);

            str = str.Substring(0,str.IndexOf('/0') >= 0 ? str.IndexOf('/0') : str.Length);//去掉无用字符

 

            return str;

        }

 

       改名怎么办呢?我们按(演唱者)歌名 的格式对歌曲进行改名,程序如下:

       /// <summary>

        /// 更改文件名

        /// </summary>

        /// <param name="filePath">文件名</param>

        /// <returns></returns>

        private bool ReName(string filePath)

        {

            if(File.Exists(filePath))

            {

                Mp3Info mp3Info = new Mp3Info();

                mp3Info = this.getMp3Info(this.getLast128(filePath));//读出文件信息

 

                mp3Info.Artist = this.DeleteNotValue(mp3Info.Artist);

                mp3Info.Title = this.DeleteNotValue(mp3Info.Title);

 

                if(mp3Info.Artist.Trim().Length==0)

                {

                    mp3Info.Artist="未命名";

                }

 

                if(mp3Info.Title.Trim().Length==0)

                {

                    mp3Info.Title="未知名歌曲";

                }

 

                try

                {

                    //更名

                    File.Move(filePath,filePath.Substring(0,filePath.ToLower().LastIndexOf("//")).Trim() + "//" + "(" + mp3Info.Artist.Trim() + ")" +mp3Info.Title.Trim() + ".mp3");

                    return true;

                }

                catch(Exception)

                {

                    return false;

                }

            }

            else

            {

                return false;

            }

        }

 

呵,思路就是这样了,如果有问题或者需要源码请发邮件至:lifenote@21cn.com索取 

C#实现获取MP3文件的歌词 (附完整源码) 阅读详情

相关推荐

C# 深入解析MP3元数据读取技术(源码展示)

本文还有配套的精品资源,点击获取 简介:本教程详细介绍了如何在C#中读取MP3音频文件的ID3标签信息,包括安装和使用TagLib#库的步骤,以及如何访问和处理ID3v1和ID3v2版本中的元数据。内容涵盖从安装依赖到处理异常和释放资源的完整流程,旨在帮助开发者在实际项目中实现MP3文件元数据的高效读取与管理。 1. MP3文件元数据概念 1.1 MP3文件元数...

weixin_31597759的博客 1928

从MP3中提取歌曲信息(C#)

#1  从MP3中提取歌曲信息(C#)作者:game.19xz 来源:19xz.com          一首MP3歌曲除了音乐信息外,还包含了如歌名、演唱者等信息,当我们用winamp软件听音乐时,播放清单就自动将这些信息读出来。大部分人都喜欢从网上下载音乐,但下载下来的MP3文件名都是文件上传系统自动取名的,和歌曲本身根本不相符,所以,给用户带来了很大的麻烦。但是,懒人有懒人的做法,我们何不自

Softeer.Net---Zero in my target,and go for it.从零开始,勇往直前! 1725

获取mp3标签信息C#(.net)类及实例

可以获得MP3标题、艺术家、专辑、年份、备注、音轨、流派等信息。有比较好的类库及注释。个人感觉还不错

asp.net 网站使用命令合并mp3录音文件

【代码】asp.net 网站使用命令合并mp3录音文件。

mingjing941018的博客 218

ShazamiD 音乐识别

玩过索爱w系列的都知道TrackID这功能,该功能可以用手机录制一段音乐,并将这段音乐识别出来.Shazam iD也是用来识别音乐的软件,只能识别英文歌曲分析之后回去依照名字下载就是了,准确率高达90%.也就是说在街边或听收音机时遇到不认识的英文歌,用这个软件可以识别出来是什么歌,只支持英文,不过中文一般都能自己搜出来.

歌曲相似度搜索.zip

只是简单的匹配酷狗,酷我,虾米下载的歌曲名称,提供了相似文件的输出。

c# 从mp3中提取标题、艺术家、唱片标题、发行年、备注等信息study.pctoday.net.cn(转)...

转自:http://www.cnblogs.com/shaoqun/archive/2009/12/14/1624165.html 一首MP3歌曲除了音乐信息外,还包含了如歌名、演唱者等信息,下面我们就通过c#编程将歌曲信息自动读出来 using System; using System.Collections.Generic; using System.Text...

weixin_30825581的博客 260

音频检索工具C#版

该程序可以分析音频文件的各种波形、频率、振幅等特征,可应用于多媒体音频文件检索,简单实用。

C语言读取mp3文件的信息

MP3文件的ID3V1信息与ID3V2信息结构的分析  ——吴俊涛2005/05/05  E-mail:bo_tao@126.com  QQ:29248671  主 页:http://wjt276.home4u.china.com(有源代码)   本人是一位编程爱好者,想通过VB。NET编写一个可以读取MP3文件的信息的不程序,可以不知道文件结构,呀我在网上找了好长时间(好

zwb8848happy的专栏 1万+

用C#写的在线听歌,支持同步显示歌词

2012-11-21 1.0.0.0 -------------------- 01.在列表上面的文本框中,输入你想要搜索的文字,按下回车,将会从网上搜索歌曲 02.列表中如果是搜索出来的网络歌曲,将会自动在线试听,并且自动下载到本地 03.右下角的“…”按钮可以修改媒体所在的目录,默认是当前程序所在的 Music目录 04.歌曲自动按歌手分不同的目录保存 05.打开程序后,不会主动加载本地的歌曲,请手动点一下,媒体库 06.在歌曲列表中,右键,可以看到两个选项: 浏览文件:打开歌曲所在的位置,网络歌曲会弹出错误提示 物理删除:从本地删除歌曲 07.歌词未保存在本地,每次从网上临时搜索的,后期版本会改进 08.歌词不是卡拉OK方式,只是高亮了当前行 09.目前只支持从“搜狗音乐”上获取歌曲,敬请期待更多的搜索引擎 10.托盘菜单:下载列表,可以看到当前正在下载的歌曲,已经下载的不显示在这里。 11.托盘菜单:导出媒体库,目前只支持moto e6的导出,如果有需要请联系我 12.由于保护处理上有点问题,本次版本,可能将在 2012-12-05 之后无法使用,请联系我 13.程序启动后,自动设置为开机启动,暂时不可以取消,请谅解 14.本程序无其它联网行为,无其它操作行为,放心使用 15.需要 .net framework 2.0/4.0 任选一,WIN7用户默认就有2.0

DeepSeek-R1模型+Dify实战:5步打造能读PDF的智能客服(附BGE-M3嵌入模型配置)

本文详细介绍了如何利用DeepSeek-R1大模型与Dify平台,结合BGE-M3嵌入模型,构建企业级智能文档问答系统。通过5个步骤,从环境准备到知识库构建,再到智能问答应用开发,帮助企业快速从PDF等文档中提取关键信息,提升工作效率。特别适合处理产品手册、内部规程等专业内容。

convnet3designer的博客 720

MP3文件的ID3V1信息与ID3V2信息结构的分析

MP3文件的ID3V1信息与ID3V2信息结构的分析 ——吴俊涛2005/05/05E-mail:bo_tao@126.com  QQ:29248671主 页:http://wjt276.home4u.china.com(有源代码) 本人是一位编程爱好者,想通过VB。NET编写一个可以读取MP3文件的信息的不程序,可以不知道文件结构,呀我在网上找了好长时间(好几个月)都没有找到

old-li的blog 3589

LeRobot SO-ARM100 学习笔记(2) diffusion module

对 lerobot 中的 diffusion policy 进行基本的代码阅读

mikhailbran的博客 1586

java 获取mp3 id3v2_MP3文件的ID3V1信息与ID3V2信息结构的分析

MP3文件的ID3V1信息与ID3V2信息结构的分析——吴俊涛2005/05/05E-mail:bo_tao@126.com  QQ:29248671主 页:http://wjt276.home4u.china.com(有源代码)本人是一位编程爱好者,想通过VB。NET编写一个可以读取MP3文件的信息的不程序,可以不知道文件结构,呀我在网上找了好长时间(好几个月)都没有找到VB的。后来看到一个VC...

weixin_34675395的博客 482

先楫HPM6E00EVK EtherCAT从站配置与CIA402 8轴运动控制实战解析

本文详细解析了先楫HPM6E00EVK开发板的EtherCAT从站配置与CIA402 8轴运动控制实战。从环境准备、XML文件配置、代码移植到TwinCAT工程设置,提供了完整的移植指南,帮助开发者实现高效的多轴同步运动控制。

o5p6q的博客 416

论文浅读之PIP-Net: Patch-Based Intuitive Prototypes for Interpretable Image Classification

这篇文章的主要贡献包括:1 提出了一种新型的可解释图像分类模型PIP-Net,它基于原型部分学习可解释的原型,实现内置解释性。2 PIP-Net采用自监督学习的新正则化方法,学习原型之间的相似性,使得 latent 空间中的相似性能更好地与人类视觉感知相一致,从而减小了所谓的语义差距。3 PIP-Net可解释为一个稀疏的打分表,它可以检测图像是否属于任何类,或是否属于多个类。它也可以对OOD数据进行分类并说“我没有看到过这个”。

qq_49370210的博客 1791

APK Installer:Windows 平台安卓 APK 安装器的部署与操作指南

APK Installer 是 Windows 平台的安卓应用安装器,用于将 .apk 文件直接安装到安卓子系统 WSA(Windows Subsystem for Android)或已配对的安卓真机。它在安装前解析应用名称、版本、包名与完整权限清单,并封装 ADB 通信流程,省去命令行配置与手动传包环节。 ## 项目定位与核心能力 APK Installer 聚焦"在 Windows 上可控

gitblog_01050的博客 432

C#精准获取Windows已安装应用清单的完整方案

Windows已安装应用识别是IT资产管理、安全合规与自动化运维的基础能力。其核心原理在于突破文件系统表象,以注册表为可信数据源,分层解析HKLM/HKCU、64位/32位视图及MSI Products路径中的元数据。技术价值体现在可验证(如过滤SystemComponent=1)、可关联(通过ProductCode绑定补丁与许可证)、可操作(启动路径二次验证+卸载命令沙箱执行)。典型应用场景包括终端合规审计、软件资产清查、静默卸载脚本开发及多版本应用聚合分析。本文聚焦C#原生实现,覆盖注册表四路采集、La

weixin_33552698的博客 636

Ultimate Vocal Remover:5分钟从任何歌曲中提取纯净人声与伴奏的完整指南

你是否曾经梦想拥有一个魔法工具,能够将任何歌曲中的人声和伴奏完美分离?无论你是音乐制作人、内容创作者,还是普通的音乐爱好者,Ultimate Vocal Remover(UVR)都能让你的音频处理工作变得前所未有的简单。这款基于深度神经网络的开源工具,通过先进的AI技术实现了专业级的人声分离效果,让复杂的音频处理变得触手可及。 ## 真实困境:传统音频处理的三大挑战 在数字音频处理领域,分离人

gitblog_00183的博客 1112

【SAP HANA 24】HANA与Oracle SQL语法对照表

HANA SQL参考及Oracle 语法对照

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 1426

05、CAN 总线拓扑结构详解,线型拓扑搭建要点

CAN总线拓扑与信号完整性优化 本文通过工程实践经验,深入剖析了CAN总线系统中信号完整性的关键要素。主要内容包括: 终端电阻的核心作用:必须严格在总线两端配置120Ω电阻,形成60Ω等效阻抗以匹配双绞线特性阻抗,避免信号反射导致的波形畸变。 阻抗匹配原理:解释了信号能量管理机制,指出阻抗不连续会导致信号反射,并通过示波器波形特征(如振铃现象)判断阻抗失配问题。 信号完整性多维要求:强调信号质量不仅涉及波形存在与否,还包括边沿斜率、共模电压范围等关键参数,这些直接影响通信可靠性。 工程实践建议:提供了终端电

2401_88858637的博客 178

Ultimate Vocal Remover:5分钟用AI从任何歌曲提取纯净伴奏的完整指南

你是否曾经想从喜欢的歌曲中提取纯净伴奏用于卡拉OK,却苦于找不到合适的工具?Ultimate Vocal Remover(UVR)正是你需要的AI人声分离神器!这款开源工具利用先进的深度学习技术,让普通人也能在几分钟内完成专业级的音频分离,彻底改变你的音乐创作和娱乐体验。 [![Ultimate Vocal Remover神经网络图标](https://raw.gitcode.com/GitHu

gitblog_00994的博客 317

基于DynamicHead的YOLOv8四头版本改进:面向复杂场景的多目标检测优化【YOLOv8】

YOLOv8的检测头是通过不同尺度的特征层输出检测结果。这些检测头通常包括三个:用于大物体、中等物体和小物体的检测。然而,这种单一结构可能会在复杂场景下失去针对性和灵活性,特别是当多个目标之间差异较大时。为了进一步提升模型在特定目标上的检测性能,DynamicHead的引入为我们提供了一个多检测头的优化方案。本文提出了一种基于DynamicHead的四头版本YOLOv8改进方案,以解决复杂场景下多目标检测的挑战。通过引入四个独立检测头,分别针对不同目标特征进行优化,实现了更灵活的检测结构。

博客 1718

5分钟从歌曲中提取纯净伴奏:Ultimate Vocal Remover终极指南

还在为找不到高质量伴奏而烦恼?想要从歌曲中提取纯净人声进行翻唱?Ultimate Vocal Remover(UVR)正是你需要的AI音频分离神器!这款开源工具利用深度学习技术,让普通人也能轻松完成专业级的音频分离,彻底改变你的音乐创作体验。无论你是音乐爱好者、内容创作者还是播客制作人,UVR都能帮你快速提取纯净的伴奏或人声,释放音乐的无限可能。 ## 为什么选择Ultimate Vocal R

gitblog_00511的博客 454

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何把网易云NCM文件转成MP3:ncmdumpGUI免费指南

在网易云音乐里下载的歌,换到别的播放器就提示"无法识别的文件格式",车机更是直接拒绝播放。问题不在文件损坏,而在 NCM——网易云私有的加密格式。ncmdumpGUI 是一款免费开源的 Windows 图形界面工具,能把 NCM 转成 MP3、FLAC、WAV 等常见音频格式。 ## 批量把 NCM 转成通用音频格式 ncmdumpGUI 做的事只有一件:把你下载好的 NCM 文件,变成普通播

gitblog_00700的博客 1186

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: javascript 特殊字符的转换
下一篇: js 函数一览表
netnpc
博客等级 码龄19年 31粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值