web-dev-qa-db-ja.com

MP3ファイル間の違いを特定する

MP3ファイルを含む2つの古い同様のディレクトリツリーがあります。私はdiffやRsyncなどのツールを使用して、片側にのみ存在するファイル、または同一のファイルを識別してマージしていますが、ビット単位で異なるファイルがたくさん残っています。

実際に異なるファイルのペアに対してdiffを実行すると(テキスト分析を強制するための-aタグを使用)、理解できない意味不明な言葉が生成されます。私は両側からファイルを聴きましたが、どちらも正常に再生されているようです(ただし、1曲あたり10分近くで、それぞれ2回聴いた場合、あまり多くのことをしていません)。

違いは、過去にID3タグをいじってコレクションを「強化」したプレーヤーが原因だと思いますが、確信が持てません。 ID3タグの違いを特定したとしても、宇宙線やファイルのコピーエラーの問題でファイルが破損していないことを確認したいと思います。

発生する1つの方法は、違いのバイト位置を見つけ、各ファイルの最初の約10kbのすべての変更を無視することですが、これを行う方法がわかりません。

ディレクトリツリー全体で異なる100程度のファイルがあります。

私は見つけました ファイル内のmp3、flacオーディオデータを比較する方法、ヘッダーデータ(ID3タグ)などを無視する方法? -しかし、Linuxのみであるため、そしてサウンドからalldupを実行できませんとにかく、それは私の問題を部分的にしか解決しないでしょう。

5
Thingomy

比較を超えて トピックによる

Beyond Compare 3は、Linuxではコンソールアプリケーションとして実行されません。 X-Windowsが必要です。

サポートされているLinuxディストリビューション

Red Hat Enterprise Linux 4-6

Fedora 4-14

Novell Suse Linux Enterprise Desktop 10

openSUSE 10.3-11.2

Ubuntu 6.06-10.10

Debian 5.04

Mandriva 2010

1
Lazy Badger

Beyond Compare(上記参照)は優れたソリューションのように見えます。私はそれを使ったことがありません。 Xwindowsについてのちょっとしたことは、まっすぐなコマンドラインではなく、GUIで実行したいということを意味します。 GUIがインストールされている場合、Xwindowsがシステムにすでに正しくインストールされている可能性は非常に高くなります。

続行する方法に関するいくつかのアイデア:

cmp -i 10kB file1 file2

linuxでバイト単位で2つの任意のファイルを比較し、最初に各ファイルで10kbをスキップします。各ファイルの異なるバイトカウントをスキップするオプションもあります。 -bパラメーターは異なるバイトを出力しますが、それは非常に長い出力になる可能性があるため、これを使用する場合は、出力をファイルまたはそれ以下にパイプします。スキップするバイト数を決定する必要があります。その答えはわかりません。複数のファイルに効果的に使用するには、bashまたは別の言語でスクリプトを作成する必要があります。おそらく、execオプションを指定してfindコマンドの一部として実行すると機能します。

将来、重複ファイルを探す場合は、fdupesをチェックしてください。それはそのためだけに設計されたユーティリティです。私はまだ自分のコンピューターで写真を管理する方法を考えていたときにそれを使用し、それらの中にたくさんの重複があるディレクトリの束になってしまいました。

https://code.google.com/p/fdupes/

また、ウィキペディアでfdupesを検索すると、エントリにリストされているLinuxファイル比較プログラムがたくさんあります。

それの一体のために、私は見ました:

http://www.id3.org/id3v2.4.0-structure

id3タグの構造を指定します。タグをファイルの先頭に配置することを「推奨」しますが、ファイルの末尾に追加のタグを追加することもできるため、誰もそのオプションを使用しない限り、ファイルの他の場所にメタ情報が存在する可能性があります。ほんの始まりです。仕様をざっと見ると、id3タグ情報の長さが可変であることがわかります。したがって、スキップすることが保証される正確なバイトカウントはありませんが、最初に提案された10kは、最初のタグをスキップするのに十分すぎるはずです。 。

1
Joe

可能な解決策として、任意のツールを使用して、メタデータ情報なしでファイルを非圧縮ストリーム(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場合によっては、複数のディレクトリだけを比較できます。例:find -L orig-dir dir-with-duplicates -name '*.mp3' -print0 | while read -r -d $'\0' file; 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スクリプトです。

P.S. https://superuser.com/a/1219353/435801 のわずかに調整されたバリアント。

0
Hubbitus