2017-04-16 95 views
0

我每次运行这个脚本都不起作用。我得到的输出的bash:找不到如何让bash脚本使用ffmpeg工作将mp3转换为wav?

我跑的bash -x,看看是什么问题,但我不明白的错误

bash -x mp3towav.sh 
+ for f in '*.mp3' 
+ ffmpeg -i '' -acodec pcm_s16le -ac 1 -ar .wav 
ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developers 
    built with Apple LLVM version 8.0.0 (clang-800.0.42.1) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda 
    libavutil  55. 58.100/55. 58.100 
    libavcodec  57. 89.100/57. 89.100 
    libavformat 57. 71.100/57. 71.100 
    libavdevice 57. 6.100/57. 6.100 
    libavfilter  6. 82.100/6. 82.100 
    libavresample 3. 5. 0/3. 5. 0 
    libswscale  4. 6.100/4. 6.100 
    libswresample 2. 7.100/2. 7.100 
    libpostproc 54. 5.100/54. 5.100 
Trailing options were found on the commandline. 
: No such file or directory 

脚本命令是这样的

1 #!/bin/bash 
    2 for f in *.mp3; do ffmpeg -i "$file" -acodec pcm_s16le -ac 1 -ar "${file%.mp3}".wav;done 

时运行更正的代码提供我仍然得到一个错误:

ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developers 
    built with Apple LLVM version 8.0.0 (clang-800.0.42.1) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda 
    libavutil  55. 58.100/55. 58.100 
    libavcodec  57. 89.100/57. 89.100 
    libavformat 57. 71.100/57. 71.100 
    libavdevice 57. 6.100/57. 6.100 
    libavfilter  6. 82.100/6. 82.100 
    libavresample 3. 5. 0/3. 5. 0 
    libswscale  4. 6.100/4. 6.100 
    libswresample 2. 7.100/2. 7.100 
    libpostproc 54. 5.100/54. 5.100 
Trailing options were found on the commandline. 
Input #0, mp3, from 'hiraeth [ep].mp3': 
    Duration: 00:23:39.36, start: 0.025057, bitrate: 128 kb/s 
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s 
    Metadata: 
     encoder   : LAME3.99r 
    Side data: 
     replaygain: track gain - -4.100000, track peak - unknown, album gain - unknown, album peak - unknown, 
At least one output file must be specified 
+0

不应该是'for file in * .mp3;做...'?在当前的代码中,你在循环中使用'file',而不是'f'。 – codeforester

+0

而你必须*不*引用'* .mp3',否则Bash会试图找到一个名为'* .mp3'的文件。 –

回答

1

解决方案当然是我N乘codeforester评论:

#!/bin/bash 
for file in *.mp3; do 
    ffmpeg -i "$file" -acodec pcm_s16le -ac 1 -ar 44100 "${file%.mp3}".wav 
done 

(加44100根据注释LordNeckbeard) 一些提示:

1)如果你在多行分割你的脚本,它变得更容易发现这样的错误。

2)运行时不要过分关注错误bash -x;它在输出上给出命令。那是什么。在这种情况下:

+ ffmpeg -i '' -acodec pcm_s16le -ac 1 -ar .wav 

从该行中的结论是,ffmpeg的与''作为输入文件和.wav作为输出运行。

+0

这给了我一个错误,说我需要指定我的输出文件。 – ADASFA

+0

@ADASFA您的'-ar'缺少音频采样率的值。除去'-ar',输出将尝试使用与输入相同的采样率,或者添加一个适当的值,例如'-ar 44100'。 – LordNeckbeard