首页 > 学院 > 手机知识 > 正文

Linux手机DIY.Shell应用扩展二.自动生成播放列表(E680系列)

2024-06-10 11:36:32
字体:
来源:转载
供稿:网友

一、问题的由来

    很多人问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编码的文件,就
会出现错误,要解决这个问题就必须进行编码转换。这部分内容将在以后做专题讨论。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选