树莓派智能家居:shell脚本之音乐顺序和随机播放
之前我们知道了如何使用shell脚本来新增和删除音乐列表,下面我们想要让我们这个脚本顺序或者随机播放音乐列表的wav文件,该怎么办呢?
首先是顺序播放,我们只需要把音乐列表按顺序读出然后调用aplay即可,具体脚本如下:
#!/bin/bash
cat rasp.txt | while read line
do
aplay -D hw:0,0 $line
done
那么如果我们想随机播放呢?Linux系统是带有Random随机数的,随机数范围是0-32767。如果想得到100以内的随机数,那使用$RANDOM%100即可。所以现在我们需要知道我们的列表里有多少行音乐文件,然后用$RANDOM%行数+1,得到随机的行数,然后去读取这一行的音乐文件即可实现随机播放,那么我们的脚本如下:
#!/bin/bash
int=1
while(( $int<=100 ))
do
lines=`cat rasp.txt|wc -l`
let rand=$RANDOM%$lines+1
files=`sed -n “$rand,1p” rasp.txt`
aplay -D hw:0,0 $files
let “int++”
done
在这个脚本里需要注意的是lines=`cat rasp.txt|wc -l`,我们可以认为反引号是一个命令执行完毕后赋值给lines的作用。到这里,顺序播放和随机播放就完毕了。
这样还远远不够,我们需要能够启动一个播放器的后台进程,这个后台进程能够实时接收我们传入的控制命令,比如上一曲、下一曲、暂停、停止播放、修改播放方式如单曲循环,但是目前来讲,这么多功能暂时无法通过纯shell脚本的形式实现,这个需要进行Linux-C的开发。但是既然提到了进程,那么我们就了解一下关于shell的进程管理。
之前我们说过,如果想一个任务或者程序还后台执行可以使用&,实际上linux还提供了其他任务调度的命令。
bg:将一个在后台暂停的命令,变成继续执行
fg:将后台中的命令调至前台继续运行
jobs:查看当前有多少在后台运行的命令
ctrl + z:可以将一个正在前台执行的命令放到后台,并且暂停
nohup:不挂断地运行命令
下面我们就这些命令做一次连贯的顺序。我们可以在开启一个shell命令后,按键ctrl+z,这个时候这个进程会暂停放到后台,然后输入命令jobs看到我们这个进程已经stop了,然后呢我们输入bg,发现之前的进程从暂停重新开始运行了,然后输入fg,这个时候命令窗口就被我们的这个进程占领了,也就是说他已经移到了前台。那么,不管我们有没有在命令结尾使用&,我们登出shell后进程都不会再执行,因为我们的后台进程是跟我们的xshell的Session相关的。那么我们就需要使用nohup命令了,举个例子我可以这样用:
nohup /home/play.sh &
这样便可以实现在登出shell后依然可以后台处理进程了。
因为shell没有多线程的概念,下一曲,上一曲暂时无法通过脚本实现,这个可以通过Java或者C实现。另外,这几天一直在各种尝试如何安装ffmpg或mpg123的包,在Ubuntu下这个包很容易安装,但是centos下,特别是arm版,好像并没有专门的工具包,不知道哪位大神有此类的安装包可否分享一下,在这里谢过各位大神。