From 4a241ac6b5bec4c654a899458a8422aad70fd611 Mon Sep 17 00:00:00 2001 From: evazion Date: Sat, 5 Nov 2022 00:29:44 -0500 Subject: [PATCH] media assets: don't round volume levels. At first we rounded loudness values to 4 decimal places to make them easier to compare. This meant the lowest level was 0.0001, or -80 dB, but it's possible for volume levels to go even lower than that. --- app/logical/ffmpeg.rb | 6 +++--- test/unit/media_file_test.rb | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/logical/ffmpeg.rb b/app/logical/ffmpeg.rb index 2e9c56f66..0fe3dc3ea 100644 --- a/app/logical/ffmpeg.rb +++ b/app/logical/ffmpeg.rb @@ -155,7 +155,7 @@ class FFmpeg # have an audio track. If the silence percentage is 100%, then the audio track is totally silent. def silence_percentage return nil if !has_audio? || duration.to_f == 0.0 - (silence_duration.to_f / duration).clamp(0.0, 1.0).round(4) + (silence_duration.to_f / duration).clamp(0.0, 1.0) end # The average loudness of the audio track, as a percentage of max volume. 0% is silent and 100% is max volume. @@ -166,7 +166,7 @@ class FFmpeg # @return [Float, nil] The average loudness as a percent, or nil if the file doesn't have an audio track. # @see https://en.wikipedia.org/wiki/EBU_R_128 def average_loudness - 10.pow(average_loudness_lufs / 20.0).round(4) if average_loudness_lufs.present? + 10.pow(average_loudness_lufs / 20.0) if average_loudness_lufs.present? end # The average loudness of the audio track, in LUFS units. -70.0 is silent and 0.0 is max volume. @@ -203,7 +203,7 @@ class FFmpeg # @return [Float, nil] The peak loudness in dBFS, or nil if the file doesn't have an audio track. # @see https://en.wikipedia.org/wiki/EBU_R_128 def peak_loudness - 10.pow(peak_loudness_dbfs / 20.0).round(4) if peak_loudness_dbfs.present? + 10.pow(peak_loudness_dbfs / 20.0) if peak_loudness_dbfs.present? end # The peak loudness of the audio track, in dBFS (decibels referenced to full scale). 0.0 is 100% diff --git a/test/unit/media_file_test.rb b/test/unit/media_file_test.rb index 0eef8c42f..5d6b92b71 100644 --- a/test/unit/media_file_test.rb +++ b/test/unit/media_file_test.rb @@ -216,10 +216,10 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal("LC", file.metadata["FFmpeg:AudioProfile"]) assert_equal("stereo", file.metadata["FFmpeg:AudioLayout"]) assert_equal(128002, file.metadata["FFmpeg:AudioBitRate"]) - assert_equal(0.1318, file.metadata["FFmpeg:AudioPeakLoudness"]) - assert_equal(0.0193, file.metadata["FFmpeg:AudioAverageLoudness"]) + assert_equal(0.1318, file.metadata["FFmpeg:AudioPeakLoudness"].round(4)) + assert_equal(0.0193, file.metadata["FFmpeg:AudioAverageLoudness"].round(4)) assert_equal(0, file.metadata["FFmpeg:AudioLoudnessRange"]) - assert_equal(0.7562, file.metadata["FFmpeg:AudioSilencePercentage"]) + assert_equal(0.7562, file.metadata["FFmpeg:AudioSilencePercentage"].round(4)) end should "determine the metadata for a video with silent audio" do @@ -239,10 +239,10 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal("LC", file.metadata["FFmpeg:AudioProfile"]) assert_equal("stereo", file.metadata["FFmpeg:AudioLayout"]) assert_equal(2100, file.metadata["FFmpeg:AudioBitRate"]) - assert_equal(0, file.metadata["FFmpeg:AudioPeakLoudness"]) - assert_equal(0.0003, file.metadata["FFmpeg:AudioAverageLoudness"]) + assert_equal(0, file.metadata["FFmpeg:AudioPeakLoudness"].round(4)) + assert_equal(0.0003, file.metadata["FFmpeg:AudioAverageLoudness"].round(4)) assert_equal(0, file.metadata["FFmpeg:AudioLoudnessRange"]) - assert_equal(0.9999, file.metadata["FFmpeg:AudioSilencePercentage"]) + assert_equal(0.9999, file.metadata["FFmpeg:AudioSilencePercentage"].round(4)) end should "determine the metadata for a video without audio" do @@ -310,10 +310,10 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal("opus", file.metadata["FFmpeg:AudioCodec"]) assert_equal("stereo", file.metadata["FFmpeg:AudioLayout"]) assert_equal(50661, file.metadata["FFmpeg:AudioBitRate"]) - assert_equal(0.1274, file.metadata["FFmpeg:AudioPeakLoudness"]) - assert_equal(0.0186, file.metadata["FFmpeg:AudioAverageLoudness"]) + assert_equal(0.1274, file.metadata["FFmpeg:AudioPeakLoudness"].round(4)) + assert_equal(0.0186, file.metadata["FFmpeg:AudioAverageLoudness"].round(4)) assert_equal(0, file.metadata["FFmpeg:AudioLoudnessRange"]) - assert_equal(0.7506, file.metadata["FFmpeg:AudioSilencePercentage"]) + assert_equal(0.7506, file.metadata["FFmpeg:AudioSilencePercentage"].round(4)) end should "determine the metadata for a video with silent audio" do @@ -330,10 +330,10 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal("opus", file.metadata["FFmpeg:AudioCodec"]) assert_equal("stereo", file.metadata["FFmpeg:AudioLayout"]) assert_equal(1197, file.metadata["FFmpeg:AudioBitRate"]) - assert_equal(0, file.metadata["FFmpeg:AudioPeakLoudness"]) - assert_equal(0.0003, file.metadata["FFmpeg:AudioAverageLoudness"]) + assert_equal(0, file.metadata["FFmpeg:AudioPeakLoudness"].round(4)) + assert_equal(0.0003, file.metadata["FFmpeg:AudioAverageLoudness"].round(4)) assert_equal(0, file.metadata["FFmpeg:AudioLoudnessRange"]) - assert_equal(0.985, file.metadata["FFmpeg:AudioSilencePercentage"]) + assert_equal(0.985, file.metadata["FFmpeg:AudioSilencePercentage"].round(4)) end should "determine the metadata for a video without audio" do