Adding API and internal export support for audio gaps in sequences.

PiperOrigin-RevId: 678235289
This commit is contained in:
samrobinson 2024-09-24 07:11:35 -07:00 committed by Copybara-Service
parent 43765b7567
commit 076eea283e
23 changed files with 6454 additions and 6 deletions

View File

@ -49,6 +49,7 @@
allow invoking events of subclass listeners
([1736](https://github.com/androidx/media/pull/1736)).
* Transformer:
* Add export support for gaps in sequences of audio EditedMediaItems.
* Track Selection:
* Extractors:
* Fix preroll sample handling for non-keyframe media start positions when

View File

@ -0,0 +1,227 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 2
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2078200747
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1746076349
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1572855937
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 701978997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1243111139
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1322796125
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 183250677
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1653767665
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1354849623
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -394780569
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1818125983
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2040268451
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1205101453
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1680621511
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1417062205
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 391927517
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1602519453
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -889560817
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1844125309
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1254048247
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 862533775
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1056907509
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 614586437
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1422444303
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1521025139
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -645048879
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1964215627
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 794382801
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1742698007
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1820518143
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1778289323
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1268893547
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1838744749
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1671917515
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1340018589
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1917601633
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -265336963
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -784922721
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1193402155
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1103096997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1473134533
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1817808281
size = 272
isKeyFrame = true
released = true

View File

@ -0,0 +1,227 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 2
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2078200747
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1746076349
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1572855937
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 701978997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 459593640
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 177383240
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 565637567
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1269391254
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1473724630
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1365108398
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 15208603
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -149452152
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 568136563
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1569944195
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1581189639
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 344240733
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1247810281
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 723599439
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1844125309
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1254048247
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 862533775
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1056907509
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 614586437
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1422444303
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1521025139
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -645048879
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1964215627
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 794382801
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1742698007
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1820518143
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1778289323
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1268893547
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1838744749
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1671917515
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1340018589
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1917601633
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -265336963
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -784922721
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1193402155
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1103096997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1473134533
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1817808281
size = 272
isKeyFrame = true
released = true

View File

@ -0,0 +1,117 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = -477126770
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 779113371
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 45842530
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2001000243
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -187462316
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -309708822
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1030869338
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1134039798
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2131288947
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1159697593
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -889164698
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1380568930
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1722863050
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1365744081
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -81471997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -6915052
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1634845963
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1252305359
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2127515647
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2077308846
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1055925064
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1128351030
size = 2184
isKeyFrame = true
released = true

View File

@ -0,0 +1,117 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 2
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1728208641
size = 2184
isKeyFrame = true
released = true

View File

@ -0,0 +1,377 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 2
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1549267417
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 189152495
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1814391561
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -422124093
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -155446957
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1488079801
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1669809701
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -894031225
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 40356789
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 971335451
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1732134737
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -446879687
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 868401927
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1206562483
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1400548769
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1068263999
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2145054801
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1570577127
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 10822971
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 688645803
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2108835899
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -722381595
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1250628323
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 244326497
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -698620401
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 271098305
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1004000469
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1556734443
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -903836437
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -177535827
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -595024459
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2131779733
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1910157521
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 131901723
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 583017977
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 163786317
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 387678787
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -884773583
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1782565003
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -270552755
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -371096827
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1960606887
size = 872
isKeyFrame = true
released = true

View File

@ -0,0 +1,592 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 2
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1039756463
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 532104865
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2624455
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 861767379
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 374370895
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -101038951
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1221457977
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 668147831
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -912268579
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1066036765
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1280807051
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -331910423
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -601176327
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1258553699
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1298154949
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1230948091
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1309853349
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1932471341
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1319660815
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 203254827
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -38648823
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 41026117
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 665344669
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1362552447
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -811356717
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1083196893
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 481568515
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1740292951
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 176097221
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1538356855
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1523294877
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1035272899
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2006397059
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1229497131
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 575153873
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -180951997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -155506985
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 771687811
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1771428289
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 415627769
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1851518133
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1491589801
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1451338191
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2030338071
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2140922517
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1748392625
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1287891629
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1923200619
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1521215509
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1640206823
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 210873943
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1744451301
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2000153215
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1039735551
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -109960687
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -370495703
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1284650595
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1361253863
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -857651477
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1997614047
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1362337995
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1629579951
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1326900633
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1032738365
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 415627231
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 57107875
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1660454425
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 285979697
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1504030063
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1211281407
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 820691967
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 319369447
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -245890127
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 151928257
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2008077475
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1938059573
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1983275801
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1943585545
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1433346369
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1711471215
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1312724333
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -675636013
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -12375949
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -180443079
size = 1144
isKeyFrame = true
released = true

View File

@ -0,0 +1,302 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -77784020
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1487579866
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -955640128
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1797926221
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1304162335
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 87515422
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1134039798
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2131288947
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1159697593
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -889164698
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1380568930
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1722863050
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1365744081
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -81471997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -6915052
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1634845963
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1252305359
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2127515647
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2077308846
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1055925064
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1806711606
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1326368952
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -161801624
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2080056822
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -716932048
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1439402914
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -793688784
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 34855870
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1205979058
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -690080937
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -542923942
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1305696330
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 785152593
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1048551992
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 522695938
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 575615445
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 372293125
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -547323125
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 119556475
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1819928231
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2147026131
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -293825684
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -742988832
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1521393535
size = 572
isKeyFrame = true
released = true

View File

@ -0,0 +1,192 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -77784020
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1487579866
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -955640128
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1797926221
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1304162335
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 87515422
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1134039798
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2131288947
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1159697593
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -889164698
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1380568930
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1722863050
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1365744081
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -81471997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -6915052
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1634845963
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1252305359
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2127515647
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2077308846
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1055925064
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1806711606
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1999233
size = 2484
isKeyFrame = true
released = true

View File

@ -0,0 +1,302 @@
format audio:
averageBitrate = 131072
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -77784020
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1487579866
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -955640128
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1797926221
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1304162335
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 87515422
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1134039798
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -2131288947
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1159697593
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -889164698
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1380568930
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1722863050
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1365744081
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -81471997
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -6915052
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1634845963
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1252305359
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2127515647
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2077308846
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1055925064
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1806711606
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1742602241
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -635847032
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1881983178
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -728439441
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 515653227
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -391208104
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 166656461
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 330396328
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -116386074
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 569267689
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1316476459
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -223671612
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1465862447
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2040352837
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1371156112
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1657641665
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1745756564
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2067094482
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 2009678119
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -1673523012
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1191811455
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = -120295709
size = 4096
isKeyFrame = true
sample:
trackType = audio
dataHashCode = 1474861853
size = 572
isKeyFrame = true
released = true

View File

@ -327,6 +327,9 @@ public class TransformerAndroidTestRunner {
}
for (EditedMediaItemSequence sequence : composition.sequences) {
for (EditedMediaItem editedMediaItem : sequence.editedMediaItems) {
if (editedMediaItem.isGap()) {
continue;
}
Uri mediaItemUri = checkNotNull(editedMediaItem.mediaItem.localConfiguration).uri;
String scheme = mediaItemUri.getScheme();
if (scheme != null && (scheme.equals("http") || scheme.equals("https"))) {

View File

@ -1610,6 +1610,74 @@ public class TransformerEndToEndTest {
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
public void start_audioCompositionWithFirstSequenceOffsetGap_isCorrect() throws Exception {
assumeFormatsSupported(
context,
testId,
/* inputFormat= */ MP4_ASSET.videoFormat,
/* outputFormat= */ MP4_ASSET.videoFormat);
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri)))
.setRemoveVideo(true)
.build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder()
.addGap(100_000)
.addItem(editedMediaItem)
.build(),
new EditedMediaItemSequence.Builder(editedMediaItem).build())
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build()
.run(testId, composition);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.processedInputs).hasSize(3);
}
@Test
public void start_audioVideoCompositionWithSecondSequenceIntervalGap_isCorrect()
throws Exception {
assumeFormatsSupported(
context,
testId,
/* inputFormat= */ MP4_ASSET.videoFormat,
/* outputFormat= */ MP4_ASSET.videoFormat);
EditedMediaItem videoItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri))).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(MP4_ASSET.uri)
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder().setEndPositionMs(300).build())
.build())
.setRemoveVideo(true)
.build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder(videoItem).build(),
new EditedMediaItemSequence.Builder()
.addItem(editedMediaItem)
.addGap(200_000)
.addItem(editedMediaItem)
.build())
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build()
.run(testId, composition);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.processedInputs).hasSize(4);
}
@Test
public void analyzeAudio_completesSuccessfully() throws Exception {
assumeFormatsSupported(

View File

@ -440,4 +440,17 @@ public final class Composition {
this.hdrMode = hdrMode;
this.retainHdrFromUltraHdrImage = retainHdrFromUltraHdrImage;
}
/**
* Return whether any {@linkplain EditedMediaItemSequence sequences} contain a {@linkplain
* EditedMediaItemSequence.Builder#addGap(long) gap}.
*/
/* package */ boolean hasGaps() {
for (int i = 0; i < sequences.size(); i++) {
if (sequences.get(i).hasGaps()) {
return true;
}
}
return false;
}
}

View File

@ -29,10 +29,12 @@ import androidx.media3.common.util.Util;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.extractor.mp4.Mp4Extractor;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.util.Objects;
/** A {@link MediaItem} with the transformations to apply to it. */
@UnstableApi
public final class EditedMediaItem {
/* package */ static final String GAP_MEDIA_ID = "androidx-media3-GapMediaItem";
/** A builder for {@link EditedMediaItem} instances. */
public static final class Builder {
@ -341,4 +343,12 @@ public final class EditedMediaItem {
}
return max(audioDurationUs, videoDurationUs);
}
/**
* Returns whether this {@code EditedMediaItem} is a {@linkplain
* EditedMediaItemSequence.Builder#addGap(long) gap}.
*/
/* package */ boolean isGap() {
return Objects.equals(mediaItem.mediaId, GAP_MEDIA_ID);
}
}

View File

@ -17,6 +17,7 @@ package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkArgument;
import androidx.media3.common.MediaItem;
import androidx.media3.common.util.UnstableApi;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
@ -81,6 +82,26 @@ public final class EditedMediaItemSequence {
return this;
}
/**
* Adds a gap to the sequence.
*
* <p>A gap is a period of time with no media.
*
* <p>Gaps are only supported in sequences of audio.
*
* @param durationUs The duration of the gap, in milliseconds.
* @return This builder, for convenience.
*/
@CanIgnoreReturnValue
public Builder addGap(long durationUs) {
items.add(
new EditedMediaItem.Builder(
new MediaItem.Builder().setMediaId(EditedMediaItem.GAP_MEDIA_ID).build())
.setDurationUs(durationUs)
.build());
return this;
}
/**
* See {@link EditedMediaItemSequence#isLooping}.
*
@ -157,4 +178,14 @@ public final class EditedMediaItemSequence {
!editedMediaItems.isEmpty(), "The sequence must contain at least one EditedMediaItem.");
this.isLooping = builder.isLooping;
}
/** Return whether any items are a {@linkplain Builder#addGap(long) gap}. */
/* package */ boolean hasGaps() {
for (int i = 0; i < editedMediaItems.size(); i++) {
if (editedMediaItems.get(i).isGap()) {
return true;
}
}
return false;
}
}

