| 導購 | 订阅 | 在线投稿
分享
 
 
 

Linux手機DIY.Shell應用擴展二.自動生成播放列表(E680系列)

來源:互聯網網民  2008-12-28 03:24:15  評論

一、問題的由來

很多人問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編碼的文件,就

會出現錯誤,要解決這個問題就必須進行編碼轉換。這部分內容將在以後做專題討論。

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
一、問題的由來 很多人問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編碼的文件,就 會出現錯誤,要解決這個問題就必須進行編碼轉換。這部分內容將在以後做專題討論。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有