Làm cách nào để so sánh dữ liệu âm thanh mp3, flac trong một tệp, bỏ qua dữ liệu tiêu đề (thẻ ID3), v.v.?


16

Tôi đã sao lưu một số tệp âm thanh ở 2 vị trí và thêm thẻ ID3 vào một bản sao lưu nhưng không phải là sao lưu, vì thời gian đã trôi qua, bộ nhớ của tôi đã mờ dần về việc các bản sao lưu có thực sự giống nhau hay không, nhưng bây giờ một bản có dữ liệu ID3 và khác không, so sánh nhị phân cơ bản sẽ thất bại và kiểm tra sẽ rườm rà.

Có công cụ nào để so sánh chỉ dữ liệu âm thanh (không phải tiêu đề, ID3) trong mp3, tệp flac và các tệp khác sử dụng dữ liệu tiêu đề như ID3.

đã bắt đầu một chủ đề trên ngoài so sánh ở đây: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

sẽ xem xét các phần mềm so sánh khác thực hiện nhiệm vụ này

Câu trả lời:


8

Ah, hoàn cảnh vĩnh cửu. Bản thân tôi đã vật lộn với chính câu hỏi này quá lâu và đã thử rất nhiều ứng dụng tìm tệp trùng lặp mà cuối cùng tôi đã từ bỏ và quyết định tự viết một cái. Và sau đó tôi tìm thấy AllDup .

AllDup khiến tôi vô cùng dự phòng dự án của riêng mình vì đây là một DFF nhanh có khả năng so sánh các tệp MP3 và JPEG, bỏ qua các thẻ ID3 và dữ liệu Exif của chúng tương ứng. Thậm chí tốt hơn, Michael Thummerer rất nhạy cảm với phản hồi và nhanh chóng sửa lỗi và thực hiện các đề xuất (bạn có thể đề xuất bỏ qua các tiêu đề FLAC). Trên hết, AllDup là miễn phí.


6

Đây là một cách để làm điều đó ở vỏ. Bạn cần avconv, trong Debian / Ubuntu libav-tools.

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

Bạn sẽ nhận được một dòng như thế này:

CRC=0xabfdfe10

Điều này sẽ so sánh mọi khung dữ liệu âm thanh và tạo CRC cho nó. Vì vậy, một lệnh như thế này có thể so sánh nhiều tệp:

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

Không nhanh lắm, nhưng hoạt động hoàn hảo để có một tổng kiểm tra duy nhất trên các tệp mp3 để kiểm tra các bản sao. Cảm ơn bạn.
fred727

Một thay thế nhanh hơn nếu bạn có thể sử dụng php là thư viện getid3
fred727

3
@ fred727 Tôi đã kiểm tra avconvtrang man và nhận ra rằng crctùy chọn giải mã âm thanh và tính CRC của âm thanh được giải mã. Nhưng bạn có thể tránh điều đó bằng cách đặt codec âm thanh thành copy. Bây giờ, trên hệ thống của tôi, lệnh chạy trong 0,13 giây thay vì 1,13 giây. Tôi đã cập nhật câu trả lời, vì vậy bây giờ bạn có thể tránh sử dụng PHP. :)
blujay

2

Foobar2000 với plugin Binary So sánh sẽ làm điều này.


1
+1 Foobar2000 trông FANTASTIC. Tại sao? Bởi vì nó sử dụng UI gốc Windows phù hợp, trông đẹp và nhẹ và tối giản như VNC nhưng giàu chức năng và thực sự cung cấp thông tin và tính năng mà người ta thực sự muốn - như độ dài bài hát, v.v. Windows Media Player và WinAmp thiếu hiển thị thông tin này và thay vào đó nổi bật các tính năng tối nghĩa mà người ta hiếm khi sử dụng. Bộ so sánh nhị phân là một tính năng tuyệt vời cho câu hỏi tôi đang hỏi. Cảm ơn.
trị liệu

Vui vì bạn thích nó!
afrazier

2

Giải pháp có thể bạn có thể sử dụng bất kỳ công cụ nào để chuyển đổi tệp thành luồng không nén ( pcm, wav) mà không có thông tin siêu dữ liệu và sau đó so sánh nó. Để chuyển đổi, bạn có thể sử dụng bất kỳ phần mềm nào bạn muốn ffmpeg, soxhoặc avidemux.

Ví dụ: làm thế nào tôi làm điều đó với ffmpeg

Giả sử tôi có ví dụ về 2 tệp có siêu dữ liệu khác nhau: $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ Brute so sánh lực lượng phàn nàn chúng khác nhau.

Sau đó, chúng tôi chỉ cần chuyển đổi và khác biệt cơ thể: $ 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

Phần khóa học ; echo $?chỉ dành cho mục đích trình diễn để xem mã trả về.

Xử lý nhiều tệp (thư mục đi qua)

Nếu bạn muốn thử bản sao trong bộ sưu tập nó có giá trị để tính toán tổng kiểm tra (bất kỳ như crc, md5, sha2, sha256) của dữ liệu và sau đó chỉ cần tìm thấy ở đó va chạm.

Mặc dù nó nằm ngoài phạm vi của câu hỏi đó, tôi sẽ đề xuất một số gợi ý đơn giản về cách tìm các bản sao của các tệp trong thư mục chỉ có nội dung mà không cần xem xét siêu dữ liệu.

  1. Đầu tiên tính toán băm dữ liệu trong mỗi tệp (và đặt vào tệp để xử lý tiếp theo): 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 Tệp sẽ giống như: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Bất kỳ RDBMS nào cũng sẽ rất hữu ích ở đó để tổng hợp số lượng và chọn dữ liệu đó. Nhưng tiếp tục giải pháp dòng lệnh thuần túy mà bạn có thể muốn thực hiện các bước đơn giản như hơn nữa.

Xem các giá trị băm trùng lặp nếu có (bước bổ sung để hiển thị cách thức hoạt động, không cần thiết cho việc tìm bản sao): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. Và tất cả cùng nhau để liệt kê các tập tin trùng lặp theo nội dung : $ 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.regEx.awkawktập lệnh đơn giản để đếm các mẫu regrec .


1
+1 cảm ơn Hubbitus - một giải pháp khép kín tốt đẹp dựa trên nguồn mở. Tốt để biết. Cũng hữu ích để đưa vào một lô.
trị liệu

1

Tôi cũng đã hỏi điều này trên diễn đàn Beyond So sánh, như đã đề cập trong câu hỏi - và Beyond So sánh cũng cung cấp một giải pháp:

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

Cả hai cách tiếp cận đều đáng xem xét:

  • giải pháp AllDup là tốt nhất nếu bạn không quan tâm đến việc các bản sao của tệp được lưu giữ và loại bỏ trong cây thư mục thư mục VÀ bạn có một hỗn hợp các tệp được gắn thẻ và không được gắn thẻ trong cùng các thư mục mà bạn muốn chạy kiểm tra trùng lặp trên.

  • Beyond So sánh là tốt nhất nếu bạn muốn giữ lại cây thư mục / cây thư mục VÀ được so sánh 2 cấu trúc thư mục / thư mục riêng biệt, cũng được trợ giúp bằng cách sử dụng tùy chọn flatten-tree không phá hủy trên đường bay

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.