View File

@ -64,7 +64,7 @@ import java.util.concurrent.atomic.AtomicInteger;
private final List<EditedMediaItem> editedMediaItems;
private final boolean isLooping;
private final boolean forceAudioTrack;
private final AssetLoader.Factory assetLoaderFactory;
private final Factory assetLoaderFactory;
private final CompositionSettings compositionSettings;
private final Listener sequenceAssetLoaderListener;
private final HandlerWrapper handler;
@ -109,7 +109,7 @@ import java.util.concurrent.atomic.AtomicInteger;
public SequenceAssetLoader(
EditedMediaItemSequence sequence,
boolean forceAudioTrack,
AssetLoader.Factory assetLoaderFactory,
Factory assetLoaderFactory,
CompositionSettings compositionSettings,
Listener listener,
Clock clock,
@ -117,7 +117,7 @@ import java.util.concurrent.atomic.AtomicInteger;
editedMediaItems = sequence.editedMediaItems;
isLooping = sequence.isLooping;
this.forceAudioTrack = forceAudioTrack;
this.assetLoaderFactory = assetLoaderFactory;
this.assetLoaderFactory = new GapInterceptingAssetLoaderFactory(assetLoaderFactory);
this.compositionSettings = compositionSettings;
sequenceAssetLoaderListener = listener;
handler = clock.createHandler(looper, /* callback= */ null);
@ -131,7 +131,7 @@ import java.util.concurrent.atomic.AtomicInteger;
// constructor.
@SuppressWarnings("nullness:argument.type.incompatible")
AssetLoader currentAssetLoader =
assetLoaderFactory.createAssetLoader(
this.assetLoaderFactory.createAssetLoader(
editedMediaItems.get(0), looper, /* listener= */ this, compositionSettings);
this.currentAssetLoader = currentAssetLoader;
}
@ -340,12 +340,14 @@ import java.util.concurrent.atomic.AtomicInteger;
return;
}
EditedMediaItem editedMediaItem = editedMediaItems.get(currentMediaItemIndex);
onMediaItemChangedListener.onMediaItemChanged(
editedMediaItems.get(currentMediaItemIndex),
editedMediaItem,
/* durationUs= */ (trackType == C.TRACK_TYPE_AUDIO && isLooping && decodeAudio)
? C.TIME_UNSET
: currentAssetDurationUs,
/* decodedFormat= */ outputFormat,
/* decodedFormat= */ editedMediaItem.isGap() ? null : outputFormat,
/* isLast= */ currentMediaItemIndex == editedMediaItems.size() - 1);
}
@ -544,6 +546,13 @@ import java.util.concurrent.atomic.AtomicInteger;
}
}
private void onGapSignalled() {
nonEndedTrackCount.decrementAndGet();
if (currentMediaItemIndex < editedMediaItems.size() - 1) {
switchAssetLoader();
}
}
private void switchAssetLoader() {
handler.post(
() -> {
@ -611,4 +620,106 @@ import java.util.concurrent.atomic.AtomicInteger;
return new ClippingIterator(iterator.copyOf(), clippingValue);
}
}
/**
* Internally signals that the current asset is a {@linkplain
* EditedMediaItemSequence.Builder#addGap(long) gap}, but does no loading or processing of media.
*
* <p>This component requires downstream components to handle generation of the gap media.
*/
private final class GapSignalingAssetLoader implements AssetLoader {
private static final int OUTPUT_FORMAT_RETRY_DELAY_MS = 10;
private final long durationUs;
private final Format trackFormat;
private final Format decodedFormat;
private boolean outputtedFormat;
private GapSignalingAssetLoader(long durationUs) {
this.durationUs = durationUs;
this.trackFormat = new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_RAW).build();
this.decodedFormat =
new Format.Builder()
.setSampleMimeType(MimeTypes.AUDIO_RAW)
.setSampleRate(44100)
.setChannelCount(2)
.setPcmEncoding(C.ENCODING_PCM_16BIT)
.build();
}
@Override
public void start() {
onDurationUs(durationUs);
onTrackCount(1);
onTrackAdded(trackFormat, SUPPORTED_OUTPUT_TYPE_DECODED);
outputFormatToSequenceAssetLoader();
}
@Override
public @Transformer.ProgressState int getProgress(ProgressHolder progressHolder) {
progressHolder.progress = outputtedFormat ? 99 : 0;
return PROGRESS_STATE_AVAILABLE;
}
@Override
public ImmutableMap<Integer, String> getDecoderNames() {
return ImmutableMap.of();
}
@Override
public void release() {}
/** Outputs the gap format, scheduling to try again if unsuccessful. */
private void outputFormatToSequenceAssetLoader() {
try {
if (outputtedFormat) {
return;
}
@Nullable SampleConsumerWrapper sampleConsumerWrapper = onOutputFormat(decodedFormat);
if (sampleConsumerWrapper != null) {
outputtedFormat = true;
sampleConsumerWrapper.onGapSignalled();
} else {
handler.postDelayed(
this::outputFormatToSequenceAssetLoader, OUTPUT_FORMAT_RETRY_DELAY_MS);
}
} catch (ExportException e) {
onError(e);
} catch (RuntimeException e) {
onError(ExportException.createForAssetLoader(e, ExportException.ERROR_CODE_UNSPECIFIED));
}
}
}
/**
* Intercepts {@link AssetLoader.Factory} calls, when {@linkplain
* EditedMediaItemSequence.Builder#addGap(long) a gap} is detected, otherwise forwards them to the
* provided {@link AssetLoader.Factory}.
*
* <p>In the case that a gap is detected, a {@link GapSignalingAssetLoader} is returned.
*/
private final class GapInterceptingAssetLoaderFactory implements AssetLoader.Factory {
private final AssetLoader.Factory factory;
public GapInterceptingAssetLoaderFactory(AssetLoader.Factory factory) {
this.factory = factory;
}
@Override
public AssetLoader createAssetLoader(
EditedMediaItem editedMediaItem,
Looper looper,
Listener listener,
CompositionSettings compositionSettings) {
if (editedMediaItem.isGap()) {
return new GapSignalingAssetLoader(editedMediaItem.durationUs);
}
return factory.createAssetLoader(editedMediaItem, looper, listener, compositionSettings);
}
}
}

