如何比较两个无损音频文件?

如何比较两个无损音频文件?

我有一个 M4A 文件,也将其转换为 FLAC 文件。我想看看转换是否无损,即从 M4A 到 pcm 的输出是否与从 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

  • 流哈希复用器与 hash 类似,但它会为每个流输出一个 hash,例如,一个用于视频,一个用于音频。同样,它也会使用默认的流选择行为,除非您添加-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 并排屏幕截图

相关内容