kjb文件 解析_批量修改MP3文件信息

article/2025/10/13 16:44:02

前两天本人在整理自己的歌单时(题外话,本人是一个热衷音乐的程序员噢,哈哈),发现之前下载的很多MP3文件里的歌手,标题等信息对不上,很多都是错的。对于患有“强迫症”的本人来说,当然不会允许这种情况出现啊,哈哈。在查阅了一些资料,并且咬着牙关看了那些“经书”,花了两天终于解决。这里给大家分享一些经验和填补网上资料的一些坑,有兴趣的同僚可以参考参考。这里说一下本人在查阅资料的时候一些感受,我在查阅资料的有几篇文章都不错,但是有几个细节不一样,这样对于不熟悉这块知识的我,我根本不知道谁对谁错,所以最好的方式就是实践操作,毕竟实践是检验真理的唯一标准,嘿嘿。所以,在这里我想对各位同僚和我自己都劝告一下:如果对技术知识而言,我们只想了解,那么去网上看几篇好的文章足以,某些细节并不重要;但是如果学会的话,必须去亲手实践。因为,我们很可能学到知识都是错的(当然毕竟是少数)。好了,话不多,开始正题讲解。

首先,如何知道MP3文件里的歌手,标题信息等对不上呢?

这里提供两种常用方式查看,一种是通过操作系统查看;一种是各种音乐播放器查看。其实还有各种操作音频的工具软件,这里不提供,有兴趣的去网上搜一搜。

Windows操作系统截图:

ecf90d07424758a919017e4b810f10e4.png

酷我音乐播放器截图:

8c1c9b9867d4eb3c1fb70a253a8a2dad.png

我这里说明一下,我最开始以为MP3文件名,就是MP3标题名(歌名)。本人觉得这个是误区。所以,从上面两张图片可以看出,MP3文件名和标题名是两回事,从这里也可以得知,MP3文件的标题,歌手以及其他信息都是写在文件里的。所以要想修改MP3文件的标题,歌手等信息,就得修改MP3文件。

其次,如何修改MP3文件信息?

知道如何查看MP3信息后(后面调试程序,如何得知修改正确与否,用上述方法查看即可),下面就是修改MP3文件信息了。其实就两步,一步解析文件,二步写入文件。

解析文件:

这里我简单说明一下MP3文件信息,MP3文件主要有两大版本。分别是ID3V1、ID3V2版本。ID3V1版本比较简单一点,都是一些比较老的MP3文件才是ID3V1版本。MP3文件歌手、标题等信息都写在文件最后的128字节中。

详见下图:

b101b3d1bec3c92dbe784fc304e1b6cd.png

所以,知道MP3信息之后,就很容易修改了。以二进制形式读取文件,将文件数据都读取一个字节数组中。然后在对应的未知进行修改,超出部分补0即可。文章后面会给出能运行的完整源码实现(C/C++版本)。

ID3V2版本,就相比ID3V1版本麻烦一些,但也不是很难。网上说改版本又划分为1|2|3|4号字版本,3号子版本最常用。但本人解析的所有的ID3V2版本的MP3文件中,都是3号子版本,也许是本人的样本数量太小,这里不做深究。下面给出一张图进行说明:

97b268534cbffa23fc294510e85cdf63.png

标签头组成,见下图:

f3c5201f30a8870534c8499246081d8f.png

上面标红的值需要关心,其它字段对于修改MP3信息而言,并不重要。这里需要说明一下长度字段,我看了几篇文章,有两种答案(一种是包括标签头大小,一种是不包括标签头大小)。但是我分别使用这两种方案计算,并不影响结果,所以本人也就没继续深究了,感兴趣的同僚可以研究一下,如果可以顺便告诉一下本人,嘿嘿。

标签帧组成,见下图:

e2a704cd8f881656e51ccffba3962daa.png

上面标红的值需要关心,其它字段对于修改MP3信息而言,并不重要。这里我说明一下信息类型字段混合帧内容字段。信息类型是有个表的,这里不给出所有,只给出我这个程序用到的。

  1. TIT2 ---- 歌名、标题
  2. TPE1 ---- 歌手、创作者
  3. TALB ---- 专辑、唱片

