2

MPGToolsMP3 ファイルに ID3 タグを設定するために、古き良き方法と独自の簡単な方法の両方を使用しています。しかし、どちらのアプローチも古すぎて ID3Tag バージョン 2 をサポートできません。Delphi 7 で記述されたアプリケーションで、処理する各ファイルから ID3Tag を削除するか、ID3Tag とまったく同じ値に設定できるソリューションを探しています。バージョン 1 が設定されています。

現在、Winamp でクイック キーボードの組み合わせを使用して、ID3Tagv2 を手動で削除しています。

私は v2 やアルバム アート、またはこれらすべての「新しい」追加機能を使用していないため、ID3Tagv2 (特定のファイルに存在する場合) を取り除く最も簡単な方法で十分です。

もちろん、私は Google を使用してインターネットを検索しようとしましたが、悪い日を過ごしたか、間違った質問をしている可能性があります。上記の質問に対する結果はすべて、ソフトウェアなどの検索エンジン スティーラーによる偽の結果であるためです。情報提供者など

4

2 に答える 2

3

たまたま、ここに座っている私のプロジェクトの 1 つが完了を待っています (約 80%、私は Delphi に関しては愛好家であり、より差し迫ったものが出てくると、ダウンロードできるプログラムを見つけました。私の要件を正確に) は、MP3 ファイル用の完全な ID3 タグ エディターです。v1 は非常に簡単でしたが、v2 ははるかに困難です。v2.3 の標準ドキュメントはこちらで参照できます。しかし、私はここで取り上げるポイントに限定します。

アプリケーションによっては、ID3v2 タグが必要になる場合があります。私のポータブル MP3 プレーヤーは v2 タグしか受け付けないため、そもそもこのプロジェクトに参加することになりました。

ID3v2 タグは、可変長の方法でファイルの先頭に書き込まれ、可変数のタグが存在する場合と存在しない場合があります。さいわい、ID3v2 タグ付きファイルの場合、データの全長は最初のレコードにあるはずです。したがって、ファイルを読み取って ID3v2 データの長さを特定し、ID3v2 データなしでファイルを書き換えると、タグが削除されます。最初にデータを持っていると、これが必要になり、実際にフラストレーションになります。私が将来コードに対して行うことは、その場でデータを変更しようとすることです。いくつかの非常に汚れたコードが続きますが、AFAIR は機能しましたが、使用する場合はクリーンアップする必要があります (ここにあるものは、正確にどのように指摘するコンテンツになると確信しています)そうするべきです)。ただし、念のためによくテストしてください。また、私がこれをコピーしたユニット (19.3KB の pas ファイル) から、あなたが必要とする何かを見逃していないかどうかを確認してください:

type
  sarray = array[0..3] of byte;
  psarray = ^sarray;

  ID3v2Header = packed record
     identifier: array[0..2] of char;
     major_version: byte;
     minor_version: byte;
     flags: byte;
     size: DWord;
  end;

 function size_decodeh(insize: DWord): DWord;
   { decodes the size headers only, which does not use bit 7 in each byte,
     requires MSB conversion as well }
   var
     outdval: DWord;
     outd, ind: psarray;
     tnext2, pnext2: byte;

   begin
     outdval := 0;
     outd := @outdval;
     ind := @insize;
     tnext2 := ind^[2] shr 1;
     pnext2 := ind^[1] shr 2;

     outd^[0] := ind^[3] or ((ind^[2] and $01) shl 7);
     outd^[1] := tnext2 or ((ind^[1] and $03) shl 6);
     outd^[2] := pnext2 or ((ind^[0] and $07) shl 5);
     outd^[3] := ind^[0] shr 3;
     Result := outdval;
   end;

procedure ID3v2_LoadData(filename: string; var memrec: pointer;
                       var outsize: integer);
  { procedure loads ID3v2 data from "filename".  Returns outsize = 0 if
    there is no ID3v2 data }

var
  infile: file;
  v1h: ID3V2Header;
begin
  assign(infile, filename);
  reset(infile, 1);
// read main header to get id3v2 size
  blockread(infile, v1h, sizeof(v1h));
// detect if there is id3v2 data
  if v1h.identifier = 'ID3' then
    begin
      outsize := size_decodeh(v1h.size);
      // read ID3v2 header data
      getmem(memrec, outsize);
      blockread(infile, memrec^, outsize);
      Close(infile);
    end
  else
    outsize := 0;
  end;

 function id3v2_erase(infilestr: string): boolean;
  { erase all ID3v2 data.  Data are stored at the beginning of file, so file
    must be rewritten }
   const
     tempfilename = 'TMp@!0X.MP3';
   var
     memrec: pointer;
     outsize, dataread: integer;
     IsID3v2: boolean;
     databuffer: array[1..32768] of byte;
     newfile, origfile: file;
   begin
  // reuse service routine to get information
     Id3v2_loaddata(infilestr, memrec, outsize);
  // is there ID3v2 data?
     if outsize > 0 then
       begin
        // need to clean up after the service routine
         freemem(memrec);
        // get amount of data to erase
        outsize := outsize + sizeof(Id3v2Header);
        writeln('Data to delete is: ', outsize, ' bytes.');
        // now rewrite the file
        AssignFile(origfile, infilestr);
        reset(origfile, 1);
        AssignFile(newfile, tempfilename);
        rewrite(newfile, 1);
        Seek(origfile, outsize);
        repeat
          blockread(origfile, databuffer, sizeof(databuffer), dataread);
          blockwrite(newfile, databuffer, dataread);
        until dataread = 0;
        CloseFile(origfile);
        CloseFile(newfile);
       // rename temp file and delete original
        DeleteFile(infilestr);
        RenameFile(tempfilename, infilestr);
        IsID3v2 := true;
      end
  else
     IsID3v2 := false;
  Result := IsID3v2;
end;

ほとんどすべての状況で機能する完全な編集機能は、明らかにそれよりも登るのが難しいですが、すべての詳細はリンク先のドキュメントに記載されています. うまくいけば、これはあなたを助けます。

于 2013-01-05T06:22:17.113 に答える
1

ID3V2 で正常に動作するライブラリはほとんどありません。2006 年に戻って、Delphi 7 の Id3V2 仕様のほとんどをサポートする Delphi ライブラリを見つけるために大規模な調査を行いました。そして、次の 2 つを見つけました。

  1. Audio Tools Library (当時は最高でした)。Unicode でタグを読み書きすることさえできると思います。これがユニットId3V2.pas です
  2. JVCLには、Id3V2 タグで動作するコンポーネントがあります。しかし、2006 年には非 Unicode Delphi の Unicode サポートはありませんでした。

ところで、まだ JVCL を使用していない場合は、Id3V2 のサポートを受けるためだけに 600 を超えるコンポーネントをインストールする価値はありません。それでは、Audio Tools Libraryをご覧ください。

于 2013-01-06T04:06:22.320 に答える