Доброго времени суток. Имеются каталоги (их довольно много). В них хранятся файлы формата wav, а так же могут быть и другие файлы. Необходимо преобразовать wav в mp4 с aac потоком внутри. Для перекодировки используется neroAacEnc. К сожалению, программа работает только в один поток, и ресурсы компьютера расходуются не рационально. Я использовал скрипт на bash следующего содержания:
#!/bin/bash
mkdir wav16
mkdir mp4
for i in *.wav
do
InputFileName="$i"
OutputFileName="./wav16/${InputFileName}"
if [ ! -e "$OutputFileName" ] ; then
echo "Processing file: $InputFileName";
echo "Writing file: $OutputFileName";
sox "$InputFileName" -b 16 -r 44100 "$OutputFileName"
else
echo "File $OutputFileName already exist - [FAIL]"
fi
done
#second part
for i in ./wav16/*.wav
do
InputFileName="$i"
OutputFileName3="${InputFileName:8}"
OutputFileName2="./mp4/${OutputFileName3%.*}.mp4"
if [ ! -e "$OutputFileName2" ] ; then
echo "Processing file: $InputFileName";
echo "Save file: $OutputFileName2";
neroAacEnc -2pass -br 128000 -if "$InputFileName" -of "$OutputFileName2"
else
echo "File $OutputFileName2 already exist - [FAIL]";
fi
done
На этом форуме находил скрипт на странице
https://forum.ubuntu.ru/index.php?topic=214337.0 (благодарен автору), запускающий несколько процессов одновременно. Попытался переделать его под свои нужды:
#!/bin/bash
mkdir wav16
mkdir mp4
NUMCPU="$(grep ^processor /proc/cpuinfo | wc -l)"
find . -type f -regextype posix-awk -iregex '.*\.wav' | while read i ;
do
while [ `jobs -p | wc -l` -ge $NUMCPU ] ; do
sleep 0.1
done
InputFileName="$i"
OutputFileName="./wav16/$InputFileName"
if [ ! -e "$OutputFileName" ] ; then
echo "Processing file: $InputFileName";
echo "Writing file: $OutputFileName";
sox "$InputFileName" -b 16 -r 44100 "$OutputFileName" &
wait;# если я ставлю wait, то всё нормально, но работает только один поток, если не ставлю, то теряю файлы на выходе
else
echo "File $OutputFileName already exist - [FAIL]"
fi
done
#second part
find . -type f -regextype posix-awk -iregex './wav16.*\.wav' | while read i ;
do
while [ `jobs -p | wc -l` -ge $NUMCPU ] ; do
sleep 0.1
done
InputFileName="$i"
OutputFileName2="${InputFileName:8}"
OutputFileName="./mp4/${OutputFileName2%.*}.mp4"
if [ ! -e "$OutputFileName" ] ; then
echo "Processing file: $InputFileName";
echo "Save file: $OutputFileName";
neroAacEnc -2pass -br 128000 -if "$InputFileName" -of "$OutputFileName" &
wait;# если я ставлю wait, то всё нормально, но работает только один поток, если не ставлю, то теряю файлы на выходе
else
echo "File $OutputFileName already exist - [FAIL]";
fi
done
В результате теряю некоторые файлы на выходе или использую только один процесс перекодировки. В гугле искал, но ничего полезного не смог найти.
Подскажите, пожалуйста, в какую сторону копать. Может быть есть менее костыльные способы (например, xargs, но я не понял, как при его помощи добиться желаемого результата, если это возможно). Faac прошу не предлагать, мне кажется, что он портит звук. Заранее благодарен за возможные ответы.