Tests for composition audio effects

Add tests for the changes to AudioGraph that support composition audio effects

PiperOrigin-RevId: 610691768
This commit is contained in:
Googler 2024-02-27 03:01:55 -08:00 committed by Copybara-Service
parent 477ace1be9
commit 0e0e1c4f1a
13 changed files with 2209 additions and 0 deletions

View file

@ -0,0 +1,373 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
metadata = entries=[xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
format video:
id = 1
sampleMimeType = video/avc
codecs = avc1.64001F
maxInputSize = 36722
width = 1080
height = 720
frameRate = 29.970028
colorInfo:
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
initializationData:
data = length 29, hash 4746B5D9
data = length 10, hash 7A0D0F2B
container metadata = entries=[xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
container metadata = entries=[xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 46439
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 69659
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 116099
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 139319
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 185759
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 208979
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 255419
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 278639
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 301859
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 348299
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 371519
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 417959
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 441179
sample:
trackType = audio
dataHashCode = 1737035649
size = 1092
isKeyFrame = true
presentationTimeUs = 487619
sample:
trackType = audio
dataHashCode = -345689983
size = 3004
isKeyFrame = true
presentationTimeUs = 500000
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 534058
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 580498
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 603718
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 650158
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 673378
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 719818
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
presentationTimeUs = 743038
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 789478
sample:
trackType = audio
dataHashCode = -1276182527
size = 2048
isKeyFrame = true
presentationTimeUs = 812698
sample:
trackType = audio
dataHashCode = -809762815
size = 8192
isKeyFrame = true
presentationTimeUs = 835918
sample:
trackType = audio
dataHashCode = 820010753
size = 6280
isKeyFrame = true
presentationTimeUs = 928798
sample:
trackType = audio
dataHashCode = 521969921
size = 1912
isKeyFrame = true
presentationTimeUs = 1000000
sample:
trackType = video
dataHashCode = -770308242
size = 36692
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = video
dataHashCode = -732087136
size = 5312
isKeyFrame = false
presentationTimeUs = 66733
sample:
trackType = video
dataHashCode = 468156717
size = 599
isKeyFrame = false
presentationTimeUs = 33366
sample:
trackType = video
dataHashCode = 1150349584
size = 7735
isKeyFrame = false
presentationTimeUs = 200200
sample:
trackType = video
dataHashCode = 1443582006
size = 987
isKeyFrame = false
presentationTimeUs = 133466
sample:
trackType = video
dataHashCode = -310585145
size = 673
isKeyFrame = false
presentationTimeUs = 100100
sample:
trackType = video
dataHashCode = 807460688
size = 523
isKeyFrame = false
presentationTimeUs = 166833
sample:
trackType = video
dataHashCode = 1936487090
size = 6061
isKeyFrame = false
presentationTimeUs = 333666
sample:
trackType = video
dataHashCode = -32297181
size = 992
isKeyFrame = false
presentationTimeUs = 266933
sample:
trackType = video
dataHashCode = 1529616406
size = 623
isKeyFrame = false
presentationTimeUs = 233566
sample:
trackType = video
dataHashCode = 1949198785
size = 421
isKeyFrame = false
presentationTimeUs = 300300
sample:
trackType = video
dataHashCode = -147880287
size = 4899
isKeyFrame = false
presentationTimeUs = 433766
sample:
trackType = video
dataHashCode = 1369083472
size = 568
isKeyFrame = false
presentationTimeUs = 400400
sample:
trackType = video
dataHashCode = 965782073
size = 620
isKeyFrame = false
presentationTimeUs = 367033
sample:
trackType = video
dataHashCode = -261176150
size = 5450
isKeyFrame = false
presentationTimeUs = 567233
sample:
trackType = video
dataHashCode = -1830836678
size = 1051
isKeyFrame = false
presentationTimeUs = 500500
sample:
trackType = video
dataHashCode = 1767407540
size = 874
isKeyFrame = false
presentationTimeUs = 467133
sample:
trackType = video
dataHashCode = 918440283
size = 781
isKeyFrame = false
presentationTimeUs = 533866
sample:
trackType = video
dataHashCode = -1408463661
size = 4725
isKeyFrame = false
presentationTimeUs = 700700
sample:
trackType = video
dataHashCode = 1569455924
size = 1022
isKeyFrame = false
presentationTimeUs = 633966
sample:
trackType = video
dataHashCode = -1723778407
size = 790
isKeyFrame = false
presentationTimeUs = 600600
sample:
trackType = video
dataHashCode = 1578275472
size = 610
isKeyFrame = false
presentationTimeUs = 667333
sample:
trackType = video
dataHashCode = 1989768395
size = 2751
isKeyFrame = false
presentationTimeUs = 834166
sample:
trackType = video
dataHashCode = -1215674502
size = 745
isKeyFrame = false
presentationTimeUs = 767433
sample:
trackType = video
dataHashCode = -814473606
size = 621
isKeyFrame = false
presentationTimeUs = 734066
sample:
trackType = video
dataHashCode = 498370894
size = 505
isKeyFrame = false
presentationTimeUs = 800800
sample:
trackType = video
dataHashCode = -1051506468
size = 1268
isKeyFrame = false
presentationTimeUs = 967633
sample:
trackType = video
dataHashCode = -1025604144
size = 880
isKeyFrame = false
presentationTimeUs = 900900
sample:
trackType = video
dataHashCode = -913586520
size = 530
isKeyFrame = false
presentationTimeUs = 867533
sample:
trackType = video
dataHashCode = 1340459242
size = 568
isKeyFrame = false
presentationTimeUs = 934266
released = true

View file

@ -0,0 +1,73 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 48000
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = -206878443
size = 9598
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = audio
dataHashCode = 1925380271
size = 9600
isKeyFrame = true
presentationTimeUs = 99979
sample:
trackType = audio
dataHashCode = -1463691457
size = 9600
isKeyFrame = true
presentationTimeUs = 199979
sample:
trackType = audio
dataHashCode = -1949646832
size = 9600
isKeyFrame = true
presentationTimeUs = 299979
sample:
trackType = audio
dataHashCode = 448289446
size = 9600
isKeyFrame = true
presentationTimeUs = 399979
sample:
trackType = audio
dataHashCode = 1075917616
size = 9600
isKeyFrame = true
presentationTimeUs = 499979
sample:
trackType = audio
dataHashCode = -2108784941
size = 9600
isKeyFrame = true
presentationTimeUs = 599979
sample:
trackType = audio
dataHashCode = 1861606067
size = 9600
isKeyFrame = true
presentationTimeUs = 699979
sample:
trackType = audio
dataHashCode = -1038569478
size = 9600
isKeyFrame = true
presentationTimeUs = 799979
sample:
trackType = audio
dataHashCode = 646441790
size = 9600
isKeyFrame = true
presentationTimeUs = 899979
sample:
trackType = audio
dataHashCode = 340
size = 2
isKeyFrame = true
presentationTimeUs = 999979
released = true

View file

@ -0,0 +1,73 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 48000
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1079020216
size = 9598
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = audio
dataHashCode = -1587539971
size = 9600
isKeyFrame = true
presentationTimeUs = 99979
sample:
trackType = audio
dataHashCode = 1662487784
size = 9600
isKeyFrame = true
presentationTimeUs = 199979
sample:
trackType = audio
dataHashCode = 2046052835
size = 9600
isKeyFrame = true
presentationTimeUs = 299979
sample:
trackType = audio
dataHashCode = 662989576
size = 9600
isKeyFrame = true
presentationTimeUs = 399979
sample:
trackType = audio
dataHashCode = 493382594
size = 9600
isKeyFrame = true
presentationTimeUs = 499979
sample:
trackType = audio
dataHashCode = -936959003
size = 9600
isKeyFrame = true
presentationTimeUs = 599979
sample:
trackType = audio
dataHashCode = -373052102
size = 9600
isKeyFrame = true
presentationTimeUs = 699979
sample:
trackType = audio
dataHashCode = -2008343760
size = 9600
isKeyFrame = true
presentationTimeUs = 799979
sample:
trackType = audio
dataHashCode = -1783150403
size = 9600
isKeyFrame = true
presentationTimeUs = 899979
sample:
trackType = audio
dataHashCode = -280
size = 2
isKeyFrame = true
presentationTimeUs = 999979
released = true

View file

@ -0,0 +1,67 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 100000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 200000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 300000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 400000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 500000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 600000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 700000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 800000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 900000
released = true

View file

@ -0,0 +1,73 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 100000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 200000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 300000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 400000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 500000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 600000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 700000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 800000
sample:
trackType = audio
dataHashCode = -1157240447
size = 8820
isKeyFrame = true
presentationTimeUs = 900000
sample:
trackType = audio
dataHashCode = -1163604095
size = 1604
isKeyFrame = true
presentationTimeUs = 1000000
released = true

View file

@ -0,0 +1,97 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 2
sampleRate = 48000
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = -226169394
size = 15528
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = audio
dataHashCode = -1654106973
size = 17436
isKeyFrame = true
presentationTimeUs = 80875
sample:
trackType = audio
dataHashCode = 1078555669
size = 19384
isKeyFrame = true
presentationTimeUs = 171687
sample:
trackType = audio
dataHashCode = -1783495042
size = 8904
isKeyFrame = true
presentationTimeUs = 272645
sample:
trackType = audio
dataHashCode = 1415708326
size = 19232
isKeyFrame = true
presentationTimeUs = 319020
sample:
trackType = audio
dataHashCode = -907128755
size = 9688
isKeyFrame = true
presentationTimeUs = 419187
sample:
trackType = audio
dataHashCode = -855583041
size = 28564
isKeyFrame = true
presentationTimeUs = 469645
sample:
trackType = audio
dataHashCode = -141401047
size = 19388
isKeyFrame = true
presentationTimeUs = 618416
sample:
trackType = audio
dataHashCode = -1258167167
size = 19680
isKeyFrame = true
presentationTimeUs = 719395
sample:
trackType = audio
dataHashCode = -1950277707
size = 19796
isKeyFrame = true
presentationTimeUs = 821895
sample:
trackType = audio
dataHashCode = -71854735
size = 9096
isKeyFrame = true
presentationTimeUs = 925000
sample:
trackType = audio
dataHashCode = -1667813033
size = 28344
isKeyFrame = true
presentationTimeUs = 972375
sample:
trackType = audio
dataHashCode = 473686109
size = 18848
isKeyFrame = true
presentationTimeUs = 1120000
sample:
trackType = audio
dataHashCode = 283620169
size = 19384
isKeyFrame = true
presentationTimeUs = 1218166
sample:
trackType = audio
dataHashCode = 581004623
size = 5668
isKeyFrame = true
presentationTimeUs = 1319125
released = true

View file

@ -0,0 +1,31 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 2
sampleRate = 48000
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = -119496703
size = 19200
isKeyFrame = true
presentationTimeUs = 0
sample:
trackType = audio
dataHashCode = -119496703
size = 19200
isKeyFrame = true
presentationTimeUs = 100000
sample:
trackType = audio
dataHashCode = -119496703
size = 19200
isKeyFrame = true
presentationTimeUs = 200000
sample:
trackType = audio
dataHashCode = 197067009
size = 9336
isKeyFrame = true
presentationTimeUs = 300000
released = true

View file

@ -1045,6 +1045,45 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.channelCount).isEqualTo(2);
}
@Test
public void audioComposition_noEffects_transmuxes() throws Exception {
String testId = "audioComposition_noEffects_transmuxes";
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
.setRemoveVideo(true)
.build();
Composition composition =
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem)).build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build()
.run(testId, composition);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
}
@Test
public void audioComposition_compositionEffects_transcodes() throws Exception {
String testId = "audioComposition_compositionEffects_transcodes";
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
.setRemoveVideo(true)
.build();
Composition composition =
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
.setEffects(
new Effects(ImmutableList.of(createSonic(/* pitch= */ 2f)), ImmutableList.of()))
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build()
.run(testId, composition);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED);
}
@Test
public void transcode_withOutputVideoMimeTypeAv1_completesSuccessfully() throws Exception {
if (AndroidTestUtil.skipAndLogIfFormatsUnsupported(

View file

@ -35,6 +35,7 @@ import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import androidx.media3.common.MediaItem;
import androidx.media3.common.MimeTypes;
import androidx.media3.common.audio.SonicAudioProcessor;
import androidx.media3.test.utils.DumpFileAsserts;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@ -315,6 +316,62 @@ public class CompositionExportTest {
"loopingAudio" + getFileName(FILE_AUDIO_RAW_VIDEO)));
}
@Test
public void start_adjustSampleRateWithComposition_completesSuccessfully() throws Exception {
SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setOutputSampleRateHz(48000);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
Composition composition =
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
.setEffects(createAudioEffects(sonicAudioProcessor))
.build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
// TODO: b/311614619 - Use the same dump as
// {@link MediaItemExportTest#start_adjustSampleRate_completesSuccessfully}.
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getDumpFileName(
/* originalFileName= */ FILE_AUDIO_RAW,
/* modifications...= */ "48000hzViaComposition"));
}
@Test
public void start_compositionOfConcurrentAudio_changesSampleRateWithEffect() throws Exception {
SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setOutputSampleRateHz(48000);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem rawAudioEditedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence(rawAudioEditedMediaItem),
new EditedMediaItemSequence(rawAudioEditedMediaItem))
.setEffects(createAudioEffects(sonicAudioProcessor))
.build();
transformer.start(composition, outputDir.newFile().getPath());
ExportResult exportResult = TransformerTestRunner.runLooper(transformer);
assertThat(exportResult.processedInputs).hasSize(2);
assertThat(exportResult.sampleRate).isEqualTo(48000);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getDumpFileName(
FILE_AUDIO_RAW,
/* modifications...= */ "mixed",
getFileName(FILE_AUDIO_RAW),
"48000hz"));
}
private static String getFileName(String filePath) {
int lastSeparator = filePath.lastIndexOf("/");
return filePath.substring(lastSeparator + 1);

View file

@ -25,7 +25,9 @@ import static androidx.media3.transformer.TestUtil.FILE_AUDIO_VIDEO;
import static androidx.media3.transformer.TestUtil.FILE_VIDEO_ONLY;
import static androidx.media3.transformer.TestUtil.addAudioDecoders;
import static androidx.media3.transformer.TestUtil.addAudioEncoders;
import static androidx.media3.transformer.TestUtil.createAudioEffects;
import static androidx.media3.transformer.TestUtil.createTransformerBuilder;
import static androidx.media3.transformer.TestUtil.createVolumeScalingAudioProcessor;
import static androidx.media3.transformer.TestUtil.getDumpFileName;
import static androidx.media3.transformer.TestUtil.removeEncodersAndDecoders;
import static org.junit.Assume.assumeFalse;
@ -137,4 +139,53 @@ public final class ParameterizedItemExportTest {
muxerFactory.getCreatedMuxer(),
getDumpFileName(assetFile, /* modifications...= */ "silence"));
}
@Test
public void generateSilenceWithItemEffect() throws Exception {
assumeFalse(VIDEO_ONLY_ASSETS.contains(assetFile));
assumeFalse(
"Audio effects in Robolectric tests require PCM input",
assetFile.equals(FILE_AUDIO_VIDEO) || assetFile.equals(FILE_AUDIO_AMR_NB));
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem item =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + assetFile))
.setEffects(createAudioEffects(createVolumeScalingAudioProcessor(0f)))
.build();
Composition composition = new Composition.Builder(new EditedMediaItemSequence(item)).build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
ApplicationProvider.getApplicationContext(),
muxerFactory.getCreatedMuxer(),
getDumpFileName(assetFile, /* modifications...= */ "silenceFromEffect"));
}
@Test
public void generateSilenceWithCompositionEffect() throws Exception {
assumeFalse(VIDEO_ONLY_ASSETS.contains(assetFile));
assumeFalse(
"Audio effects in Robolectric tests require PCM input",
assetFile.equals(FILE_AUDIO_VIDEO) || assetFile.equals(FILE_AUDIO_AMR_NB));
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem item =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + assetFile)).build();
Composition composition =
new Composition.Builder(new EditedMediaItemSequence(item))
.setEffects(createAudioEffects(createVolumeScalingAudioProcessor(0f)))
.build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
ApplicationProvider.getApplicationContext(),
muxerFactory.getCreatedMuxer(),
getDumpFileName(assetFile, /* modifications...= */ "silenceFromEffect"));
}
}

