From dc3a7cd2fa3af851c40331b63f407ba69612e31f Mon Sep 17 00:00:00 2001 From: Fredrik Lundkvist Date: Thu, 9 Feb 2023 15:51:13 +0100 Subject: [PATCH] Add profile to AudioStream, FfAudioStream. Signed-off-by: Fredrik Lundkvist --- .../se/svt/oss/mediaanalyzer/MediaAnalyzer.kt | 3 ++- .../svt/oss/mediaanalyzer/file/AudioStream.kt | 3 ++- .../MediaAnalyzerIntegrationTest.kt | 23 ++++++++++++++++++ src/test/resources/he-aac_test.mp4 | Bin 0 -> 42266 bytes 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/he-aac_test.mp4 diff --git a/src/main/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzer.kt b/src/main/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzer.kt index 198f13e..3464217 100644 --- a/src/main/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzer.kt +++ b/src/main/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzer.kt @@ -160,7 +160,8 @@ class MediaAnalyzer channels = ffAudioStream.channels, channelLayout = ffAudioStream.channel_layout, samplingRate = ffAudioStream.sample_rate ?: audioTrack?.samplingRate, - bitrate = ffAudioStream.bit_rate ?: audioTrack?.bitrate + bitrate = ffAudioStream.bit_rate ?: audioTrack?.bitrate, + profile = ffAudioStream.profile ) } } diff --git a/src/main/kotlin/se/svt/oss/mediaanalyzer/file/AudioStream.kt b/src/main/kotlin/se/svt/oss/mediaanalyzer/file/AudioStream.kt index b4324ac..697812d 100644 --- a/src/main/kotlin/se/svt/oss/mediaanalyzer/file/AudioStream.kt +++ b/src/main/kotlin/se/svt/oss/mediaanalyzer/file/AudioStream.kt @@ -11,5 +11,6 @@ data class AudioStream( val channels: Int, val channelLayout: String?, val samplingRate: Int?, - val bitrate: Long? + val bitrate: Long?, + val profile: String? ) diff --git a/src/test/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzerIntegrationTest.kt b/src/test/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzerIntegrationTest.kt index 0cb3b48..6b4453e 100644 --- a/src/test/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzerIntegrationTest.kt +++ b/src/test/kotlin/se/svt/oss/mediaanalyzer/MediaAnalyzerIntegrationTest.kt @@ -90,5 +90,28 @@ class MediaAnalyzerIntegrationTest { .hasDuration(2.621) .hasSamplingRate(48000) .hasBitrate(128104) + .hasProfile("LC") + } + @Test + fun testAudioHeAac() { + val file = javaClass.getResource("/he-aac_test.mp4").file + + val audioFile = MediaAnalyzer() + .analyze(file) as AudioFile + + assertThat(audioFile) + .hasFormat("MPEG-4") + .hasOverallBitrate(67625) + .hasDuration(5.000) + + assertThat(audioFile.audioStreams).hasSize(1) + assertThat(audioFile.audioStreams.first()) + .hasFormat("AAC") + .hasCodec("aac") + .hasChannels(2) + .hasDuration(5.000) + .hasSamplingRate(48000) + .hasBitrate(64183) + .hasProfile("HE-AAC") } } diff --git a/src/test/resources/he-aac_test.mp4 b/src/test/resources/he-aac_test.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a215b1bea64078392e0367d9d59cfec434f19457 GIT binary patch literal 42266 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 literal 0 HcmV?d00001