linux给音乐添加封面,linux系统获取MP3的专辑封面图片
linux系统获取MP3的专辑封面图片
背景
我们播放的MP3格式的音乐的时候,有的显示专辑封面图片,有的不显示,这是为什么呢?是这样的,我们看到的MP3文件不仅仅包含听到的那些声音,其实作为一个MP3文件它还包含描述这首歌的一些文字信息(标题名、作者、专集名、年代、风格等等)和歌词信息,还有内嵌的专辑封面图片等信息。但是并不是所有的MP3文件制作的时候都内嵌了图片,所以有的MP3文件播放的时候,可以显示专辑封面图片,有的不能显示专辑封面图片。一些音乐播放器有修改歌曲封面图片的功能,这里我们来讲一讲怎么自己编写代码(C语言实现)来提取歌曲封面图片。
MP3文件构成
MP3文件(二进制文件)分为三个部分:ID3V2标签、音频数据和ID3V1标签,其中ID3V2标签位于MP3文件的开头,中间为音频数据,ID3V1标签位于MP3文件的结尾。ID3V1只是包含歌曲名、作者、专集名、日期和歌曲风格等基本信息,而ID3V2标签不但包含ID3V1标签的所有信息,还包含专辑封面图片信息,MP3文件的构成如下图所示。
注:封面图片一般是JPEG格式的图片,也有PNG、BMP格式的文件,本文以JPEG格式的图片来讲解,其他格式的原理也是一样的。
实现原理
对MP3二进制文件进行解析,主要是对ID3V2标签进行解析,取得其中的专辑封面图片的数据,然后将图片数据保存为指定类型的图片(通过指定文件扩展名实现),存储到指定路径,需要使用图片的时候,到该路径取得就可以。ID3V2标签的解析下文会详细讲解。
实现方法/步骤
1、打开MP3二进制文件(fopen)
2、取MP3文件前3个字符进行判断,如果为“ID3”,则说明该MP3文件包含ID3V2标签。
3、计算MP3文件数据总的大小,MP3文件的第7~10字节(4个字节)保存MP3文件数据总的大小。
4、取得ID3V2标签帧的帧头
.解析出当前的帧标识,根据这个可以确定MP3数据信息的类别
.计算当前的帧内容的长度,即获得类别信息的大小
5、判断MP3二进制文件中是否有专辑封面图片
如果帧标识为“APIC”,说明MP3中含有专辑封面图片。
6、图片文件格式判断
.jpeg文件标志的前两个字节为FF、D8
.png文件标志的前两个字节为89、50
注:当步骤5判断为有图片的时候,从帧标识为“APIC”的帧头位置开始,如果连续的两个字节为FF和D8,说明这个图片为jpeg文件,即FF、D8是jpeg文件的开始标志。
7、将MP3二进制文件中的图片数据读取出来,保存为jpeg文件
得到了jpeg文件的开始位置(FF、D8),也知道jpeg文件数据的大小,就可将这部分二进制数据取出,保存成扩展名为“XXX.jpeg”的文件。
知识点讲解
以下内容为扩展信息,作为对以上内容的补充说明。
ID3V2标签简介
每个ID3V2的标签都有唯一一个标签头和若干个标签帧组成(每个标签至少要有一个标签帧),标签头和标签帧一起顺序存放在MP3文件的开始位置。MP3的信息如标题、作者、专辑封面图片等都存放在不同的标签帧中。
ID3V2标签头
ID3V2标签头信息位于MP3文件的开始处,长度为10个字节。数据结构如下:
char Header[3]; /*必须为"ID3"否则认为标签不存在*/
char Ver; /*版本号;ID3V2.3就记录03,ID3V2.4就记录04*/
char Revision; /*副版本号;此版本记录为00*/
char Flag; /*存放标志的字节,这个版本只定义了三位,其它位为0*/
char Size[4]; /*标签大小,包括标签帧和标签头。(不包括扩展标签头的10个字节)*/
如下图利用UltraEdit打开一个mp3文件(文件名为“阿福(邓福如)-天使.mp3”):
说明:
1、前3个字节为49,44,33对应的ascii码就是ID3,因此判断存在ID3V2标签
2、第4个字节为03,说明这个音乐文件的标签是ID3V2.3格式
3、第5个字节为00,说明副版本号为0,即版本为ID3V2的3.0版本
4、第6个字节为00,标志字节一般为0,定义如下(abc000000B)
a:表示是否使用Unsynchronisation
b:表示是否有扩展头部,一般没有,所以一般也不设置,默认值为0
c:表示是否为测试标签,99.99%的标签都不是测试标签,不设置,默认值为0
5、第7~10个字节为00,03,48,60,记录的是整个标签的大小(字节数),但每个字节只用7位,最高位不使用恒为0,计算公式如下:
nTagSize = ((size[0] & 0xff) << 21)
|((size[1] & 0xff) << 14)
|((size[2] & 0xff) << 7)
|(size[3] & 0xff);
ID3V2标签帧
每个标签帧都有10个字节的帧头(和ID3V2标签头不是一个东西,虽然他们刚好都是10字节,每个ID3V2标签只有一个标签头,而每个标签帧都有一个帧头,一个ID3V2标签有几个标签帧就会有几个帧头)和至少一个字节的帧内容构成,标签头与标签帧(帧头和帧内容构成)之间无特殊字节分割,只能通过帧头信息来确定帧内容的大小,ID3V2标签帧的构成如下图所示。
帧头
每一个ID3V2标签帧都有一个帧头。
帧头结构
帧头长度10字节,由3部分构成,数据结构如下:
char ID[4]; /*标识帧,说明其内容,例如作者/标题等*/
char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
char Flags[2]; /*标志帧,只定义了6 位*/
帧头详细说明
标识帧,常见的内容如下:
TIT2 = 标题 表示内容为这首歌的标题
TPE1 = 作者 表示内容为这首歌的作者
TALB = 专集 表示内容为这首歌的专集
TRCK = 音轨 格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
TYER = 年代 是用ASCII码表示的数字
TCON = 类型 直接用字符串表示
COMM = 备注 格式:"eng\0备注内容",其中eng表示备注所使用的自然语言
APIC = 专辑图片
帧内容
帧头长度为10字节,从帧头标识帧开始位置,向后加10个字节,为该帧内容的开始位置,大小在帧头中已经指定。
linux给音乐添加封面,linux系统获取MP3的专辑封面图片相关推荐
- linux给音乐添加封面,利用ffmpeg读取音乐文件的专辑信息(包括专辑封面图片)
工作原理 读取metadata AVFormatContext 结构体中有一个属性是metadata,我们在读取一个多媒体文件的时候,可以通过AVDictionaryEntry访问这个属性的数据. A ...
- mp3 添加封面 linux,Qmmp音乐播放器1.2.0发布! Ubuntu中安装方法
Qmmp是一款基于Qt的音乐播放器,它具有winamp或xmms接口,目前已经发布了1.2.0版本(Qt4版本为0.11.0),并增加了许多新功能,改进以及一些错误修复. Qmmp 1.2.0(0.1 ...
- linux服务器怎么添加路由,linux系统中添加路由的方法
linux系统中添加路由的方法 发布时间:2020-06-17 11:38:59 来源:亿速云 阅读:95 作者:Leah 这篇文章将为大家详细讲解有关linux系统中添加路由的方法,小编觉得挺实用的 ...
- linux命令的添加用户,Linux基础命令---添加用户useradd
useradd 创建新的系统用户,useradd指令只能以管理员的身份运行,创建的用户都在"/etc/passwd"文件中.当不加-D参数,useradd指令使用命令列来指定新帐号 ...
- linux环境下添加定时任务,linux下添加定时任务。
这周要做一个定时增量更新Elasticsearch索引的功能,以前没有做过定时更新,所以请教了下同事,使用crontab添加linux下的定时任务. 一.linux下定时执行任务的方法 在linux中 ...
- java 获取mp3 封面_android 怎样获取歌曲的专辑封面
展开全部 该图片为使用如下代码解e5a48de588b662616964757a686964616f31333339666135析得到: 参考源码中,音乐目录: packages/apps/Music ...
- linux下spi添加设备,Linux Kernl添加spidev的设备节点
一.spidev介绍 如果在内核中配置spidev,会在/dev目录下产生设备节点,通过此节点可以操作挂载在该SPI总线上的设备.用户空间通过该节点可以访问内核空间. 二.配置spidev设备步骤 在 ...
- linux下mqm添加用户,Linux 下MQ的安装和配置亲测
开篇之前奉上几条黄金链接: MQ参考文档 http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic=%2Fcom.ib ...
- linux中怎么添加输入法,linux下添加中文输入法
一.安装环境 查看linux版本号 [ztteng@ztteng ~]$ lsb_release -a LSB Version: :core-4.0-ia32:core-4.0-noarch:g ...
最新文章
- python归一化代码_python中的快速图像归一化
- Python入门100题 | 第035题
- C语言实现01字符转比特流
- 关于Django中JsonResponse返回中文字典编码错误的解决方案
- Permutations II
- 中秋节PSD分层模板|电商营销借势促销,快快收藏!
- PHP如何获取用户IP地址
- 手机怎么更改ip地址
- 记:STM32F205双USB开发做device
- Python快速判断素数方法
- Windows 错误代码
- 计算机色彩学,浅析色彩原理
- Win11文件资源管理器有明显卡顿,微软承诺在2022年提高性能
- SMILES学习笔记
- Work around for SQL Configuration Manager Consol
- 农村小伙不畏艰难,创业开装饰公司,年产值竟达上千万元?
- 2021年flutter开发宝淘买菜前后端源码-免费开源
- 微软官方原版win7(64位/32位)旗舰版系统下载【适合所有品牌】
- 左移寄存器vhdl_基于VHDL的移位寄存器设计
- 【Lintcode】1718. Minimize Malware Spread
热门文章
- 3Com Network Supervisor与IBM Tivoli NetView两款网管软件操作视频
- # cmake --version -bash: /usr/bin/cmake: Too many levels of symbolic links
- Vue源码之计算属性watcher
- 空气质量预测 灰色预测模型 模糊综合评价模型
- 我打算学python,可是我的拖延症已经晚期了
- 视频如何转换成mp3
- html中visibility属性,(CSS) 不同浏览器对table中visibility属性显示的不同
- 解决c3p0连接池异常问题
- launch 启动脚本_使用Microsoft Speed Launch快速启动快捷方式
- mysql记录到毫秒,记录到微妙