Linux手機DIY.Shell應用擴充二.自動產生播放清單(E680系列)
草木瓜
2007-03-20
一、問題的由來
很多人問E680最優秀的播放器是什麼,我只想說目前來看依然是內建的Realplayer。
他的優勢在於佔用的資源,與手機的無縫串連,以及比較合適的媒體相關參數設定。
realplayer音頻播放能力還是比較強的,支援的格式也比較多,所欠缺的是視頻播
放能力。這也是網上存在眾多的第三方播放器的主要原因。
考慮手機本身的容量再加上解壓高品質媒體檔案的耗電量,使用這類第三方播放器
不可避免留有遺憾。何況央視網路電視等網站也提供了眾多壓制好的合適檔案。綜合考
慮,得出如上結論也是情理之中。
不過realplayer有個重大缺點(起碼我這麼認為),對於播放清單的添加管理實在
是很麻煩。解決這個問題有很多種途徑,在這裡我們依然信賴Shell。
<Linux手機DIY系列:http://blog.csdn.net/liwei_cmg/category/241839.aspx>
二、自動播放列表的總體思路
思路倒是十分簡單,E680G的播放清單檔案就是/ezxlocal/download/appwrite/.realplayer.list
,這便是我們操作的對象。
我先來說明下具體的操作方法:
1.建立執行的指令碼,playerlist.txt。
2.在當前指令碼目錄下,手工建立幾個列表設定檔,這裡必須定義為 _*.txt
這種格式。且每行檔案內容皆是需要列表包括的目錄,最後必須空一行。
如:
_all.txt
01 /mmc/mmca1/Music/Soft
02 /mmc/mmca1/Music/Game
03 /mmc/mmca1/Music/Pop
04
_game.txt
01 /mmc/mmca1/Music/Game
02
上面檔案左邊是行號標記,實際檔案中是沒有的。
3.指令碼執行時會在目前的目錄遍曆所有_*.txt檔案,每個檔案會產生一個播放清單。
在處理檔案時,會尋找檔案所定義的目錄,將其中的媒體檔案自動產生到列表中。
4.啟動realplay便可以使用了。
三、指令檔全內容
01 #!/bin/bash
02
03 #當前路徑
04 Path_Current=/mmc/mmca1/soft/playerlist
05 #記錄檔
06 File_Log=$Path_Current/log.txt
07
08 #預定義檔案
09 File_Define=$Path_Current/define.txt
10
11
12 echo $$ > $Path_Current/tmpProc.txt
13
14 #指令集
15 File_Busybox=/mmc/mmca1/tmp/busybox
16
17 #建立播放清單頭
18 File_ListHead=$Path_Current/tmpListHead.head
19 echo "[allplaylist]" > $File_ListHead
20
21
22 cd $Path_Current
23 #遍曆迴圈變數
24 iListCount=0
25 #遍曆本地列表設定檔
26
27 for InstallList in `ls _*.txt`
28 do
29
30 #播放清單名
31 ListName=${InstallList#*_}
32 ListName=${ListName%.*}
33
34 #echo $ListName
35
36 iListCount=$(($iListCount+1))
37 echo "$iListCount = pl-$ListName" >> $File_ListHead
38
39 #臨時迴圈變數
40 i=0
41
42 #檔案行數
43 vFileLen=`$File_Busybox wc $Path_Current/$InstallList | $File_Busybox awk '{print $1}'`
44 echo "Line: " $vFileLen
45
46 #rm $Path_Current/tmp$ListName.list
47 echo "[pl-$ListName]" > $Path_Current/tmp$ListName.list
48 while test $i -lt $vFileLen
49 do
50
51 i=$(($i+1))
52
53 #列表中目錄
54 echo $Path_Current/$InstallList
55 ListDir=`sed -n "$i p" $Path_Current/$InstallList`
56
57 echo $ListDir
58 find $ListDir -name '*.[m,M,w,W][p,P,m,M][3,a,A]' >> "$Path_Current/tmp$ListName.list"
59
60 done
61
62 $File_Busybox awk 'BEGIN{FS=","}{if(NR==1)printf $0 "/n";if(NR!=1)printf NR-1 " = " $0 "/n";}' $Path_Current/tmp$ListName.list > $Path_Current/tmpfile
63
64 ListCount=`$File_Busybox wc $Path_Current/tmpfile | $File_Busybox awk '{print $1}'`
65 ListCount=$(($ListCount-1))
66 echo "counter = " $ListCount >> $Path_Current/tmpfile
67 mv -f $Path_Current/tmpfile $Path_Current/tmp$ListName.list
68
69 done
70
71 ListCount=`$File_Busybox wc $File_ListHead | $File_Busybox awk '{print $1}'`
72 ListCount=$(($ListCount-1))
73 echo "counter = " $ListCount >> $File_ListHead
74
75
76 cat $File_ListHead > $Path_Current/realplayer
77 cat $File_Define >> $Path_Current/realplayer
78 cat $Path_Current/*.list >> $Path_Current/realplayer
79
80 cp -f $Path_Current/realplayer /ezxlocal/download/appwrite/.realplayer.list
四、指令檔解釋
整個指令碼主要使用wc,awk,sed等處理檔案的Shell命令。與《隨機來鈴》一樣,
依然使用的是busybox指令集。下面對指令碼執行流程做個詳細描述:
1.建立播放清單頭<17行>
即tmpListHead.head這個檔案內容最終會是播放清單的最開頭部分:
[allplaylist]
1 = pl-all
2 = pl-game
counter = 2
在遍曆所有_*.txt過程中<27-69行>,首先會提取出播放清單名,如_all.txt
的列表名為all。<31,32行>完成此操作,這裡用到了${InstallList#*_}
變數截取方法,適用於bash,別的shell未曾測試。
<37>行,把擷取的播放清單名組合成,E680 Realplayer可識別的內容,
並寫入tmpListHead.head。
<73>行,此時遍曆過程已結束,產生最後counter = i 的這句內容。
2.建立播放清單固定部分<09行>
即config.txt這個預定義檔案,檔案內容就是:
[bookmark]
counter = 0
[currentplaylist]
counter = 0
currentitem = 0
currentplaylistname =
[history]
counter = 0
這些內容是我們並不關心的,而且也不會去修改它。
3.動態建立播放清單<27-69行>
主迴圈中,指令碼首先擷取一個_*.txt檔案,並讀取檔案內容,計算檔案行
數<43行>。然後遍曆檔案的每一行(屬於內迴圈<48-60行>)。對該檔案的
每一行目錄內容進行播放清單處理<58行>。內迴圈結束後,對迴圈產生的
播放清單檔案tmp*.list進行二次處理,使之符合realplayer格式<62行>。
即每一個_*.txt檔案都會對應產生tmp*.list。
4.最後的檔案內容組合<76-80行>
此時的工作相對簡單多了,只是融合下所有中間檔案,產生最終播放清單,
並強行複製到固定目錄。這裡合法的媒體檔案副檔名暫時是寫死在指令碼中
<58行>,有興趣的可以改成動態配置的。不管是上篇《Linux手機DIY.Shell
應用擴充一.隨機來電鈴聲》還是這一篇,設定檔都是採用極為簡單的
獨立檔案,這個自然也是可以改進的。
五、十分重要的補充
截止到目前,Shell系列文章所涉及的所有設定檔都必須是普通的Unix格式,否
則將不能正常運行。(註:Unix格式與我們平常用的Windows DOS格式差異在於斷行符號符,
Unix是0x0d,DOS是0x0a+0x0d,如果在手機上使用Windows DOS這種格式,記事本查
看到時正常的,不過用Shell命令查看就是亂碼。)
普通Unix這種格式擷取起來十分容易,telnet命令列下echo 'a' > a.txt,
這個a.txt便是完全合法的Unix格式。而E680手機本身的檔案格式皆為U8-Unix,即是
採用UTF-8編碼。
用手機記事本建立一個文字檔,內容為“一二三”,在telnet視窗用cat命令查
看會顯示“?123”,這顯然出現了編碼的不相容性。用UltraEdit開啟顯示是U8-UNIX格
式,不過內容是正常的。
“一二三”普通UNIX格式二進位內容:
D2 BB B6 FE C8 FD
“一二三”UTF-8格式二進位內容:
FF FE 00 4E 8C 4E 09 4E
這差異顯然比較大,我們通過Shell操作檔案時,一旦涉及UTF-8編碼的檔案,就
會出現錯誤,要解決這個問題就必須進行編碼轉換。這部分內容將在以後做專題討論。