Как сравнить два аудиофайла без потерь?

Как сравнить два аудиофайла без потерь?

У меня есть файл M4A, который также преобразован в файл FLAC. Я хотел бы посмотреть, происходит ли преобразование без потерь, а именно, является ли вывод в pcm из M4A точно таким же, как и при декодировании FLAC.

Полагаю, есть способ использовать FFmpeg или Libav для получения «сырых» выходных данных и сравнения их?

решение1

Я бы попробовал конвертировать их оба в WAV и сравнить их контрольные суммы.

ffmpeg -i file1.m4a file1.wav
ffmpeg -i file2.flac file2.wav
md5sum file1.wav
md5sum file2.wav
rm file?.wav

Сравните полученные md5. Если они совпадают, поздравляю! Ваши файлы содержат одинаковые данные. Если они не совпадают, выложите вывод этих команд здесь, и я посмотрю. Возможно, есть разница в битрейте или что-то в этом роде (ее не должно быть... но она может быть, я не знаю.)

Обратите внимание, что ffmpegs будет генерировать сравнительно большие промежуточные файлы.

решение2

Вы можете использоватьхэш-мультиплексордля генерации контрольной суммы декодированного носителя. Не нужно конвертировать файлы, и на него не влияют метаданные или другие факторы, которые могут привести к тому, что автономный инструмент суммирования будет сообщать о ложных различиях.

Пример сравнения WAV → FLAC. Поскольку FLAC — без потерь, хэши должны быть одинаковыми:

$ ffmpeg -loglevel error -i input.wav output.flac

$ ffmpeg -loglevel error -i input.wav -map 0 -f hash -
  SHA256=c1acb198952f5c341190ffb62eeafe4f10c8f48c67a188e25087471a74eaa957

$ ffmpeg -loglevel error -i output.flac -map 0 -f hash -
  SHA256=c1acb198952f5c341190ffb62eeafe4f10c8f48c67a188e25087471a74eaa957
  • Есть много доступныххэш-алгоритмына выбор. Некоторые быстрее других. Вы можете выбрать алгоритм с помощью -hashопции, например -hash md5.

  • -map 0используется в примерах для включения всех потоков в контрольную сумму. Без негоповедение выбора потока по умолчаниювыберет только один поток для каждого типа потока. Если вы хотите исключить/включить определенные потоки, то сделайте это с помощью -mapопции с указателями потоков. Например, чтобы исключить все видео, используйте отрицательное сопоставление с -map -0:v, или чтобы включить только аудио, используйте -map 0:a, или чтобы включить только третий аудиопоток, используйте -map 0:a:2.

  • Thestreamhash мультсериалпохож на хэш, но он выведет хэш для каждого потока, например, один для видео и один для аудио. Опять же, он также будет использовать поведение выбора потока по умолчанию, если вы не добавите -map.

  • Если вы хотите сравнить каждый отдельный кадр/пакет, то используйтефреймхэш-мультиплексор.

решение3

Вы можете попробовать визуализировать спектр звука, а затем сравнить их бок о бок.

Вот как это можно сделать с помощью showcqtфильтра.

ffmpeg -i "video_file_with_audio.mkv"  -i "alternative_audio.m4a" \
        -filter_complex "[0:a]asplit[a1][ao];
              [a1]volume=1.2,showcqt=fps=23.976:s=480x1080:count=3:axis=0:axis_h=30:bar_h=100:basefreq=200:endfreq=12495[vfreq1];
              [1:a]showcqt=fps=23.976:s=480x1080:count=3:axis=0:axis_h=30:bar_h=100:basefreq=200:endfreq=12495[vfreq2];
              [vid1]fps=23.976,scale=-1:1080[v1];[v1][vfreq1][vfreq2]hstack=3[vo]" \
        -map "[vo]" -map "[ao]"  output.mp4

Это предполагает, что у вас есть видео со звуком и альтернативный звук для этого видео.

Видеть этоснимок экрана showcqt бок о бок

Связанный контент