使用 STREAMINFO 中的 MD5 实现 FLAC 正确性

使用 STREAMINFO 中的 MD5 实现 FLAC 正确性

我从[来源]得知,FLAC 计算 CRC 和 MD5。

恐怕flac --test只有 CRC 测试 - 如man flac:中所述same as -d except no decoded file is written

如何使用给定 .flac 文件中 STREAMINFO 中放置的原始 PCM 的 MD5 检查 flac 文件的正确性?

如果flac --test可以的话,是否有任何可靠的(如 flac 文档中的)参考资料可以显示它?

资料来源:

http://en.wikipedia.org/wiki/Free_Lossless_Audio_Codec我们可以找:

FLAC 在流协议中使用时使用 CRC 校验和来识别损坏的帧,并且还在其 STREAMINFO 元数据标头中存储原始 PCM 音频的完整 MD5 哈希值。

http://flac.sourceforge.net/comparison.html

默认情况下,处理文件时,flac 在编码和解码时计算 MD5 和。

要在 STEAMINFO 中查看 md5sums,我们可以使用:

$ metaflac --show-md5sum *.flac

答案1

最可靠的来源是源代码本身,它确实建议默认检查存储在 STREAMINFO 中的 MD5。

答案2

http://wiki.etree.org/index.php?page=FlacFingerprint显示此信息:

相反,当您解压缩或使用 flac 的测试功能时,FLAC 会根据文件中存储的内部校验和自动验证每个文件。

请注意,flac 指纹不是编码的 flac 数据的校验和 - 它是解码的音乐数据的校验和。因此,为了测试文件,flac 会对文件中的数据进行解码,并验证音乐数据的校验和是否与(内部存储的)flac 指纹匹配。

这有一些有趣的含义:

当 flac 解码时,它会根据内部校验和数据检查文件(以及文件的每个部分)。如果 flac 文件解码没有错误,那么它就是一个好文件 - 只要您使用的应用程序报告解码错误!

这似乎意味着 CRC 和 MD5 都会被检查,因为 CRC 仅适用于帧。我做了一些测试并得到了2:FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH,这是预期的。看着代码,以下内容意味着始终会检查它:

/*
 * undocumented debugging options for the test suite
 */
{ "no-md5-sum"                , share__no_argument, 0, 0 },

并且默认情况下已设置:

FLAC__stream_decoder_set_md5_checking(decoder_session->decoder, true);

设置“MD5 签名检查”标志。如果为 true,则解码器将在解码时计算未编码音频数据的 MD5 签名,并在 FLAC__stream_decoder_finish() 期间将其与 STREAMINFO 块中的签名(如果存在)进行比较。

正如来自的答案发送更多信息表示:

最可靠的来源是源代码本身,它确实建议默认检查存储在 STREAMINFO 中的 MD5。

答案3

这可能会有所帮助。

https://www.quickhash-gui.org/

FLAC 在流协议中使用时使用 CRC 校验和来识别损坏的帧,并且还在其 STREAMINFO 元数据标头中存储原始 PCM 音频的完整 MD5 哈希值。

相关内容