![オプション1](https://rvso.com/image/1606702/%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B31.png)
.mp3 ファイルがたくさんあり、ファイル名を音声で読み上げるように変更したいと考えています。これを行う最も簡単な方法 (少なくとも私はそう思いました) は、次のようになります。
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv $file $BASE-bak.mp3
say "[[volm 0.4]] $BASE" -o $BASE-pre.aiff
ffmpeg -i $BASE-pre.aiff -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 $BASE-pre.mp3
rm $BASE-pre.aiff
mp3cat -o $file $BASE-pre.mp3 $BASE-bak.mp3
done
これほとんどは動作しますが、結果として得られる mp3 ファイルは壊れています (長さは適切ですが、無音で、ファイル名を言うのにかかる時間 (約 2 秒) が経過すると常に再生が停止します)。すべてがこのmp3cat
ステップで壊れているようです。ただし、ffmpeg
またはmp3wrap
またはその他の方法を使用しても動作しないようで、これは、ストリームの数が適切でないために生成されたファイル (それが何を意味するかはわかりません) に関係しているのではないかと思いますsay
。
これを修正する方法、またはまったく別の方法で行う方法についての提案はありますか?
答え1
ffmpeg を使用するようにスクリプトを変更しました。いつものように、データの損失を避けるために、スクリプトを実行する前にファイルをバックアップしてください。
オプション1
遅くなりますが、ファイルは再エンコードされますが、メタデータは保持されます。
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv "${file}" "${BASE}-bak.mp3"
say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
rm "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.mp3" -i "${BASE}-bak.mp3" -filter_complex [0:a][1:a]concat=n=2:v=0:a=1 -map_metadata 1 "${file}"
rm "${BASE}-pre.mp3"
done
オプション2:
高速、再エンコードなし、メタデータは失われます:
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv "${file}" "${BASE}-bak.mp3"
say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
rm "${BASE}-pre.aiff"
echo "file '${BASE}-pre.mp3'" >temp
echo "file '${BASE}-bak.mp3'" >>temp
ffmpeg -f concat -safe 0 -i temp "${file}"
rm "${BASE}-pre.mp3"
rm temp
done
いずれにしても、結果のファイルは QuickTime を使用して正常に動作し、ファイル全体が正しく再生されます。
答え2
これを試してください: ターゲットの .mp3 も、変換するのと同じ形式に変換します。いくつかの変更と注意を加えて手順を書き直します:
mkdir -p backup/
mkdir -p working/
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
say "[[volm 0.4]] $BASE" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
ffmpeg -i "$file" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-bak.mp3"
rm "${BASE}-pre.aiff"
mv "$file" backup/
mp3cat -o "$file" "${BASE}-pre.mp3" "${BASE}-bak.mp3"
mv "${BASE}-pre.mp3" working/
mv "${BASE}-bak.mp3" working/
done