0、首先得理解MP3格式文件的结构

简单的就是

MP3 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)

参考此博客:点击打开链接

ID3V1的结构是:

表1:ID3V1结构 -------------------------------------------------------------------- 名称 字节   说明 -------------------------------------------------------------------- Tag   3   ID3V1标识符“TAG”的Ascii码 Title  30  歌曲名 Artist  30  歌手名 Album  30  专辑名 Year   4   日期信息 Comment 28  注释信息,有时为30字节 Reserved 1   =0说明有音轨,下一字节就是音轨;≠0表示注释是30个字节 Track  1   音轨(字节型数值),歌曲在专辑里的序号 Genre  1   歌曲风格(字节型数值) --------------------------------------------------------------------

参考博客链接:点击打开链接

1、为什么会乱码?

看起来是MediaScaner 原生的Flow的缺陷,非中文地区设置,如果编码是GBK格式的则会乱码.

2、乱码了怎么解决?

1中的链接是在MediaScanner的源码解决的,我要说的是apk的解决方法

手动读取ID3V1的数据,从而读取出演唱者信息 ,下面看代码:

private synchronized BaseData dealWithMp3Messy(BaseData currentMusic){

String contry = Locale.getDefault().getCountry() ;

if((!contry.equalsIgnoreCase("CN"))

&&(!contry.equalsIgnoreCase("HK"))

&&(!contry.equalsIgnoreCase("TW"))){

return currentMusic;

}

String currentMp3Path = currentMusic.getPath() ;

if(!currentMp3Path.toLowerCase().trim().endsWith("mp3")){

return currentMusic;

}

RandomAccessFile raf = null ;

try{

raf = new RandomAccessFile(currentMp3Path, "r") ;

raf.seek(raf.length() - 128) ;

byte[] buff = new byte[128] ;

raf.read(buff) ;

String Tag = new String(buff,0,3,"GBK") ;

if(buff.length == 128 && "TAG".equals(Tag)){

String artist = new String(buff,30,33,"GBK").trim() ;

Log.i(TAG, "deal with mp3 messy,mp3 artist=******"+artist+"****** and currentMp3Path="+currentMp3Path) ;

if(!TextUtils.isEmpty(artist)){

currentMusic.setArtist(artist) ;

return currentMusic ;

}

}

}catch(Exception e){

e.printStackTrace();

}finally{

if(raf != null){

try{

raf.close() ;

}catch(Exception e){

}finally{

raf = null ;

}

}

}

return currentMusic ;

}

这段code的意思是:在非中文地区的设置下,MP3的ID3V1的编码格式如果是GBK的话,

RamdomAccessFile 可以随意seek到某个字节处来读取文件

读取30到33的演唱者信息出来。就大功告成了。

以上解决了MediaScanner 读取MP3 ID3文件乱码问题