View file

@ -25,6 +25,7 @@ import static androidx.media3.transformer.TestUtil.FILE_AUDIO_VIDEO_INCREASING_T
import static androidx.media3.transformer.TestUtil.addAudioDecoders;
import static androidx.media3.transformer.TestUtil.addAudioEncoders;
import static androidx.media3.transformer.TestUtil.createAudioEffects;
import static androidx.media3.transformer.TestUtil.createChannelCountChangingAudioProcessor;
import static androidx.media3.transformer.TestUtil.createPitchChangingAudioProcessor;
import static androidx.media3.transformer.TestUtil.createTransformerBuilder;
import static androidx.media3.transformer.TestUtil.getDumpFileName;
@ -34,6 +35,7 @@ import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import androidx.media3.common.MediaItem;
import androidx.media3.common.MimeTypes;
import androidx.media3.common.audio.SonicAudioProcessor;
import androidx.media3.effect.RgbFilter;
import androidx.media3.test.utils.DumpFileAsserts;
import androidx.test.core.app.ApplicationProvider;
@ -642,4 +644,70 @@ public final class SequenceExportTest {
/* modifications...= */ "highPitch",
"sample.wavLowPitch"));
}
@Test
public void concatenateTwoAudioItems_withDiffFormatAndCompositionEffects_completesSuccessfully()
throws Exception {
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
MediaItem stereo48000Audio =
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ);
MediaItem mono44100Audio = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence(
new EditedMediaItem.Builder(stereo48000Audio).build(),
new EditedMediaItem.Builder(mono44100Audio).build()))
.setEffects(createAudioEffects(createPitchChangingAudioProcessor(2f)))
.build();
transformer.start(composition, outputDir.newFile().getPath());
ExportResult exportResult = TransformerTestRunner.runLooper(transformer);
assertThat(exportResult.sampleRate).isEqualTo(48_000);
assertThat(exportResult.channelCount).isEqualTo(2);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getDumpFileName(
/* originalFileName= */ FILE_AUDIO_RAW_STEREO_48000KHZ,
/* modifications...= */ "original",
"sample.wav",
"highPitch"));
}
@Test
public void concatenateTwoAudioItems_withDiffEffectsAndCompositionEffects_completesSuccessfully()
throws Exception {
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
MediaItem audioOnlyMediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW);
EditedMediaItem twoChannelMediaItem =
new EditedMediaItem.Builder(audioOnlyMediaItem)
.setRemoveVideo(true)
.setEffects(
createAudioEffects(
createChannelCountChangingAudioProcessor(/* outputChannelCount= */ 2)))
.build();
EditedMediaItem oneChannelMediaItem =
new EditedMediaItem.Builder(audioOnlyMediaItem)
.setRemoveVideo(true)
.setEffects(
createAudioEffects(
createChannelCountChangingAudioProcessor(/* outputChannelCount= */ 1)))
.build();
SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setOutputSampleRateHz(48_000);
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence(twoChannelMediaItem, oneChannelMediaItem))
.setEffects(createAudioEffects(sonicAudioProcessor))
.build();
transformer.start(composition, outputDir.newFile().getPath());
ExportResult exportResult = TransformerTestRunner.runLooper(transformer);
assertThat(exportResult.sampleRate).isEqualTo(48_000);
assertThat(exportResult.channelCount).isEqualTo(2);
}
}

View file

@ -94,6 +94,16 @@ public final class TestUtil {
return audioProcessor;
}
public static ChannelMixingAudioProcessor createChannelCountChangingAudioProcessor(
int outputChannelCount) {
ChannelMixingAudioProcessor audioProcessor = new ChannelMixingAudioProcessor();
for (int inputChannelCount = 1; inputChannelCount <= 2; inputChannelCount++) {
audioProcessor.putChannelMixingMatrix(
ChannelMixingMatrix.create(inputChannelCount, outputChannelCount));
}
return audioProcessor;
}
public static String getDumpFileName(String originalFileName, String... modifications) {
String fileName = DUMP_FILE_OUTPUT_DIRECTORY + '/' + originalFileName + '/';
if (modifications.length == 0) {