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

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

私は macOS 10.3.6 (High Sierra) を使用していますが、少し前に音楽の CD 4 枚組ボックス セットを入手し、トラックを MP3 にリッピングして、そのファイルをシステムに保存しました。100 曲以上の各トラックに手動でタグを付け、メタデータを追加する必要がありました (聞かないでください)。また、しばらく前に元の CD も処分したので (これも聞かないでください)、簡単に再リッピングできません。

問題はここにある: どうやら、当時使用していた MP3 ツールは、各トラックの冒頭にほんの一瞬の「ポップ」音を追加していたようです。当時は気づかなかった、または注意を払っていなかったのですが、100 曲以上の各トラックの冒頭に、あの不快なポップ音が含まれていました。

私はStack Overflowでこのスレッドを読みました。LAME使用時のクリック音” アドバイスはしっかりしているが、LAME が誤ってオーディオファイルのヘッダーを純粋なオーディオとしてエンコードしてしまうことがあると説明しているが、実際には、提示された解決策では、すでにエンコードされた MP3 を次のような方法でストリーミングしなければならない。fseekその後、MP3 を再エンコード (つまりトランスコード) しますが、これは理想からは程遠いものです。

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

私が特に探しているのは、せいぜい Homebrew 経由で新しいツール (必要な場合) をインストールするだけで済む、比較的シンプルな macOS ベースのソリューションです。完全なスクリプトを求めているわけではありませんが、少なくとも正しい方向を指し示すツールと構成のヒントを求めています。

答え1

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

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

-ssを に設定し、を に設定して0.125入力と出力を指定するだけで済みます。copy-acodec

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

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

関連情報