MP3 파일 간의 차이점 식별


5

MP3 파일이있는 2 개의 오래된 유사한 디렉토리 트리가 있습니다. diff 및 Rsync와 같은 도구를 사용하여 한쪽에만 있거나 동일한 파일을 식별하고 병합하는 것은 행복합니다. 비트별로 다른 파일이 남아 있습니다.

실제로 다른 파일 쌍 (텍스트 분석을 강제하기위한 -a 태그)을 통해 diff를 실행하면 이해할 수없는 횡설수설이 발생합니다. 나는 양쪽에서 파일을 들었고 모두 잘 재생하는 것처럼 보입니다 (그러나 노래 당 거의 10 분마다 두 번 들었을 때 많은 것을하지 않았습니다)

ID3 태그를 사용하여 과거의 일부 플레이어가 내 컬렉션을 "강화"했기 때문에 차이점이 의심되지만 확실하지 않습니다. ID3 태그의 차이점을 식별하더라도 Cosmic Ray 또는 파일 복사 오류 문제로 인해 파일이 손상되지 않았 음을 확인하고 싶습니다.

발생하는 한 가지 방법은 차이점의 바이트 위치를 찾고 각 파일의 처음 ~ 10kb의 모든 변경 사항을 무시하는 것입니다. 그러나이 작업을 수행하는 방법을 모르겠습니다.

디렉토리 트리마다 다른 수백 가지 정도의 파일이 있습니다.

mp3, 파일의 flac 오디오 데이터를 비교하고 헤더 데이터 (ID3 태그) 등을 무시하는 방법을 찾았습니다 . -하지만 Linux이기 때문에 alldup을 실행할 수 없으며 그 소리로 인해 어쨌든 내 문제를 부분적으로 만 해결할 것입니다.

답변:


1

너머 주제에 따라 비교 ?

Beyond Compare 3은 Linux에서 콘솔 응용 프로그램으로 실행되지 않습니다. X-Windows가 필요합니다.

지원되는 Linux 배포

Red Hat Enterprise Linux 4-6

페도라 4-14

Novell Suse Linux Enterprise Desktop 10

오픈 수세 10.3-11.2

우분투 6.06-10.10

데비안 5.04

맨드리바 2010


1

Beyond Compare (위 참조)는 훌륭한 솔루션처럼 보입니다. 나는 그것을 사용한 적이 없다. Xwindows에 관한 비트는 단순한 명령 줄이 아닌 GUI에서 실행되고 싶다는 것을 의미합니다. GUI가 설치되어 있으면 Xwindows가 시스템에 이미 올바르게 설치되어있을 가능성이 매우 높습니다.

진행하는 방법에 대한 몇 가지 아이디어 :

cmp -i 10kB 파일 1 파일 2

Linux에서 바이트 단위로 임의의 두 파일을 비교하여 먼저 각 파일에서 10kb를 건너 뜁니다. 각 파일에서 다른 바이트 수를 건너 뛰는 옵션도 있습니다. -b 매개 변수는 다른 바이트를 인쇄하지만 출력이 너무 길 수 있으므로 사용하는 경우 출력을 파일 또는 그 이하로 파이프하십시오. 건너 뛸 바이트 수를 결정해야합니다. 나는 그 대답을 모른다. 여러 파일에 효과적으로 사용하려면 bash 또는 다른 언어로 스크립트를 작성해야합니다. 어쩌면 exec 옵션과 함께 find 명령의 일부로 실행하면 작동합니다.

나중에 중복 파일을 찾고 있다면 fdupes를 확인하십시오. 그것은 그것을 위해 설계된 유틸리티입니다. 컴퓨터에서 사진을 관리하는 방법을 여전히 알고 있었을 때 중복 디렉토리가 많은 디렉토리가 생겼습니다.

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

또한 wikipedia에서 fdupes를 검색하면 항목에 나열된 Linux 파일 비교 프로그램이 있습니다.

그냥 이해하기 위해, 나는 살펴 보았다.

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

id3 태그의 구조를 지정합니다. 파일의 시작 부분에 태그를 배치 할 것을 "권장"하지만 파일 끝에 추가 할 태그를 추가로 제공하므로 아무도이 옵션을 사용하지 않으면 파일의 다른 곳에 메타 정보가있을 수 있습니다. 처음에. 사양을 자세히 살펴보면 id3 태그 정보의 길이가 가변적이므로 건너 뛸 수있는 정확한 바이트 수는 없지만 원래 제안 된대로 10k는 초기 태그를 건너 뛸만큼 충분해야합니다. .


0

가능한 해결책으로 도구를 사용하여 메타 데이터 정보없이 파일을 압축되지 않은 스트림 ( pcm, wav) 으로 변환 한 다음 비교할 수 있습니다. 변환을 위해 ffmpeg, sox또는 원하는 소프트웨어를 사용할 수 있습니다 avidemux.

예를 들어 ffmpeg로 어떻게하는지

메타 데이터가 다른 예제 2 파일이 있다고 가정 해 봅시다. $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ 무차별 대입 (Brute force) 비교는 서로 다르다고 불평합니다.

그런 다음 본문을 변환하고 비교합니다. $ 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 하십시오. 경우에 따라 여러 디렉토리 만 비교할 수 있습니다. fe : 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.awkawk정규 표현식 패턴을 계산하는 간단한 스크립트입니다.

PS 약간 조정 된 https://superuser.com/a/1219353/435801 변형 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.