4

JAudiotaggerライブラリを使用して mp3 タグ付けアプリケーションを構築しています。私のアプリケーションは mp3 メタデータを正常に読み取り、アートワークを除いてメタデータも正常に書き込むことができます。だから私の問題は次のとおりです:

mp3 ファイルにいくつかのアートワークを追加して保存すると、ファイルが大きくなります。これは理にかなっています。しかし、アートワークを 1 つまたはすべて削除しても、ファイル サイズは小さくなりません

実際の問題は、mp3 ファイルの ID3v2 タグにあります。アートワークを削除すると、実際にはタグから削除されますが、タグのサイズ自体はまったく縮小されません。

アートワークを削除するときに使用している方法は次のとおりです。

    // Get the artworkList from the parentFrame.
    List<Artwork> list = parentFrame.getArtworkList();

    // Get the tag from the parentFrame's mp3File.
    AbstractID3v2Tag tag = parentFrame.getTag();

   // Get the index of the artwork the user is currently looking at (and
   // wants to delete too).
   int visibleArtworkIndex = parentFrame.getVisibleArtworkIndex();

   // Remove it from the list.
   list.remove(visibleArtworkIndex);

   // Update the parentFrame's copy of the artworkList.
   parentFrame.setArtworkList(list);

   // Update the tag (delete its whole artwork field).
   tag.deleteArtworkField();

   // If the list has more artworks left, add them to the tag.
   if (!list.isEmpty()) {
       Iterator<Artwork> iterator = list.iterator();
       while (iterator.hasNext()) {
           try {
               tag.addField(iterator.next());
           } catch (FieldDataInvalidException e1) {
               e1.printStackTrace();
           }
       }
   }

これは実際にリストからアートワークを削除し、すべてのアートワークを削除して更新されたリストからもう一度コピーすることで、タグ自体を更新します。

私の解決策の試みは次のとおりです。

  • 更新された古いタグから新しいタグを作成するには ( を呼び出した後tag.deleteArtworkField())、アートワークを新しいタグに追加しますが、新しいタグは古いタグと同じサイズでした。

  • を使用して保存する直前に mp3 ファイルをトリミングするにtag.adjustPadding(File fileToBeTrimmed, int sizeToStoreTagBeforeAudioInBytes, long audioStartByte)は、MP3 ファイルの先頭のパディングの長さを調整します。
    ここでの問題は、正しいタグ サイズではなく間違ったタグ サイズしか知らないため、mp3 を正しくトリミングできず、オーディオ データが失われてしまうことです。

問題をよりよく説明するために、いくつかの画像を含めました。

前の mp3 ファイル:

前

アートワークを 1 つ削除した後の mp3 ファイル。アートワークが少ないにもかかわらず、タグが以前のサイズを維持していることに注意してください。

間違った後

そして、ファイルがどうあるべきか:

正解後

誰にでもアイデアがあることを願っています。前もって感謝します。

4

3 に答える 3

2

これは実際には意図された動作であり、一種の最適化です。

ID3v2 タグにデータを追加するときに十分なスペースがない場合は、ファイル全体を書き直して十分なスペースを確保する必要があります。データを削除すると、ID3v2 はデータを含むように更新され、未使用のスペースは空きとしてマークされるだけです (データを再度追加するとリサイクルされます)。

ライブラリで「タグ内の未使用スペースを解放する」呼び出しを探します。空き領域を解放する必要があることを明示的に伝える必要があります。

編集:Javadocを見ると、ファイルを操作する前にこのオプションを設定する必要があると思います:

TagOptionSingleton.getInstance().setId3v2PaddingWillShorten(true);
于 2012-10-11T15:26:29.730 に答える
2

これは今日の時点で修正されています。

デフォルトでは、jaudiotagger はメタデータを小さくしてもスペースを再利用しませんが、設定すると

TagOptionSingleton.getInstance().setId3v2PaddingWillShorten(true);

変更を保存する前に、不要なパディングを再利用して、ファイル サイズを最小限に抑えます。

于 2020-03-26T16:56:57.133 に答える