帧内容字段,这里需要特别说明,各种乱因为网上很多文章都不对帧内容进行说明,导致我在解析帧内容时各种乱码,也因此花了些时间。帧内容第一个字节是内容编码格式,有三种。当值为0时,为GBK;当值为1时,为UNICODE;当值为2时,为UTF-8。这里说明一下,当为UNICODE编码时,如果直接读取内容,最开始会有个问号字符,如果偏移2个字节在进行读取,就不会有问号(这里我也不知道为什么,在网上查没有查到,我解析的所有MP3文件都是得偏移2个字节)。

通过上诉说明,发现其实ID3V2也并不是那么复杂,所以修改MP3文件时,把原来的标签帧去掉,写入新的标签帧信息,然后修改标签头长度,最后保存至新的MP3文件即可。

当然,上诉说的都是正常规范的MP3文件,其实还有很多不规范的MP3文件,比如果有的没有标题、歌手、专辑等信息;有的没有标签信息;有的标签帧的帧内容长度是错的等等(这个是ID3V2版本),在实际的过程中这些问题都可能会遇到。但是别慌,实践调试是最好的“老师”。所以我经过了上百次的调试,才大概完成了这个程序。本人收录的近700个MP3文件全部修改正确。下面是修改后的图:

ee1a33ff8481a13806e2234117e634c7.png

大家可以看到,唱片集信息已经改成本人的公众号了(哈哈)。下面给出我用C++语言实现的版本源码地址,需要说明一下的是,测试的时候,将MP3文件改成【xxx】xxx.mp3命名格式,不然会出错。当然如果你会了,就很容易修改我的代码,祝早点成功。

链接:https://pan.baidu.com/s/1lKEe-C6YcjwIvFQtLS7GZA

提取码:l6an


http://chatgpt.dhexx.cn/article/fnfJxm2E.shtml

相关文章

Kettle【实践 01】Linux环境下使用Azkaban定时调用Kettle的KJB或KTR脚本实现自动化数据处理(完整流程实例分享:包含sql+ktr+shell+flow相关文件云资源)

资源链接在文章末尾,包含文件: 1. 说明 Kettle 的 KJB 或 KTR 调用使用的 shell 脚本,小伙伴可能会想,可以用 Linux 的 crontab 进行任务的调度啊,为什么需要 Azkaban 这个批量工作流任务调度器呢?原因是,如果出现调度任务的依赖关系,比如数据抽取的任务执行结束后调…

linux运行ktr文件,Linux下用命令來執行kettle文件資源庫的文件ktr與kjb的方法

1. 准備工作 一個簡單的job,一個簡單的trans。 trans:讀取download目錄下的所有文件名,輸出為文件。【界面情況下測試成功】 成功生成目標文件: job:創建文件。【界面模式測試執行成功】 執行結果: 把界面執行測試結果文件刪除,以免影響觀察。 2. linux環境以命令行方式…

用window调用kjb和ktr

1. 运行cmd,进入kettle的目录cd C:\soft\kettle\data-integration 2. 运行start pan.bat命令 Pan—转换执行器(命令行方式),一般在自动调度时借助此命令调用调试成功的转换(transform) 3. 弹出新的cmd窗口 4. 运行kitchen.bat,弹…

spring boot 整合kettle调用ktr与kjb文件

