用于将音频文件以递归方式转换为 mp3 的脚本,位于另一个文件夹中,子文件夹名称相同

用于将音频文件以递归方式转换为 mp3 的脚本,位于另一个文件夹中,子文件夹名称相同

我有这个脚本,用于将视频文件转换为具有相同层次结构的另一个文件夹。这很好用。

#!/bin/bash
SAVEIFS=$IFS
IFS=$'\n'
find . \( -name '*.mkv' -o -name '*.mpg' -o -name '*.3gp' -o -name '*.m4v' -o -name '*.avi' \) -print | while read i ;do
mkdir -p ./converted`dirname "${i:1}"`
    #avidemux2.7_qt5 --load "$i" --run ./to-mp4.py --save ./converted"${i:1:-4}".mp4 --quit
    cp "$i" ./converted"${i:1:-4}".mp4
    echo "$i" ./converted"${i:1:-4}".mp4 >> list
echo $i >> ./converted/done.txt
done
find ./ -type f \( -iname \*.idx2 -o -iname \*.stat \) -delete
IFS=$SAVEIFS

我正在尝试使用 ffmpeg 以相同的方式转换音频文件,但它不起作用。创建了许多不需要的文件夹,如 MP3。和 MP3v,并且只转换了几个文件。文件名被部分截断,显示类似这样的错误。

achi.amr: No such file or directory

而文件名是ammachi.amr

脚本如下:

#!/bin/bash
SAVEIFS=$IFS
IFS=$'\n'
find ./ -type f \( -name '*.wav' -o -name '*.amr' \) -print | while read i ;do
mkdir -p ./MP3`dirname "${i:1}"`
    ffmpeg -i "$i" -f mp2 "MP3/${i%.*}.mp3"
    echo "'$i'" ./MP3"${i:1:-4}".mp3 >>list
    done
IFS=$SAVEIFS

@Wayne Vosberg 谢谢你的麻烦。正如 Wayne Vosberg 所建议的。我分别运行了带有和不带有脚本的 ffmpeg 行注释的 error.log 脚本。

日志的相关部分:

relevent lines of error.log with the ffmpeg line commented
+ mkdir -p ./MP3/z
+ mkdir -p ./MP3/z
+ mkdir -p ./MP3/z
+ mkdir -p ./MP3/
+ mkdir -p ./MP3/v
+ mkdir -p ./MP3/v
+ mkdir -p ./MP3/v
+ mkdir -p ./MP3/v
+ mkdir -p ./MP3/v
+ mkdir -p ./MP3/
+ mkdir -p ./MP3/

+ echo './z/cd ef.amr' './MP3/z/cd ef.mp3'
+ echo './z/cd ef-5.amr' './MP3/z/cd ef-5.mp3'
+ echo './z/cd ef-4.wav' './MP3/z/cd ef-4.mp3'
+ echo './cd ef-5.amr' './MP3/cd ef-5.mp3'
+ echo './v/cd ef-1.amr' './MP3/v/cd ef-1.mp3'
+ echo './v/cd ef-5.amr' './MP3/v/cd ef-5.mp3'
+ echo './v/cd ef-2.wav' './MP3/v/cd ef-2.mp3'
+ echo './v/cd ef-4.wav' './MP3/v/cd ef-4.mp3'
+ echo './v/cd ef-3.amr' './MP3/v/cd ef-3.mp3'
+ echo './abc d.wav' './MP3/abc d.mp3'
+ echo './cd ef-4.wav' './MP3/cd ef-4.mp3'

relevent lines of error.log with the ffmpeg line uncommented
+ mkdir -p ./MP3/z
+ mkdir -p ./MP3/z
+ mkdir -p ./MP3.
+ mkdir -p ./MP3/v
+ mkdir -p ./MP3.
+ mkdir -p ./MP3/v
+ mkdir -p ./MP3.
+ mkdir -p ./MP3/

+ echo ''\''./z/cd ef.amr'\''' './MP3/z/cd ef.mp3'
+ echo ''\''./z/cd ef-4.wav'\''' './MP3/z/cd ef-4.mp3'
+ echo ''\''/cd ef-1.amr'\''' './MP3cd ef-1.mp3'
+ echo ''\''./v/cd ef-5.amr'\''' './MP3/v/cd ef-5.mp3'
+ echo ''\''cd ef-2.wav'\''' './MP3d ef-2.mp3'
+ echo ''\''./v/cd ef-4.wav'\''' './MP3/v/cd ef-4.mp3'
+ echo ''\''/abc d.wav'\''' './MP3abc d.mp3'
+ echo ''\''./cd ef-4.wav'\''' './MP3/cd ef-4.mp3'

+ ffmpeg -i './z/cd ef.amr' -f mp2 './MP3/z/cd ef'
+ ffmpeg -i './z/cd ef-4.wav' -f mp2 './MP3/z/cd ef-4'
+ ffmpeg -i '/cd ef-1.amr' -f mp2 './MP3cd ef-1'
+ ffmpeg -i './v/cd ef-5.amr' -f mp2 './MP3/v/cd ef-5'
+ ffmpeg -i 'cd ef-2.wav' -f mp2 './MP3d ef-2'
+ ffmpeg -i './v/cd ef-4.wav' -f mp2 './MP3/v/cd ef-4'
+ ffmpeg -i '/abc d.wav' -f mp2 './MP3abc d'
+ ffmpeg -i './cd ef-4.wav' -f mp2 './MP3/cd ef-4'

我认为 ffmpeg 命令以某种方式改变了 VAR $i,因为该脚本可以与 Avidemux 和其他命令(例如 cp、mv 等)配合良好。

为此目的有任何建议或其他脚本吗?

答案1

我看到的第一件事是,当父目录只是 时,脚本会失败./。试试这个:

SAVEIFS=$IFS
IFS=$'\n'
find ./ -type f \( -name '*.wav' -o -name '*.amr' \) -print | while read i
do
    D=$(dirname "$i")

    if [[ ! -d "./MP3/${D}" ]]
    then
        mkdir -p "./MP3/${D}"
    fi

    O="./MP3/${i%.*}.mp3"

    # ffmpeg -i "$i" -f mp2 "${O}"
    ffmpeg -i - -f mp2 "${O}" <"${i}"

    echo "'$i'" "'${O}'" >>list
done
IFS=$SAVEIFS

答案2

包含所有建议以及更多内容。此脚本有效。

#!/bin/bash
SAVEIFS=$IFS
IFS=$'\n'
find ./ -type f \( -name '*.wav' -o -name '*.amr' \) -print | while read i ;do
mkdir -p ./MP3`dirname "${i:1}"`
    ffmpeg -nostdin -i "$i" -vn -ar 44100 -ac 2 -b:a 192k ./MP3"${i:1:-4}".mp3
    done
IFS=$SAVEIFS

相关内容