当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 22 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : [原创]一个播放文件夹里MP3音乐的脚本
帖子发表于 : 2008-08-31 16:58 

注册: 2008-03-27 16:37
帖子: 19
送出感谢: 0 次
接收感谢: 0 次
一直感觉Rhythmbox用的时候不怎么舒服,貌似连MP3文件名在列表里都不能显示(反正我没找到。。)
所以闲着自己写了一个自己用。
用法很简单: 脚本名 音乐目录
然后有一些操作:
a) level up
s) level down -.-
d) 查看当前 level
l) 列出播放列表
c)清除屏幕
n) 下一首
m) 上一首
-) 减小音量
+) 增加音量
q) 退出
要说一下的是,level在这里的含义,当它为1时,你按下[1-9]就会自己播放第[1-9]首音乐
为2时,你就得按两个数字播放第10-99首音乐,按下a可以使level升级,s则相反,d查看当前level
下面是代码,(如果有什么疑问或讨论在这里留言或给我发EMAIL:lyfi2003@sina.com)
请不要说这东西有没用,过时不过时的话题,因为这仅仅是练习,谢谢~
补充一下,后台调用的是mplayer,如果没有安装就无法正常使用,不过可以自己改一下代码。just for fun


1)新添加改变音量大小快捷键,注意会影响系统音量(其实就是调整系统音量);



2)谢谢提醒,已经修复文件夹有空格无法正常播放的bug;



3)更改信号28为29,以防止发送信号冲突


4) 添加支持wma播放
代码:
代码:
#!/bin/bash
myplayer (){             #后台调用播放音乐函数
   if which mplayer >/dev/null;then
   exec   mplayer "$1" >&/dev/null #用exec调用替换进程
   fi 
   }
rmNumfile(){
   if [ -f .num ];then
      rm .num
   fi
}
rmMenufile(){
   if [ -f .menu ];then
      rm .menu
   fi
}
#define some signals
sigNext=25
sigPre=26
sigExit=27
sigNum=29
#
#you can add some more

#以下为操作处理函数
next(){
#   kill -$sigNext $1
#   echo "kill -$sigNext $1"
   echo "下一个..."
   kill -$sigNext $1
}
pre(){
#   echo "kill -$sigPre $1"
   echo "上一个..."
   kill -$sigPre $1
}
myexit(){
   echo "接收到退出信号,请稍等..."
   kill -$sigExit $1
   sleep 2
   echo "主进程退出!"
}
csnum(){
   
   echo "选中第$(cat .num) 首。"
#   echo "`expr $1 - 1`" > .num
   kill -$sigNum $2
}
getkey(){
   local state substate oldstate
   state=1
   oldstate=$state
      rmNumfile
      rmMenufile
#   echo mypid=$$      #主进程ID
   getkeypid=$1
      trap "rmNumfile; rmMenufile; kill -$sigexit $getkeypid;" 2 3
   while true
      do
       read -s -n 1 ans
#      echo $ans
      case "$ans" in
         [nN]|[jJ])
              next $getkeypid
              ;;
         [mM]|[kK])
            pre $getkeypid
            ;;
         q|Q)
            myexit $getkeypid
                   exit 0
            ;;
         [0-9]) if [ "$state" == "1" ];then
            echo -n "$ans" >> .num
            csnum $ans $getkeypid
            state="$oldstate"
            elif [ "$state" == "2" ];then
            echo -n "$ans" >>.num
            state=`expr "$state" - 1`
            elif [ "$state" -eq "3" ];then
             echo -n "$ans" >.num
            state=`expr "$state" - 1`
            else
               echo "an error accur"
            fi
            ;;
         a|A)  if [ "$oldstate" -lt "3" ];then
                      oldstate=`expr "$oldstate" + 1`
               echo "now level $oldstate"
            else
               echo " now level $oldstate"
            fi
               state=$oldstate
               rmNumfile   
            ;;
         s|S) if [ "$oldstate" -gt "1" ];then
               oldstate=`expr "$oldstate" - 1`
               echo "now level $oldstate"
            else
               echo "now level $oldstate"
            fi
               state=$oldstate
               rmNumfile   
            ;;
         d|D) echo "now level $oldstate"
            ;;
         l)   clear
                 cat .menu|more
            ;;
         L)   clear
                 cat .menu
            ;;
         c|C)  clear
            ;;
         -|_)  amixer set Master 7%- >& /dev/null
                   ;;
         +|=)  amixer set Master 7%+ >& /dev/null
                   ;;
         *) echo no such op;;
         esac
      done
}

