自制联想i966手机音乐播放列表

i966电话可以支持播放MP3和WMA两种格式的声音文件,并且可以连接蓝牙立体声耳机 。可是,不知产品设计的时候出于什么考虑,在音乐播放方面出了纰漏 。
我喜欢在锻炼身体的时候,听评书或者小说的音频文件 。你知道,运动的时候,最好就是带着蓝牙立体声耳机——因为没有线的束缚很方便 。但是i966的播放器跟了我很大的打击:
1、音频播放器,不支持播放单个子目录的音乐文件!这使得每次要在几百个都放在music目录下的音频文件中寻找自己想要的那一个非常费力 。
2、那好,你不是支持播放列表吗?咱不怕麻烦建立播放列表!小说的音频文件一般都会压缩成比较小的WMA格式,可是发现建立播放列表的功能里面竟然无法增加wma文件!MP3文件也有见不到的 。(明显是BUG) 。
【自制联想i966手机音乐播放列表】3、咱不用播放器,在文件夹里面不是可以直接播放音频文件吗?咱不怕费力,每次都找呗 。可是又发现了致命的毛病:在文件夹中直接播放音频文件竟然不支持蓝牙耳机!每次声音都是从扬声器中传出来的(不知道设计的时候出于什么考虑?),最要命的是,文件夹中直接播放音频使用的简易播放器不能实现快进,在听一集半小时的评书一半的时候,突然来个短信,整个就停了!你还要从头开始再听一次嘛?我完全疯了!
真的就这么难吗?
我想了几种方案解决这个问题,首先可以肯定的是,我必须使用多媒体功能里面的音乐播放器,因为文件夹里面的简易播放器实在没法弄 。于是就要想办法让前者支持wma的播放列表 。否则,全都转换为MP3文件,占用空间太大,而且选择歌曲也忒不方便了!(再鄙视一下不支持播放文件夹的设计!) 。所以我决定还是看看能不能自己生成播放列表,让播放器支持我的需求!
一、首先要分析i966的播放列表 。
我建立了一个小的播放列表,发现是在手机内存的音乐目录下,产生一个叫做XXX.lst的文件 。于是传到电脑上分析,一看,并非我想象的文本文件,是一个二进制文件 。而且还是编码过的 。通过列表中的几个英文歌曲名,我经过试验,终于搞清楚的它的结构:每条歌曲名占152个字节固定长度,最前面2个字节是表示音乐存放的位置,01表示在手机内存,02表示在存储卡上面,在后面跟随着是utf-8(ucs-2)编码的歌曲名称(一看就是高级语言用序列化写的文件) 。文件结尾,跟一个文件结束符3E 。
二、实验
我必须验证一下设计师在设计播放列表的时候不支持WMA是忘了,还是真的另有原因!于是我在UltraEdit手工编辑了一个播放列表,带有WMA文件的,传到手机上实验,支持得非常好!这下就放心了
三、写程序!
知道了文件格式,写程序就简单了,我本来想写一个Windows程序给大家共享,可后来想,这些明显的问题,也许厂家下个版本的升级就会解决了 。就不费劲了 。还是用perl写命令行脚本好了 。好在perl语言对unicode支持得相当好!我写的源代码就不全列出来了,其实就是读一个编辑好的文件,然后转成一条条的unicode二进制文件保存起来 。其中转换部分的代码如下:
foreach $inline (@in_file)
{
chomp($inline);
@line = split(/,/ , $inline);
if($line[0] eq "1")
{
$mem = "x00x01";
}
else
{
$mem = "x00x02";
}
$songname = $line[1];
$songname = decode("gb2312",$songname);
$songname = encode("ucs-2",$songname);
$namelen = length($songname);
$zeronum = 152 - 2 - $namelen;
print OUT ($mem.$songname);
for($i=0;$i<$zeronum;$i)
{
print OUT ("x00");
}
print $inline."n";
}
print OUT ("x00x3E");

推荐阅读