diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java index 35c28d0497..4077f836ce 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java @@ -69,11 +69,7 @@ import org.checkerframework.dataflow.qual.Pure; super(inputFormat, streamStartPositionUs, muxerWrapper); if (forceSilentAudioDurationUs != C.TIME_UNSET) { - silentAudioGenerator = - new SilentAudioGenerator( - forceSilentAudioDurationUs, - inputFormat.sampleRate, - Util.getPcmFrameSize(C.ENCODING_PCM_16BIT, inputFormat.channelCount)); + silentAudioGenerator = new SilentAudioGenerator(inputFormat, forceSilentAudioDurationUs); } else { silentAudioGenerator = null; } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java index 588f6fff85..cb0d82e6fc 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java @@ -17,6 +17,8 @@ package androidx.media3.transformer; import androidx.media3.common.C; +import androidx.media3.common.Format; +import androidx.media3.common.util.Util; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -27,8 +29,13 @@ import java.nio.ByteOrder; private long remainingBytesToOutput; - public SilentAudioGenerator(long totalDurationUs, long sampleRate, int frameSize) { - remainingBytesToOutput = frameSize * ((sampleRate * totalDurationUs) / C.MICROS_PER_SECOND); + public SilentAudioGenerator(Format format, long totalDurationUs) { + int frameSize = + Util.getPcmFrameSize( + format.pcmEncoding == Format.NO_VALUE ? C.ENCODING_PCM_16BIT : format.pcmEncoding, + format.channelCount); + long outputFrameCount = (format.sampleRate * totalDurationUs) / C.MICROS_PER_SECOND; + remainingBytesToOutput = frameSize * outputFrameCount; internalBuffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE_FRAMES * frameSize).order(ByteOrder.nativeOrder()); internalBuffer.flip(); diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java index 8f88124893..e39f7343f4 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java @@ -17,6 +17,8 @@ package androidx.media3.transformer; import static com.google.common.truth.Truth.assertThat; +import androidx.media3.common.C; +import androidx.media3.common.Format; import androidx.test.ext.junit.runners.AndroidJUnit4; import java.nio.ByteBuffer; import org.junit.Test; @@ -30,7 +32,12 @@ public class SilentAudioGeneratorTest { public void numberOfBytesProduced_isCorrect() { SilentAudioGenerator generator = new SilentAudioGenerator( - /* totalDurationUs= */ 3_000_000, /* sampleRate= */ 88_200, /* frameSize= */ 12); + new Format.Builder() + .setSampleRate(88_200) + .setPcmEncoding(C.ENCODING_PCM_16BIT) + .setChannelCount(6) + .build(), + /* totalDurationUs= */ 3_000_000); int bytesOutput = 0; while (!generator.isEnded()) { ByteBuffer output = generator.getBuffer(); @@ -47,7 +54,12 @@ public class SilentAudioGeneratorTest { public void lastBufferProduced_isCorrectSize() { SilentAudioGenerator generator = new SilentAudioGenerator( - /* totalDurationUs= */ 1_000_000, /* sampleRate= */ 44_100, /* frameSize= */ 4); + new Format.Builder() + .setSampleRate(44_100) + .setPcmEncoding(C.ENCODING_PCM_16BIT) + .setChannelCount(2) + .build(), + /* totalDurationUs= */ 1_000_000); int currentBufferSize = 0; while (!generator.isEnded()) { @@ -66,7 +78,12 @@ public class SilentAudioGeneratorTest { public void totalBytesLowerThanDefaultBufferSize_smallBufferProduced() { SilentAudioGenerator generator = new SilentAudioGenerator( - /* totalDurationUs= */ 5_000, /* sampleRate= */ 48_000, /* frameSize= */ 4); + new Format.Builder() + .setSampleRate(48_000) + .setPcmEncoding(C.ENCODING_PCM_16BIT) + .setChannelCount(2) + .build(), + /* totalDurationUs= */ 5_000); // 5_000 * 48_000 * 4 / 1_000_000 = 960 assertThat(generator.getBuffer().remaining()).isEqualTo(960); }