NothingPlay(){
   echo There is nothing mp3,please input Q to exit!
}

getpid(){         #暂时没用到的函数
   ppid=$(ps aux|grep "myplayer" |grep -v "grep")
      if [ "$ppid" == "" ];then
         return -1;
           fi
      pid=$(echo $ppid |awk '{print $2}')
      return $pid
}

killpid(){
   kill -9 "$1" >&/dev/null
      return "$?"
}
myUsage(){
   cat << EOF

      Usage: $APP_NAME [MusicDIRCTORY]

      Start playing Music.(version $APP_VERSION)
      @GPL

           -h, --help              display this help and exit

      some operations for example:
      a)  level up
      s)  level down :)
      d)  show current level
      l)  list  menu
      n)  next
      m)  pre
            -) volume down
           +) volume up
      q)  exit
      for more message,please send email to lyfi2003@sina.com
EOF

}
#信号处理部分
#do_sigNum(){
#   if [ "$glNum" != "" ]
#      then
#         n=`expr $glNum + 0 ` #转换为数字
#      else
#      n=1               #从头开始
#      fi
#      killpid $mplayerpid
#}
runAskey(){                  #后台守护进程
#定义本地变量
   local line n playing;
#   在此进行信号挂载
   trap 'killpid  $mplayerpid;rmNumfile;rmMenufile;exit 0;' $sigExit
   trap 'killpid  $mplayerpid ;' $sigNext
   trap ' n=`expr "$n" - 2`;killpid $mplayerpid ;' $sigPre
#   trap ' n=`awk \' NR==1 {print $1;}\' .num`;killpid $mplayerpid;' $sigNum
   trap ' n=$((($(cat .num) - 1))) ;rmNumfile;killpid $mplayerpid;' $sigNum
#   echo $1   
   if [ ! -d "$1" ]
      then
         myUsage
         echo "please input Q to exit"
         exit 0
   fi
       
   line=`ls "$1"|egrep 'mp3$|wma$'   |wc -l`
   
   if [ "$line" == "0" ]
      then
         NothingPlay
         exit 0
   fi
   n=1
        ls "$1"|egrep  'mp3|wma'|awk '{print NR,$0}' | tee .menu
   while [ "$n" -le "$line" ]
      do
      playing=$(ls "$1"|egrep 'mp3|wma'|sed  -n ''"$n"'p')
         echo "正在播放:$playing            下一首:$(ls "$1"|egrep 'mp3|wma'|sed -n ''"$((($n+1)))"'p')"
   if [ -f "$1"/"$playing" ];then            #调整目录结构
   myplayer "$1"/"$playing"&
   else
       if [ -f "$1""$playing" ];then
      myplayer "$1""$playing" &
      fi

   fi
   mplayerpid="$!"   
#   echo "mplayerpid=$mplayerpid" 保存音乐进程ID
   wait $mplayerpid           #等待音乐结束
      sleep 2
      n=`expr "$n" + 1` #播放下一首
      echo "请等待..."
      done
      echo "播放完毕,按 ‘q‘以退出!"
      while :
         do
         sleep 10
         done
}
APP_NAME="${0##*[\\/]}"
APP_VERSION="0.0"
directory="$1"
if [ "$2" == "--show" ];then
runAskey "$directory"
else
$0 "$1" --show &          #启动后台守护进程
#echo "pid=$!"
if [ "$1" != "-h" ];then
         if [ "$1" != "--help" ];then
          getkey $!                 #启动前台接收操作
    fi
fi
fi
[/code]


最后由 jlu-windy 编辑于 2008-09-03 11:44,总共编辑了 9 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-08-31 17:08 
头像

注册: 2007-11-19 21:51
帖子: 6956
地址: 成都
送出感谢: 0 次
接收感谢: 4
不错,lz用
代码:
xxxx
括起来吧,这样代码会好看些。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-31 17:47 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
”后台守护进程“会占用多少的cpu?


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-08-31 17:50 
头像

注册: 2007-11-19 21:51
帖子: 6956
地址: 成都
送出感谢: 0 次
接收感谢: 4
yjcong 写道:
”后台守护进程“会占用多少的cpu?
你说的是那个trap?那个几乎不占cpu吧。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-08-31 17:51 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
不错哦~


