问题描述如下:
因为做实验要用到MUSDB18这个数据集,但是数据集里所包含的数据均为mp4格式文件,因此在进行数据处理时需要用到musdb这个包去进行音频的处理,musdb包所依赖的两个关键包有两个:ffmpeg和ffprobe。在环境中安装完以上三个包以后,进入代码进行调试,报错如下:
问题分析:
提示错误信息为musdb依赖的两个包ffmpeg和ffprobe找不到,表面意思看是没有安装这两个包,参考错误信息中的解决办法是分别安装ffmpeg和stempeg两个包(stempeg我已经安装了0.1.8版本的)。但是安装了之后,仍然报错如上图一致。
经过百度,发现ffmpeg并不是一个严格意义上的包,是一个用于视频流编解码常用的工具,而stempeg是在python环境中作为ffmpeg工具的接口。报错信息中的ffprobe则属于ffmpeg工具包中的一个可执行文件。
在了解了这些以后,我找到了报错代码的源码部分,如下:
def cmd_exist(cmd):
try:
from shutil import which
return shutil.which(cmd) is not None
except ImportError:
return any(
os.access(os.path.join(path, cmd), os.X_OK)
for path in os.environ["PATH"].split(os.pathsep)
)
def ffmpeg_and_ffprobe_exists():
return cmd_exist("ffmpeg") and cmd_exist("ffprobe")
if not ffmpeg_and_ffprobe_exists():
raise RuntimeError('ffmpeg or ffprobe could not be found! '
'Please install them before using stempeg. '
'See: https://github.com/faroit/stempeg')
这里出现了有关shufle包下的which函数的使用,百度后了解到 shufle.which(cmd) 函数用来查找‘cmd’对应的可执行文件(默认搜索路径为/usr/bin/和/usr/local/bin/),但是由于这里没有在默认搜索路径下找到对应ffmpeg和ffprobe的可执行文件,因此出错。我发现只是使用conda安装ffmpeg以及ffprobe并不能解决问题。需要在服务器上安装ffmpeg,然后将其可执行文件建立到目标路径下。参考了安装过程看这里的安装过程(保证通过conda安装的ffmpeg的版本与使用的安装包版本保持为一致。),在安装完成以及配置完环境变量生效之后,在命令行输入‘ffmpeg -version’如果显示如下即是安装成功:
此时ffmpeg的位置在 /usr/local/下,可执行文件ffmpeg和ffprobe的位置在/usr/local/ffmpeg/bin下,如果此时运行程序的话仍然是和之前同样的错误,因此需要将这两个可执行文件放置到/usr/bin/里,这里为了避免文件直接转移出现问题,使用软链接的方法。在shell里依次输入指令 :
sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg
sudo ln -s /usr/local/ffmpeg/bin/ffprobe /usr/bin/ffprobe
这个时候再次调用musdb包就可以正常使用了。