web-dev-qa-db-ja.com

ヘッダーデータ(ID3タグ)などを無視して、ファイル内のmp3、flacオーディオデータを比較するにはどうすればよいですか?

いくつかのオーディオファイルを2か所でバックアップし、ID3タグを一方のバックアップに追加しましたが、もう一方のバックアップには追加しませんでした。時間が経過したため、バックアップが実際に同じであるかどうかで自分のメモリが薄れてきましたが、現在はID3データと他はそうではなく、基本的なバイナリ比較は失敗し、検査は面倒になります。

ID3などのヘッダーデータを使用して、mp3、flacファイル、およびその他のファイルのオーディオデータ(ヘッダー、ID3ではない)のみを比較するツールはありますか?.

ここで比較を超えてスレッドを開始しました: http://www.scootersoftware.com/vbulletin/showthread.php?t=741

このタスクを実行する他の比較ソフトウェアを検討します

17
therobyouknow

ああ、永遠の窮状。私自身、この質問に長い間苦労し、重複ファイルを見つけるアプリをたくさん試したので、結局あきらめて自分で書くことにしました。そして、私は AllDup を見つけました。

AllDupは、MP3ファイルとJPEGファイルを比較する機能を備えたfastDFFであり、ID3タグを無視するため、私自身のプロジェクトを無期限に後回しにしました。それぞれExifデータ。さらに良いことに、Michael Thummererはフィードバックに非常に敏感で、バグをすばやく修正して提案を実装します(FLACヘッダーを無視することを提案できます)。さらに、AllDupは無料です。

8
Synetech

シェルでそれを行う方法は次のとおりです。 avconvが必要です。これは、Debian/Ubuntuではlibav-toolsにあります。

$ avconv -i INPUT_FILE -c:a copy -f crc - 2>/dev/null | grep CRC

次のような行が表示されます。

CRC=0xabfdfe10

これにより、オーディオデータのすべてのフレームが比較され、CRCが生成されます。したがって、このようなコマンドは複数のファイルを比較できます。

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done
6
blujay

可能な解決策として、任意のツールを使用して、メタデータ情報なしでファイルを非圧縮ストリーム(pcmwav)に変換し、それを比較することができます。変換には、ffmpegsoxavidemuxなどのソフトウェアを使用できます。

たとえば、ffmpegでそれを行う方法

その例で、メタデータが異なる2つのファイルがあるとします。_$ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ_ブルートフォース比較では、それらが異なると文句を言います。

次に、本体を変換して差分します:$ diff <( ffmpeg -loglevel 8 -i Original.mp3 -map_metadata -1 -f wav - ) <( ffmpeg -loglevel 8 -i Possible-dup.mp3 -map_metadata -1 -f wav - ) ; echo $? 0

コース外_; echo $?_の部分は、戻りコードを確認するためのデモンストレーションのみを目的としています。

複数のファイルの処理(トラバースディレクトリ)

コレクションで複製を試したい場合は、データのチェックサム(crc、_md5_、_sha2_、_sha256_など)を計算して、衝突を見つけるだけの価値があります。

その質問の範囲外ですが、メタデータを考慮せずにコンテンツのみをアカウンティングするディレクトリ内のファイルの重複を見つける方法について、いくつかの簡単な提案を提案します。

  1. 最初に各ファイルのデータのハッシュを計算します(そして次の処理のためにファイルに配置します):for file in *.mp3; do printf "%s:%s\n" "$( ffmpeg -loglevel 8 -i "$file" -map_metadata -1 -f wav - | sha256sum | cut -d' ' -f1 )" "$file"; done > mp3data.hashesファイルは次のようになります:_$ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3_ RDBMSは、カウントを集計してそのようなデータを選択するのに非常に役立ちます。ただし、純粋なコマンドラインソリューションを続行して、さらに次のような簡単な手順を実行することをお勧めします。

重複するハッシュがある場合はそれを参照してください(それがどのように機能するかを示すための追加の手順、重複を見つけるために必要ありません):$ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. そして、コンテンツによって複製されたファイルを一覧表示するために$ grep mp3data.hashes -f <( count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes | grep -oP '(?<=\[1:).{64}(?!]=1$)' ) | sort 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3

count.by.regexp.awk は、正規表現パターンをカウントするための単純なawkスクリプトです。

2
Hubbitus

Foobar20 with Binary Comparator プラグインがこれを行います。

2
afrazier

質問で述べたように、私はBeyond Compareフォーラムでもこれを尋ねましたが、BeyondCompareも解決策を提供します。

http://www.scootersoftware.com/vbulletin/showthread.php?t=741

どちらのアプローチも検討する価値があります。

  • allDupソリューションは、ファイルのどのコピーが保存され、どのコピーがディレクトリフォルダーツリーに破棄されるかを気にせず、実行する同じフォルダーにタグ付きファイルとタグなしファイルが混在している場合に最適です。重複チェックをオンにします。

  • Beyond Compareは、diectory /フォルダーツリーを保持し、2つの別々のフォルダー/ディレクトリ構造を比較する場合に最適です。オンザフライの非破壊フラットツリーオプションを使用することもできます。

1
therobyouknow