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

如何在跨平台bash脚本中播放MP3文件?,bash,cross-platform,mp3,Bash,Cross Platform,Mp3,我想用简单的bash脚本播放MP3文件。我希望我的bash脚本能够在任何操作系统或发行版上工作,所以我不想将它锁定在任何特定的MP3软件上。如何使用任何MP3播放软件轻松播放MP3?我编写了一个简单的脚本,从一个已知MP3工具的大列表中检查是否安装了任何工具(使用)。一旦脚本找到它识别的MP3程序,该程序将被用来简单地播放该文件(如果可能的话,没有控制台输出),然后退出。(脚注:列表中的最后一个播放器cvlc将打开gui程序VLC来播放文件,然后自动关闭。如果您不接受,我建议从列表中删除cvlc

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

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

这个脚本几乎可以保证在Ubuntu和MacOSX(分别随ffmpeg和afplay提供)上完美工作,并且很可能在其他平台上工作。如果不太可能找到MP3软件,则会向stderr打印一条消息(此消息包括)

如果您需要MP3播放的绝对100%保证(或者您需要更多的选项,如音量控制),您可能需要您的用户安装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
如果不想将“playm3”作为单独的文件包含,可以通过删除hashbang(脚本的第一行)将其嵌入bash脚本中,并分别使用
function playm3(){
}
包围脚本的其余部分


如果对该脚本进行了更新,它们将出现(尽管我会尽量记住在StackOverflow上保持这篇文章的最新状态)。

我相信使用
open
(可能还有
xdg open
)将完成大部分功能,但包括使用用户配置的桌面首选项。虽然这可能是启动GUI应用程序,而不是在“后台”播放。是的,
open
在大多数情况下都会使用GUI工具,这对我的使用来说是不可取的。只有在没有其他可用工具的情况下,才能使用GUI工具。