View File

@ -83,6 +83,9 @@ public final class TransformerUtil {
|| composition.sequences.get(sequenceIndex).editedMediaItems.size() > 1) {
return !composition.transmuxAudio;
}
if (composition.hasGaps()) {
return true;
}
if (encoderFactory.audioNeedsEncoding()) {
return true;
}

View File

@ -447,6 +447,278 @@ public class CompositionExportTest {
getCompositionDumpFilePath("seq-sample.wav+seq-sample.wav_clipped_100ms_to_400ms"));
}
@Test
public void start_audioCompositionWithFirstSequenceAsGap_isCorrect() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioItem1000ms =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder().addGap(1_000_000).build(),
new EditedMediaItemSequence.Builder(audioItem1000ms).build())
.build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
// Gaps are 44.1kHz, stereo by default. Sample.wav is 44.1kHz mono, so this test needs its own
// dump file.
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getCompositionDumpFilePath("seq-" + "gap_1000ms" + "+seq-" + getFileName(FILE_AUDIO_RAW)));
}
@Test
public void start_audioCompositionWithFirstSequenceOffsetGap_isCorrect() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioEditedMediaItem =
new EditedMediaItem.Builder(
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ))
.build();
EditedMediaItem otherAudioEditedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder()
.addGap(100_000)
.addItem(audioEditedMediaItem)
.build(),
new EditedMediaItemSequence.Builder(otherAudioEditedMediaItem).build())
.build();
transformer.start(composition, outputDir.newFile().getPath());
ExportResult exportResult = TransformerTestRunner.runLooper(transformer);
assertThat(exportResult.processedInputs).hasSize(3);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getCompositionDumpFilePath(
"seq-"
+ "gap_100ms-"
+ getFileName(FILE_AUDIO_RAW_STEREO_48000KHZ)
+ "+seq-"
+ getFileName(FILE_AUDIO_RAW)));
}
@Test
public void start_audioCompositionWithFirstSequencePaddingGap_isCorrect() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioItem300ms =
new EditedMediaItem.Builder(
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)
.buildUpon()
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder()
.setStartPositionMs(100)
.setEndPositionMs(400)
.build())
.build())
.build();
EditedMediaItem audioItem1000ms =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder()
.addItem(audioItem300ms)
.addGap(700_000)
.build(),
new EditedMediaItemSequence.Builder(audioItem1000ms).build())
.build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getCompositionDumpFilePath(
"seq-"
+ getFileName(FILE_AUDIO_RAW)
+ "+seq-"
+ getFileName(FILE_AUDIO_RAW)
+ "_clipped100msTo400ms-gap_700ms"));
}
@Test
public void start_audioVideoCompositionWithSecondSequenceOffsetGap_isCorrect() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioVideoEditedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO))
.build();
EditedMediaItem audioEditedMediaItem =
new EditedMediaItem.Builder(
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ))
.setRemoveVideo(true)
.build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder(audioVideoEditedMediaItem).build(),
new EditedMediaItemSequence.Builder()
.addGap(200_000)
.addItem(audioEditedMediaItem)
.build())
.setTransmuxVideo(true)
.build();
transformer.start(composition, outputDir.newFile().getPath());
ExportResult exportResult = TransformerTestRunner.runLooper(transformer);
assertThat(exportResult.processedInputs).hasSize(3);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getCompositionDumpFilePath(
"seq-"
+ getFileName(FILE_AUDIO_RAW_VIDEO)
+ "+seq-gap_200ms-"
+ getFileName(FILE_AUDIO_RAW_STEREO_48000KHZ)));
}
@Test
public void start_audioVideoCompositionWithSecondSequenceIntervalGap_isCorrect()
throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioVideoEditedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO))
.build();
EditedMediaItem audio300msEditedMediaItem =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ)
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder().setEndPositionMs(300).build())
.build())
.setRemoveVideo(true)
.build();
EditedMediaItem audio500msEditedMediaItem =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ)
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder()
.setStartPositionMs(300)
.setEndPositionMs(800)
.build())
.build())
.setRemoveVideo(true)
.build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder(audioVideoEditedMediaItem).build(),
new EditedMediaItemSequence.Builder()
.addItem(audio300msEditedMediaItem)
.addGap(200_000)
.addItem(audio500msEditedMediaItem)
.build())
.setTransmuxVideo(true)
.build();
transformer.start(composition, outputDir.newFile().getPath());
ExportResult exportResult = TransformerTestRunner.runLooper(transformer);
assertThat(exportResult.processedInputs).hasSize(4);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getCompositionDumpFilePath(
"seq-"
+ getFileName(FILE_AUDIO_RAW_VIDEO)
+ "+seq-"
+ getFileName(FILE_AUDIO_RAW_STEREO_48000KHZ)
+ "_clipped0msTo300ms-"
+ "gap_200ms-"
+ getFileName(FILE_AUDIO_RAW_STEREO_48000KHZ)
+ "_clipped300msTo800ms"));
}
@Test
public void start_audioVideoCompositionWithSecondSequencePaddingGap_isCorrect() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioVideoEditedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_VIDEO))
.build();
EditedMediaItem audioEditedMediaItem =
new EditedMediaItem.Builder(
MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW_STEREO_48000KHZ))
.setRemoveVideo(true)
.build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder(audioVideoEditedMediaItem).build(),
new EditedMediaItemSequence.Builder()
.addItem(audioEditedMediaItem)
.addGap(100_000)
.build())
.setTransmuxVideo(true)
.build();
transformer.start(composition, outputDir.newFile().getPath());
ExportResult exportResult = TransformerTestRunner.runLooper(transformer);
assertThat(exportResult.processedInputs).hasSize(3);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getCompositionDumpFilePath(
"seq-"
+ getFileName(FILE_AUDIO_RAW_VIDEO)
+ "+seq-"
+ getFileName(FILE_AUDIO_RAW_STEREO_48000KHZ)
+ "-gap_100ms"));
}
@Test
public void start_audioCompositionWithSecondSequenceAsGap_isCorrect() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioItem1000ms =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder(audioItem1000ms).build(),
new EditedMediaItemSequence.Builder().addGap(1_000_000).build())
.build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context, muxerFactory.getCreatedMuxer(), getDumpFileName(FILE_AUDIO_RAW));
}
@Test
public void start_audioCompositionWithBothSequencesAsGaps_isCorrect() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
Composition composition =
new Composition.Builder(
new EditedMediaItemSequence.Builder().addGap(500_000).build(),
new EditedMediaItemSequence.Builder().addGap(500_000).build())
.build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context, muxerFactory.getCreatedMuxer(), getDumpFileName("gap", "500ms"));
}
private static String getFileName(String filePath) {
int lastSeparator = filePath.lastIndexOf("/");
return filePath.substring(lastSeparator + 1);

View File

@ -141,6 +141,26 @@ public final class MediaItemExportTest {
removeEncodersAndDecoders();
}
@Test
public void start_gapOnlyExport_outputsSilence() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItemSequence gapSequence =
new EditedMediaItemSequence.Builder().addGap(500_000).build();
transformer.start(new Composition.Builder(gapSequence).build(), outputDir.newFile().getPath());
ExportResult result = TransformerTestRunner.runLooper(transformer);
// TODO(b/355201372) - Assert 500ms duration.
assertThat(result.durationMs).isAtLeast(487);
assertThat(result.durationMs).isAtMost(500);
DumpFileAsserts.assertOutput(
context, muxerFactory.getCreatedMuxer(), getDumpFileName("gap", "500ms"));
}
@Test
public void start_audioAndVideoPassthrough_withClippingStartAtKeyFrame_completesSuccessfully()
throws Exception {

View File

@ -29,6 +29,7 @@ import static androidx.media3.transformer.TestUtil.createChannelCountChangingAud
import static androidx.media3.transformer.TestUtil.createPitchChangingAudioProcessor;
import static androidx.media3.transformer.TestUtil.createTransformerBuilder;
import static androidx.media3.transformer.TestUtil.getDumpFileName;
import static androidx.media3.transformer.TestUtil.getSequenceDumpFilePath;
import static androidx.media3.transformer.TestUtil.removeEncodersAndDecoders;
import static com.google.common.truth.Truth.assertThat;
@ -498,6 +499,171 @@ public final class SequenceExportTest {
"silenceHighPitch"));
}
@Test
public void start_gapGap_completesSuccessfully() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence.Builder().addGap(300_000).addGap(200_000).build();
Composition composition = new Composition.Builder(sequence).build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context, muxerFactory.getCreatedMuxer(), getDumpFileName("gap", "500ms"));
}
@Test
public void start_itemGapGap_completesSuccessfully() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem firstAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence.Builder()
.addItem(firstAudioItem)
.addGap(500_000)
.addGap(200_000)
.build();
Composition composition = new Composition.Builder(sequence).build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getSequenceDumpFilePath(
ImmutableList.of(FILE_AUDIO_RAW.replace("wav/", ""), "gap_500ms", "gap_200ms")));
}
@Test
public void start_gapGapItem_completesSuccessfully() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem audioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence.Builder()
.addGap(200_000)
.addGap(500_000)
.addItem(audioItem)
.build();
Composition composition = new Composition.Builder(sequence).build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getSequenceDumpFilePath(
ImmutableList.of("gap_200ms", "gap_500ms", FILE_AUDIO_RAW.replace("wav/", ""))));
}
@Test
public void start_itemGapGapItem_completesSuccessfully() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem firstAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItem secondAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence.Builder()
.addItem(firstAudioItem)
.addGap(500_000)
.addGap(200_000)
.addItem(secondAudioItem)
.build();
Composition composition = new Composition.Builder(sequence).build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getSequenceDumpFilePath(
ImmutableList.of(
FILE_AUDIO_RAW.replace("wav/", ""),
"gap_500ms",
"gap_200ms",
FILE_AUDIO_RAW.replace("wav/", ""))));
}
@Test
public void start_itemGapItemGap_completesSuccessfully() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem firstAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItem secondAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence.Builder()
.addItem(firstAudioItem)
.addGap(200_000)
.addItem(secondAudioItem)
.addGap(500_000)
.build();
Composition composition = new Composition.Builder(sequence).build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getSequenceDumpFilePath(
ImmutableList.of(
FILE_AUDIO_RAW.replace("wav/", ""),
"gap_200ms",
FILE_AUDIO_RAW.replace("wav/", ""),
"gap_500ms")));
}
@Test
public void start_gapItemGapItem_completesSuccessfully() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);
Transformer transformer =
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
EditedMediaItem firstAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItem secondAudioItem =
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence.Builder()
.addGap(500_000)
.addItem(firstAudioItem)
.addGap(200_000)
.addItem(secondAudioItem)
.build();
Composition composition = new Composition.Builder(sequence).build();
transformer.start(composition, outputDir.newFile().getPath());
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context,
muxerFactory.getCreatedMuxer(),
getSequenceDumpFilePath(
ImmutableList.of(
"gap_500ms",
FILE_AUDIO_RAW.replace("wav/", ""),
"gap_200ms",
FILE_AUDIO_RAW.replace("wav/", ""))));
}
@Test
public void concatenateTwoAudioItems_withSameFormat_completesSuccessfully() throws Exception {
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ true);