_________________
关注我的blog: ε==3


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-08-31 18:02 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
怎么回事??

some operations for example:
a) level up
s) level down :)
d) show current level
l) list menu
n) next
m) pre
q) exit
for more message,please send email to lyfi2003@sina.com
please input Q to exit
选中第2首。
./mppp: line 47: kill: (11416) - No such process
now level 1
选中第2首。
./mppp: line 47: kill: (11416) - No such process
选中第11首。
./mppp: line 47: kill: (11416) - No such process
选中第102首。
./mppp: line 47: kill: (11416) - No such process
now level 1
下一个...
./mppp: line 30: kill: (11416) - No such process


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-08-31 18:23 

注册: 2008-03-27 16:37
帖子: 19
送出感谢: 0 次
接收感谢: 0 次
楼上,用法如下:
脚本名 + 文件夹
例如: pplay ~/Music
pplay是脚本名
如果加参数是 -h --help 或者没加参数就会出帮助信息,而不会自动退出
如果你想退出 按q就可以了。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-08-31 18:28 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
我没有办法用9和0调节声音了


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-08-31 18:53 

注册: 2008-03-27 16:37
帖子: 19
送出感谢: 0 次
接收感谢: 0 次
嗯,这个问题我也正在考虑呢。不知道谁有mplayer进程的信号处理方面的资料,也许可以实现。

还有交互问题还不是很满意。那个KILL输出难道是内核给的,重定向也不好使,谁有好的方案大家可以一起商量。

刚才我按二楼意见重新调整了一下格式,看着清楚一些。谢谢二楼提醒。


最后由 jlu-windy 编辑于 2008-08-31 19:02,总共编辑了 1 次

页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-08-31 19:02 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
jlu-windy 写道:
嗯,这个问题我也正在考虑呢。不知道谁有mplayer进程的信号处理方面的资料,也许可以实现。
刚才我按二楼意见重新调整了一下格式,看着清楚一些。谢谢二楼提醒。


可以,比如,shift+9 和shift+0


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2008-08-31 19:07 

注册: 2008-03-27 16:37
帖子: 19
送出感谢: 0 次
接收感谢: 0 次
不是快捷键冲突问题,是没办法去控制mplayer进程,而让它改变音量。
如果去改变系统音量就没什么意义了。(已经添入调整音乐的代码了)


最后由 jlu-windy 编辑于 2008-09-01 14:48,总共编辑了 1 次

页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2008-08-31 19:17 
头像

注册: 2008-02-17 23:47
帖子: 22109
地址: 美丽富饶的那啥星球
送出感谢: 11
接收感谢: 82
代码:
      Usage: pp [MusicDIRCTORY]

      Start playing Music.(version 0.0)
      @GPL

           -h, --help              display this help and exit

      some operations for example:
      a)  level up
      s)  level down :)
      d)  show current level
      l)  list  menu
      n)  next
      m)  pre
      q)  exit
      for more message,please send email to lyfi2003@sina.com
please input Q to exit
下一个...
./pp: line 30: kill: (634) - 没有该进程
下一个...
./pp: line 30: kill: (634) - 没有该进程
接收到退出信号,请稍等...
./pp: line 39: kill: (634) - 没有该进程
主进程退出!


为什么我的只看到这个,就是不响啊? :oops:


_________________
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……

---------------------------------------------------------------------------------
[图片版]新手当自强(续)FAQ
[新手进阶]挂载、fstab、调整linux分区
[图片版]E17桌面环境配置手把手


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2008-08-31 19:19 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
脚本+文件夹
不是加mp3文件


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2008-08-31 19:21 
头像

注册: 2008-02-17 23:47
帖子: 22109
地址: 美丽富饶的那啥星球
送出感谢: 11
接收感谢: 82
我肯定是文件夹啊 :shock:


_________________
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……

---------------------------------------------------------------------------------
[图片版]新手当自强(续)FAQ
[新手进阶]挂载、fstab、调整linux分区
[图片版]E17桌面环境配置手把手


页首
 用户资料  
 
15 楼 
 文章标题 :
帖子发表于 : 2008-08-31 19:34 

注册: 2008-03-27 16:37
帖子: 19
送出感谢: 0 次
接收感谢: 0 次
好了,改变音量的添进来了
代码如下:
amixer set Master 10%-
amixer set Master 10%+
在我机子调试ok ,大家若有不好使的可以去google看看自己机子的声卡类型。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 22 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译