web-dev-qa-db-ja.com

MP3を再度トランスコードせずに、すでにエンコードされたMP3ファイルの先頭からほんの一瞬をトリミングするにはどうすればよいですか?

私はmacOS10.3.6(High Sierra)を使用していますが、以前は4枚のCDボックスセットで音楽を再生し、トラックをMP3にリッピングして、ファイルをシステムに保存していました。 100以上のトラックのそれぞれに手動でタグを付けてメタデータを追加する必要があり(尋ねないでください)、しばらく前に元のCDも削除したので(どちらも尋ねないでください)、簡単に再リッピングできませんそれら。

ここに問題があります:どうやら私がその時に使用したMP3ツールは各トラックの始めにほんの一瞬の「ポップ」を追加しました。当時、私は気づいていなかった、または注意を払っていませんでしたが、100以上のトラックのそれぞれに、トラックの最初にその迷惑なポップがあります。

Stack Overflowでこのスレッドを読みました。「 LAMEを使用する場合は最初にサウンドをクリックしてください 」アドバイスはしっかりしていますが、LAMEが誤ってオーディオファイルのヘッダーを純粋なオーディオとしてエンコードすることがあることを説明しています。提示されたソリューションでは、すでにエンコードされているMP3を fseek のようなものでストリーミングしてから、理想からはほど遠いMP3を再エンコード(別名:トランスコード)する必要があります。

では、これらのすでにエンコードされたMP3の約1/8秒をトリミングして、「ポップ」を取り除き、MP3のトランスコードを回避する方法はありますか?

私は特に、Homebrewを介してインストールする必要があるのは(必要な場合)新しいツールのみである、比較的単純なmacOSベースのソリューションを探しています。完全なスクリプトを要求するのではなく、少なくとも私を正しい方向に向けるためのツールと構成のヒントを求めています。

1
JakeGould

さて、FFmpegの魔法を使ってこれを解決することができました(Homebrew経由でmacOSにすでにインストールしています)。具体的には、 -ss(別名:シーク)パラメーター オーディオストリームに適用されるcopyオプションと組み合わせると、魅力のように機能します。コマンドは次のように要約できます。

ffmpeg -ss 0.125 -i "input.mp3" -acodec copy "output.mp3"

-ss0.125に設定してから、copy-acodecに設定して入力と出力を指定するだけです。

そして、質問で説明したように、私の場合、処理するファイルが100以上あるので、開始オーディオの1/8をトリミングする必要があるすべてのMP3を検索し、それらをmp3/サブディレクトリにダンプする単純なBashスクリプトを作成しました。これが同様の状況の誰かに役立つことを願っています!

find -E "path/to/audio/files" -type f -iregex ".*\.(MP3)$" |\
  while read full_audio_filepath
  do

     # Break up the full audio filepath stuff into different directory and filename components.
     audio_dirname=$(dirname "${full_audio_filepath}");
     audio_basename=$(basename "${full_audio_filepath}");
     audio_filename="${audio_basename%.*}";

     # Set the MP3 directory.
     mp3_dirpath="${audio_dirname}/mp3";
     mp3_filepath="${mp3_dirpath}/${audio_filename}.mp3";

     # Create the child MP3 directory.
     mkdir -p "${mp3_dirpath}";

     # And here is where the magic happens.
     ffmpeg -y -v quiet -ss 0.125 -i "$full_audio_filepath" -acodec copy "$mp3_filepath" < /dev/null;

  done
2
JakeGould