前言 在积累的过程中要学会思考,才能成长。 1.导入jar包 新建一个spring boot项目后,为了使整合的项目正常运行需要导入kettle相应的jar包,我所用kettle的版本为8.20。使用的jar包如下图所示(这些jar包可以在kettle的lib目录下…

linux kettle命令,Linux下用命令来执行kettle文件资源库的文件ktr与kjb的方法

1. 准备工作 一个简单的job,一个简单的trans。 trans:读取download目录下的所有文件名,输出为文件。【界面情况下测试成功】 成功生成目标文件: job:创建文件。【界面模式测试执行成功】 执行结果: 把界面执行测试结果文件删除,以免影响观察。 2. linux环境以命令行方式…

Kettle【实践 04】Java环境实现KJB和KTR脚本文件执行v9版本9.0.0.0-423相关依赖说明(云资源分享:依赖包+kjb+ktr+测试源码)

资源链接在文章末尾,包含文件: test.job 和 test.ktr 都是简单的创建一个文件,目的是能够快速看到执行结果: 1.需求说明 Kettle 是用 Java 开发的,有些时候编写的 KJB 或者 KTR 脚本会实现特定的功能,比如从一个表导数据到另一个表等等,如果想要在 Java 项目中使用这些…

实战——Linux定时执行Kettle的kjb文件

公司有很多业务使用了Kettle来抽取数据,Kettle比较强大,它自身就支持定时任务执行,操作步骤如下: 设置kjb文件 使用spoon编写好kettle服务 设置定时任务 设置具体的定时任务 设置完成后,保存即可。 设置定时启动&am…

Spoon-kjb

SQL脚本 如果脚本连接的是Oracle数据库,SQL中就不能使用变量,SQL语句也无需用分号结尾(也不能以分号结尾,否则会报错无效字符)。 如果脚本连接的是Hive数据库,SQL语句可以用分号结尾。SQL中可以使用变量&am…

kjb文件 解析_NVH原始数据文件如何读取 Part2

“前一篇文章介绍了NVH数采系统记录的原始文件常见的几种数据格式。本篇将介绍怎样找到具体的数据位置并还原它,从而实现编程直接读取原始文件的目的。” 01 — 画出整体数据 前一篇文章提到:数采系统记录的原始数据包含两部分:ASCII码明文和…

Java调用kjb文件

目录 一、kjb和ktr文件创建 kjb文件 ktr文件 关联kjb和ktr 变量信息 二、 Java代码调用kjb 引包 放入kjb和ktr文件 三、代码调用 定时任务 一、kjb和ktr文件创建 kjb文件 首先先新建一个Job,如下图所示,这样就新建了一个kjb文件,即…

SpringDataJPA(5)jpql查询

JPQL全称Java Persistence Query Language 这是JPA提供的复杂查询 sql:查询的是表和表中的字段 jpql:查询的是实体类和类中的属性 jpql和sql语句的语法相似 进行sql查询的步骤 1.创建query查询对象 2.对参数进行赋值 3.查询,并得到返回结果…

JPA的查询语言JPQL

JPA的查询语言(JPQL)是一种和SQL非常类似的中间性和对象化查询语言。它可以被编译成不同的底层数据库能接受的SQL,从而屏蔽不同数据库的差异,确保用JPQL查询语言编写的代码可在不同的数据库上运行。比起EJB 2.1的查询语言,EJB3可以运行期构造…

JPQL语句

JPQL语言 JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。 JPQL语言的语句可以是 select 语句、upda…

jpa之jpql查询

JPQL介绍 JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。如果会hibernate的hql查询,那…

SpringData JPA进阶查询—JPQL/原生SQL查询、分页处理、部分字段映射查询

上一篇介绍了入门基础篇SpringDataJPA访问数据库。本篇介绍SpringDataJPA进一步的定制化查询,使用JPQL或者SQL进行查询、部分字段映射、分页等。本文尽量以简单的建模与代码进行展示操作,文章比较长,包含查询的方方面面。如果能耐心看完这篇文…

JPA之JPQL

文章目录 什么是JPQL?JPQL怎么用?JPQL的查询demoJPQL的占位符与入参问题修改demo删除demo插入demo 什么是JPQL? 所谓JPQL,就是Java Persistence Query Language的缩写,也就是java持久化查询语言.JPQL是一种可移植的查询语言&am…

JPQL-Query查询实例详解

前面学习了JPQL语言和Query接口。这里学习一下如果通过JPQL和Query接口进行数据的查询、更新和删除。 【1】普通查询 首先说明一下FROM子句和Select…FROM。 from 子句是查询语句的必选子句。 Select 用来指定查询返回的结果实体或实体的某些属性。 From 子句声明查询源实体…

JPQL和SQL的比较

前言 在JAVA EE中,JPQL是专门为Java 应用程序访问和导航实体实例设计的。Java Presistence Query Language(JPQL),java持久性查询语言。它是JPA规范的重要组成部分,其实它就是一种查询语言,语法类似于SQL语法,但是有着…

【JPQL】--JPQL和SQL的比较

前言 在JAVA EE中,JPQL是专门为Java 应用程序访问和导航实体实例设计的。Java Presistence Query Language(JPQL),java持久性查询语言。它是JPA规范的重要组成部分,其实它就是一种查询语言,语法类似于SQL语法,但是有着…

JPA - JPQL完成复杂的多表查询

目录 前言示例建表语句Entity实体JPQL多表查询完整代码调用结果 前言 JPA中可以通过设置实体的导航属性 JPQL完成复杂的多表查询,简化SQL的编写。 示例 建表语句 Table CREATE TABLE school (id int(11) DEFAULT NULL,name varchar(50) COLLATE utf8_unicode_c…