android mp3 乱码,android MediaScanner 扫出来的ID3 MP3文件演唱者信息 乱码相关推荐

  1. linux 解压文件乱码,云服务器:解决linux下zip文件解压乱码问题

    云服务器:解决linux下zip文件解压乱码问题 原因 由于zip格式并没有指定编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,因此,导致这些zip文件在Linux下解压时 ...

  2. js java 中文乱码_编码问题(.java/.jsp/.js等文件的中文乱码)

    乱码的出现是因为编码与解码的不一致造成的,假如你对"中文"两个字进行了gbk格式的保存,却用utf-8格式的解读,是肯定会出现乱码的. 如何避免中文乱码:应用上下统一用一种编码格式 ...

  3. java写出文本文档乱码_对象流如何写出到文件以及为什么乱码

    在写入对象文件的过程中,采用了txt文件,发现文件乱码,引发了思考. 首先需要理解好IO流是如何处理文件的. 1.ObjectOutputStream 对Java对象进行序列化处理,处理后的数据,不是 ...

  4. linux top p 乱码,将Linux top命令输入到指定文件时的乱码问题

    根据需求,项目需要读取linux系统环境参数,所以需要将top命令的输出结果输入到文件中.用重定向命令如下:top > result.txt .用vi打开文件: vi result.txt .显 ...

  5. Android实现mp3分析,Android编程实现播放MP3功能示例

    本文实例讲述了Android编程实现播放MP3功能.分享给大家供大家参考,具体如下: 在android中播放mp3非常简单,也是项目中经常使用的,比如说要做项目的背景音乐,应用中某些功能的提示音等的. ...

  6. android audiotrack mp3,播放mp3数据压缩由JLayer和Audiotrack latin mp3在android

    我跟着这个example转换来自AudioRecord原始音频数据为MP3,并且它成功发生,如果我将这个数据存储在一个文件的MP3文件和播放与音乐播放器,然后它是可以听到的.播放mp3数据压缩由JLa ...

  7. 用Android和node.js实现扫码登录

    实现思路 step 1: 网页端提供二维码 step 2: 手机端登录,并保存token,手机扫码后向网页端发送token step 3: 网页端通过jstoken解析token,向后端服务器获取用户 ...

  8. android播放mp3功能,Android编程实现播放MP3功能示例

    本文实例讲述了android编程实现播放mp3功能.分享给大家供大家参考,具体如下: 在android中播放mp3非常简单,也是项目中经常使用的,比如说要做项目的背景音乐,应用中某些功能的提示音等的. ...

  9. Android JNI开发之使用Lame将录音转MP3

    写在前面 开发环境 前言 Lame 源码下载 写在前面 由于在写之前在网上搜了搜,发现GIthub上已经有AndroidStudio版使用Lame转Mp3的了,所以这篇博客写的例子是Eclipse版本 ...

最新文章

  1. Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2)
  2. python matplotlib.pyplot.imshow() (在2D常规栅格上显示图像(数据))
  3. 成大事必备9种能力、9种手段、9种心态
  4. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
  5. python几乎无所不能 只有你不知道的,如何通过Python玩转小视频
  6. 音视频技术开发周刊(第122期)
  7. 数据列表的分页实现————分页敏捷开发
  8. ZooKeeper 典型应用场景有哪些?
  9. [bzoj 1452] [JSOI2009]Count
  10. Gitblit Git 无密码 clone pull SSH Key 生成
  11. linux的I/O多路转接select的fd_set数据结构和相应FD_宏的实现分析
  12. Python-Cartopy制图学习02-中国2010年5月干旱情况空间制图
  13. 学习C语言未来的发展方向
  14. 怎么把多个excel内容汇总到一个excel里面
  15. SPEA2算法原理及应用方向
  16. python英语词汇读音_Python 将英语单词列表,转换为听写使用的MP3格式(每个单词朗读两遍)...
  17. 美通企业日报 | 网龙互动白板获德国红点设计奖;芬美意在华开设全球最大食用香精厂...
  18. 【电气专业知识问答】问:WXJ-11B微机蓄电池巡检装置的功能、特点和工作原理是什么?
  19. R语言 关于h2o深度学习的一些心得
  20. SpringBoot+Vue项目漫画网站

热门文章

  1. CSS水平、垂直布局、盒子
  2. HJS-DE1/2时间继电器
  3. $forceUpdate()函数
  4. Matlab三维折线图绘制–surf 函数的使用
  5. 论vbs----从vbs基础语法 到 用VBS搞怪
  6. 浙江省计算机二级高级技术,浙江省计算机二级办公软件高级的应用技术上机考试的技巧解析.doc...
  7. 安装mrt时怎么安装java_科学网—MODIS Reprojection Tool (MRT)安装及使用说明(转载) - 孙晓芳的博文...
  8. FL Studio 2023最新发布的21版本新功能介绍/主题包/下载安装激活教程
  9. 为12306点赞!高铁动车买票正式上线选座功能
  10. SpringBoot实战教程(3.1)——失败重试机制