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

Det*_*ant 3 audio linux flac ffmpeg alac

我有一个 M4A 文件,它也被转换为 FLAC 文件。我想看看转换是否无损,即从 M4A 到 pcm 的输出是否与 FLAC 解码的输出完全相同。

我假设有一种方法可以使用 FFmpeg 或 Libav 来生成一些“原始”输出并进行比较?

llo*_*gan 14

您可以使用哈希复用器生成解码媒体的校验和。无需转换文件,不受元数据或其他可能导致独立求和工具报告错误差异的因素的影响。

比较 WAV 的示例?手拉手。因为 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
Run Code Online (Sandbox Code Playgroud)
  • 有许多可用的哈希算法可供选择。有些比其他更快。您可以使用该-hash选项选择算法,例如-hash md5

  • -map 0在示例中用于将所有流包含到校验和中。没有它,默认的流选择行为将只为每个流类型选择一个流。如果要排除/包含特定流,请使用-map带有流说明符的选项。例如,要排除所有视频使用负映射-map -0:v,或者只包含音频使用-map 0:a,或者只包含第三个音频流使用-map 0:a:2

  • 所述streamhash复用器类似于散列,但是它会输出每个数据流的散列,例如一个用于视频,一个用于音频。同样,它也将使用默认的流选择行为,除非您添加-map.

  • 如果要比较每个单独的帧/数据包,请使用framehash muxer

  • +1 这也很好,因为它完全避免了未压缩文件中的元数据问题,否则可能会使相同的音频文件不同。 (2认同)

thi*_*rty 4

我会尝试将它们都转换为 WAV 并比较它们的校验和。

ffmpeg -i file1.m4a file1.wav
ffmpeg -i file2.flac file2.wav
md5sum file1.wav
md5sum file2.wav
rm file?.wav
Run Code Online (Sandbox Code Playgroud)

比较生成的 md5。如果它们匹配,恭喜!您的文件包含相同的数据。如果它们不匹配,请在此处发布这些命令的输出,我会查看。可能存在比特率差异或其他差异(不应该存在......但可能存在,我不知道。)

请注意,ffmpegs 将生成相对较大的中间文件。

  • @ymfoi WAV 本身**不是**原始文件标准。 WAV 文件只是容器,因此可以包含不同的音频编解码器。在这种情况下,它将是无损的 PCM 音频(脉冲编码调制)。但 WAV 文件中也可以有压缩编解码器:http://en.wikipedia.org/wiki/Wav#WAV_file_compression_codecs_compared (7认同)