如何比較兩個無損音訊檔案?

如何比較兩個無損音訊檔案?

我有一個 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 並排的螢幕截圖

相關內容