如何在跨平台的bash脚本中播放MP3文件?

时间:2016-01-11 17:12:27

标签: bash cross-platform mp3

我想用简单的bash脚本播放MP3文件。我希望我的bash脚本能够在任何操作系统或发行版上工作,所以我不想将其锁定到任何特定的MP3软件。如何使用任何可用的MP3播放软件轻松播放MP3?

1 个答案:

答案 0 :(得分:1)

我写了一个简单的脚本来检查已知MP3工具的大清单,看看是否安装了任何这些工具(使用the POSIX-standard "command -v" tool)。一旦脚本找到它识别的MP3程序,该程序将用于简单地播放文件(如果可能,没有控制台输出),然后退出。 (脚注:cvlc,列表中的最后一个玩家,将打开gui程序VLC播放文件,然后自动关闭它。如果您不接受,我建议从列表中删除cvlc。)

这个脚本几乎可以保证在Ubuntu和Mac OS X(分别附带ffmpeg和afplay)上完美运行,并且极有可能在其他平台上运行。万一没有找到MP3软件,会向stderr打印一条消息(此消息包含BEL character)。

如果您需要绝对100%保证MP3将被播放(或者您需要更多选项,如音量控制),您应该要求您的用户安装ffmpeg或其他东西。但是对于相对简单的脚本中的快速和肮脏的声音效果,这可能是完美的快速解决方法!

无论如何,足够漫无边际,这是剧本:

#!/usr/bin/env bash
#
# playmp3 by Hayden Schiff (oxguy3)
#
# Play an MP3 with whatever MP3 software is already installed.
# Do whatever you want with this; the license is WTFPL.
#
# Usage:  playmp3 filename.mp3
#    or:  playmp3 /path/to/file.mp3

player=""
declare -a players=(
    "afplay" # OS X built-in
    "ffplay -nodisp" # ffmpeg
    "mpg123 --quiet"
    "maplay"
    "mplayer -really-quiet -noconsolecontrols"
    "play -V1" # SoX
    "cvlc --play-and-exit" # VLC curses interface
)

for p in "${players[@]}"; do
    pBase=$(echo $p | cut -d' ' -f1)
    if command -v $pBase >/dev/null; then
        player="$p"
        break
    fi
done

if [ -n "$player" ]; then
    $player $@
else
    >&2 echo -e "\aCould not find an MP3 player"
fi

如果您不想将“playmp3”包含为单独的文件,可以通过删除hashbang(脚本的第一行)并使用{包围脚本的其余部分来将其嵌入到bash脚本中分别为{1}}和function playmp3() {

如果对此脚本进行了更新,它们将显示为in my GitHub repo(尽管我会尽量记住将此帖子保持在StackOverflow的最新状态。)