i966電話可以支持播放MP3和WMA兩種格式的聲音文件,并且可以連接藍(lán)牙立體聲耳機(jī)。可是,不知產(chǎn)品設(shè)計(jì)的時(shí)候出于什么考慮,在音樂(lè)播放方面出了紕漏。
我喜歡在鍛煉身體的時(shí)候,聽(tīng)評(píng)書(shū)或者小說(shuō)的音頻文件。你知道,運(yùn)動(dòng)的時(shí)候,最好就是帶著藍(lán)牙立體聲耳機(jī)——因?yàn)闆](méi)有線的束縛很方便。但是i966的播放器跟了我很大的打擊:
1、音頻播放器,不支持播放單個(gè)子目錄的音樂(lè)文件!這使得每次要在幾百個(gè)都放在music目錄下的音頻文件中尋找自己想要的那一個(gè)非常費(fèi)力。
2、那好,你不是支持播放列表嗎?咱不怕麻煩建立播放列表!小說(shuō)的音頻文件一般都會(huì)壓縮成比較小的WMA格式,可是發(fā)現(xiàn)建立播放列表的功能里面竟然無(wú)法增加wma文件!MP3文件也有見(jiàn)不到的。(明顯是BUG)。
3、咱不用播放器,在文件夾里面不是可以直接播放音頻文件嗎?咱不怕費(fèi)力,每次都找唄。可是又發(fā)現(xiàn)了致命的毛病:在文件夾中直接播放音頻文件竟然不支持藍(lán)牙耳機(jī)!每次聲音都是從揚(yáng)聲器中傳出來(lái)的(不知道設(shè)計(jì)的時(shí)候出于什么考慮?),最要命的是,文件夾中直接播放音頻使用的簡(jiǎn)易播放器不能實(shí)現(xiàn)快進(jìn),在聽(tīng)一集半小時(shí)的評(píng)書(shū)一半的時(shí)候,突然來(lái)個(gè)短信,整個(gè)就停了!你還要從頭開(kāi)始再聽(tīng)一次嘛?我完全瘋了!
真的就這么難嗎?
我想了幾種方案解決這個(gè)問(wèn)題,首先可以肯定的是,我必須使用多媒體功能里面的音樂(lè)播放器,因?yàn)槲募䦅A里面的簡(jiǎn)易播放器實(shí)在沒(méi)法弄。于是就要想辦法讓前者支持wma的播放列表。否則,全都轉(zhuǎn)換為MP3文件,占用空間太大,而且選擇歌曲也忒不方便了!(再鄙視一下不支持播放文件夾的設(shè)計(jì)!)。所以我決定還是看看能不能自己生成播放列表,讓播放器支持我的需求!
一、首先要分析i966的播放列表。
我建立了一個(gè)小的播放列表,發(fā)現(xiàn)是在手機(jī)內(nèi)存的音樂(lè)目錄下,產(chǎn)生一個(gè)叫做XXX.lst的文件。于是傳到電腦上分析,一看,并非我想象的文本文件,是一個(gè)二進(jìn)制文件。而且還是編碼過(guò)的。通過(guò)列表中的幾個(gè)英文歌曲名,我經(jīng)過(guò)試驗(yàn),終于搞清楚的它的結(jié)構(gòu):每條歌曲名占152個(gè)字節(jié)固定長(zhǎng)度,最前面2個(gè)字節(jié)是表示音樂(lè)存放的位置,01表示在手機(jī)內(nèi)存,02表示在存儲(chǔ)卡上面,在后面跟隨著是utf-8(ucs-2)編碼的歌曲名稱(一看就是高級(jí)語(yǔ)言用序列化寫的文件)。文件結(jié)尾,跟一個(gè)文件結(jié)束符3E。
二、實(shí)驗(yàn)
我必須驗(yàn)證一下設(shè)計(jì)師在設(shè)計(jì)播放列表的時(shí)候不支持WMA是忘了,還是真的另有原因!于是我在UltraEdit手工編輯了一個(gè)播放列表,帶有WMA文件的,傳到手機(jī)上實(shí)驗(yàn),支持得非常好!這下就放心了
三、寫程序!
知道了文件格式,寫程序就簡(jiǎn)單了,我本來(lái)想寫一個(gè)Windows程序給大家共享,可后來(lái)想,這些明顯的問(wèn)題,也許廠家下個(gè)版本的升級(jí)就會(huì)解決了。就不費(fèi)勁了。還是用perl寫命令行腳本好了。好在perl語(yǔ)言對(duì)unicode支持得相當(dāng)好!我寫的源代碼就不全列出來(lái)了,其實(shí)就是讀一個(gè)編輯好的文件,然后轉(zhuǎn)成一條條的unicode二進(jìn)制文件保存起來(lái)。其中轉(zhuǎn)換部分的代碼如下:
foreach $inline (@in_file)
{
chomp($inline);
@line = split(/,/ , $inline);
if($line[0] eq "1")
{
$mem = "\x00\x01";
}
else
{
$mem = "\x00\x02";
}
$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 ("\x00\x3E");
close(OUT);
我這個(gè)程序具體用法是這樣的:用記事本編寫一個(gè)文本文件:每一行代表一個(gè)曲目,前面是1或者2,表示存儲(chǔ)位置,1是手機(jī)內(nèi)存,2是存儲(chǔ)卡。隔一個(gè)逗號(hào),接下來(lái)是音頻文件名。看起來(lái)像這樣子:
2,邪兵譜 (01).wma
2,邪兵譜 (02).wma
2,邪兵譜 (03).wma
2,邪兵譜 (04).wma
2,邪兵譜 (05).wma
2,邪兵譜 (06).wma
2,邪兵譜 (07).wma
2,邪兵譜 (08).wma
。。。
存成“邪兵譜”文本文件,最好不要擴(kuò)展名。
然后運(yùn)行程序:
開(kāi)始-》運(yùn)行-》cmd進(jìn)入DOS窗口
C:\Documents and Settings\My Documents\>perl playlist.pl 邪兵譜
Create a playlist for lenovo i966 phone
(c)200802 by XXX
2,邪兵譜 (01).wma
2,邪兵譜 (02).wma
2,邪兵譜 (03).wma
2,邪兵譜 (04).wma
2,邪兵譜 (05).wma
2,邪兵譜 (06).wma
2,邪兵譜 (07).wma
2,邪兵譜 (08).wma
Output to : 邪兵譜.lst
C:\C:\Documents and Settings\My Documents\>
然后把生成的邪兵譜.lst文件傳到手機(jī)內(nèi)存的music文件夾下面即可。進(jìn)入播放器,按選項(xiàng)選擇播放列表,哈哈!全都有呢!這下子再也不怕聽(tīng)著聽(tīng)著半截來(lái)短信了!因?yàn)檫@個(gè)播放器支持后臺(tái)播放和自動(dòng)恢復(fù)功能!
我們可以在電腦上準(zhǔn)備好大量音樂(lè)文件,使用"dir > XXX.txt"管道命令可以很方便的生成播放列表輸入文件,經(jīng)過(guò)簡(jiǎn)單編輯就可以轉(zhuǎn)換了,但是要注意,文件名要跟實(shí)際手機(jī)上的一樣啊。