Use info from unseekable Xing frame when falling back to CBR seeking

This change uses the duration and byte count of the Xing frame, if
they're present, to estimate the bitrate of the stream. The seeking
will still be inaccurate (because we're doing CBR seeking in a VBR
stream), but it will be more accurate than basing the bitrate on the
first MP3 frame we read. It will also mean the duration reported is
accurate.

This change also ensures that if the Xing frame contains the number of
audio bytes but no ToC, the audio data length is still propagated into
the `XingSeeker` (and therefore into the `ConstantBitrateSeeker` too).

Issue: androidx/media#2194
PiperOrigin-RevId: 736100104
This commit is contained in:
ibaker 2025-03-12 05:48:47 -07:00 committed by Copybara-Service
parent 1918a256cc
commit 99767c6e25
18 changed files with 403 additions and 332 deletions

View File

@ -7,6 +7,10 @@
* Transformer:
* Track Selection:
* Extractors:
* MP3: Use duration and data size from unseekable Xing, VBRI and similar
variable bitrate metadata when falling back to constant bitrate seeking
due to `FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)`
([#2194](https://github.com/androidx/media/issues/2194)).
* DataSource:
* Audio:
* Allow constant power upmixing/downmixing in DefaultAudioMixer.

View File

@ -75,6 +75,11 @@ import androidx.media3.extractor.MpegAudioUtil;
return getTimeUsAtPosition(position);
}
@Override
public long getDataStartPosition() {
return firstFramePosition;
}
@Override
public long getDataEndPosition() {
return dataEndPosition;

View File

@ -27,6 +27,7 @@ import java.math.RoundingMode;
@VisibleForTesting
/* package */ static final long MIN_TIME_BETWEEN_POINTS_US = C.MICROS_PER_SECOND / 10;
private final long dataStartPosition;
private final long dataEndPosition;
private final int averageBitrate;
private final IndexSeekMap indexSeekMap;
@ -37,6 +38,7 @@ import java.math.RoundingMode;
/* positions= */ new long[] {dataStartPosition},
/* timesUs= */ new long[] {0L},
durationUs);
this.dataStartPosition = dataStartPosition;
this.dataEndPosition = dataEndPosition;
if (durationUs != C.TIME_UNSET) {
long bitrate =
@ -54,6 +56,11 @@ import java.math.RoundingMode;
return indexSeekMap.getTimeUs(position);
}
@Override
public long getDataStartPosition() {
return dataStartPosition;
}
@Override
public long getDataEndPosition() {
return dataEndPosition;

View File

@ -123,6 +123,11 @@ import androidx.media3.extractor.metadata.id3.MlltFrame;
}
}
@Override
public long getDataStartPosition() {
return 0;
}
@Override
public long getDataEndPosition() {
return C.INDEX_UNSET;

View File

@ -501,11 +501,43 @@ public final class Mp3Extractor implements Extractor {
resultSeeker = seekFrameSeeker;
}
if (resultSeeker == null
|| (!resultSeeker.isSeekable() && (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0)) {
if (resultSeeker != null
&& shouldFallbackToConstantBitrateSeeking(resultSeeker)
&& resultSeeker.getDurationUs() != C.TIME_UNSET
&& (resultSeeker.getDataEndPosition() != C.INDEX_UNSET
|| input.getLength() != C.LENGTH_UNSET)) {
// resultSeeker does not allow seeking, but does provide a duration and constant bitrate
// seeking has been requested, so we can do 'enhanced' CBR seeking using this duration info.
long dataStart =
resultSeeker.getDataStartPosition() != C.INDEX_UNSET
? resultSeeker.getDataStartPosition()
: 0;
long inputLength =
resultSeeker.getDataEndPosition() != C.INDEX_UNSET
? resultSeeker.getDataEndPosition()
: input.getLength();
long audioLength = inputLength - dataStart;
int bitrate =
Ints.saturatedCast(
Util.scaleLargeValue(
audioLength,
Byte.SIZE * C.MICROS_PER_SECOND,
resultSeeker.getDurationUs(),
RoundingMode.HALF_UP));
// inputLength will never be LENGTH_UNSET because of the outer if-condition, so we can pass
// (vacuously) false here for allowSeeksIfLengthUnknown.
resultSeeker =
new ConstantBitrateSeeker(
inputLength,
dataStart,
bitrate,
C.LENGTH_UNSET,
/* allowSeeksIfLengthUnknown= */ false);
} else if (resultSeeker == null || shouldFallbackToConstantBitrateSeeking(resultSeeker)) {
// Either we found no seek or VBR info, so we must assume the file is CBR (even without the
// flag(s) being set), or an 'enable CBR seeking flag' is set and we found some seek info,
// but not enough to seek with. In either case, we fall back to CBR seeking.
// flag(s) being set), or an 'enable CBR seeking flag' is set and we found some seek info, but
// not enough to do 'enhanced' CBR seeking with. In either case, we fall back to CBR seeking
// without any additional info from the file.
resultSeeker =
getConstantBitrateSeeker(
input, (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0);
@ -514,6 +546,10 @@ public final class Mp3Extractor implements Extractor {
return resultSeeker;
}
private boolean shouldFallbackToConstantBitrateSeeking(Seeker seeker) {
return !seeker.isSeekable() && (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0;
}
/**
* Consumes the next frame from the {@code input} if it contains VBRI or Xing seeking metadata,
* returning a {@link Seeker} if the metadata was present and valid, or {@code null} otherwise.

View File

@ -33,6 +33,12 @@ import androidx.media3.extractor.SeekMap;
*/
long getTimeUs(long position);
/**
* Returns the position (byte offset) in the stream that is immediately before audio data, or 0 if
* not known.
*/
long getDataStartPosition();
/**
* Returns the position (byte offset) in the stream that is immediately after audio data, or
* {@link C#INDEX_UNSET} if not known.
@ -57,6 +63,11 @@ import androidx.media3.extractor.SeekMap;
return 0;
}
@Override
public long getDataStartPosition() {
return 0;
}
@Override
public long getDataEndPosition() {
// Position unset as we do not know the data end position. Note that returning 0 doesn't work.

View File

@ -51,7 +51,8 @@ import androidx.media3.extractor.SeekPoint;
ParsableByteArray frame) {
frame.skipBytes(6);
int bytes = frame.readInt();
long endOfMp3Data = position + mpegAudioHeader.frameSize + bytes;
long startOfMp3Data = position + mpegAudioHeader.frameSize;
long endOfMp3Data = startOfMp3Data + bytes;
int numFrames = frame.readInt();
if (numFrames <= 0) {
return null;
@ -105,20 +106,28 @@ import androidx.media3.extractor.SeekPoint;
endOfMp3Data = max(endOfMp3Data, position);
}
return new VbriSeeker(timesUs, positions, durationUs, endOfMp3Data, mpegAudioHeader.bitrate);
return new VbriSeeker(
timesUs, positions, durationUs, startOfMp3Data, endOfMp3Data, mpegAudioHeader.bitrate);
}
private final long[] timesUs;
private final long[] positions;
private final long durationUs;
private final long dataStartPosition;
private final long dataEndPosition;
private final int bitrate;
private VbriSeeker(
long[] timesUs, long[] positions, long durationUs, long dataEndPosition, int bitrate) {
long[] timesUs,
long[] positions,
long durationUs,
long dataStartPosition,
long dataEndPosition,
int bitrate) {
this.timesUs = timesUs;
this.positions = positions;
this.durationUs = durationUs;
this.dataStartPosition = dataStartPosition;
this.dataEndPosition = dataEndPosition;
this.bitrate = bitrate;
}
@ -150,6 +159,11 @@ import androidx.media3.extractor.SeekPoint;
return durationUs;
}
@Override
public long getDataStartPosition() {
return dataStartPosition;
}
@Override
public long getDataEndPosition() {
return dataEndPosition;

View File

@ -42,11 +42,6 @@ import androidx.media3.extractor.SeekPoint;
if (durationUs == C.TIME_UNSET) {
return null;
}
if (xingFrame.dataSize == C.LENGTH_UNSET || xingFrame.tableOfContents == null) {
// If the size in bytes or table of contents is missing, the stream is not seekable.
return new XingSeeker(
position, xingFrame.header.frameSize, durationUs, xingFrame.header.bitrate);
}
return new XingSeeker(
position,
xingFrame.header.frameSize,
@ -72,16 +67,6 @@ import androidx.media3.extractor.SeekPoint;
*/
@Nullable private final long[] tableOfContents;
private XingSeeker(long dataStartPosition, int xingFrameSize, long durationUs, int bitrate) {
this(
dataStartPosition,
xingFrameSize,
durationUs,
bitrate,
/* dataSize= */ C.LENGTH_UNSET,
/* tableOfContents= */ null);
}
private XingSeeker(
long dataStartPosition,
int xingFrameSize,
@ -157,6 +142,11 @@ import androidx.media3.extractor.SeekPoint;
return durationUs;
}
@Override
public long getDataStartPosition() {
return dataStartPosition + xingFrameSize;
}
@Override
public long getDataEndPosition() {
return dataEndPosition;

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 38160
sample count = 117
track duration = 9540000
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 25344
sample count = 80
track duration = 9540000
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096
@ -21,323 +21,323 @@ track 0:
encoderPadding = 576
metadata = entries=[TSSE: description=null: values=[Lavf58.29.100]]
sample 0:
time = 3204000
time = 943055
flags = 1
data = length 336, hash E917C122
sample 1:
time = 3228000
time = 967055
flags = 1
data = length 336, hash 10ED1470
sample 2:
time = 3252000
time = 991055
flags = 1
data = length 288, hash 706B8A7C
sample 3:
time = 3276000
time = 1015055
flags = 1
data = length 336, hash 71FFE4A0
sample 4:
time = 3300000
time = 1039055
flags = 1
data = length 336, hash D4160463
sample 5:
time = 3324000
time = 1063055
flags = 1
data = length 336, hash EC557B14
sample 6:
time = 3348000
time = 1087055
flags = 1
data = length 288, hash 5598CF8B
sample 7:
time = 3372000
time = 1111055
flags = 1
data = length 336, hash 7E0AB41
sample 8:
time = 3396000
time = 1135055
flags = 1
data = length 336, hash 1C585FEF
sample 9:
time = 3420000
time = 1159055
flags = 1
data = length 336, hash A4A4855E
sample 10:
time = 3444000
time = 1183055
flags = 1
data = length 336, hash CECA51D3
sample 11:
time = 3468000
time = 1207055
flags = 1
data = length 288, hash 2D362DC5
sample 12:
time = 3492000
time = 1231055
flags = 1
data = length 336, hash 9EB2609D
sample 13:
time = 3516000
time = 1255055
flags = 1
data = length 336, hash 28FFB3FE
sample 14:
time = 3540000
time = 1279055
flags = 1
data = length 288, hash 2AA2D216
sample 15:
time = 3564000
time = 1303055
flags = 1
data = length 336, hash CDBC7032
sample 16:
time = 3588000
time = 1327055
flags = 1
data = length 336, hash 25B13FE7
sample 17:
time = 3612000
time = 1351055
flags = 1
data = length 336, hash DB6BB1E
sample 18:
time = 3636000
time = 1375055
flags = 1
data = length 336, hash EBE951F4
sample 19:
time = 3660000
time = 1399055
flags = 1
data = length 288, hash 9E2EBFF7
sample 20:
time = 3684000
time = 1423055
flags = 1
data = length 336, hash 36A7D455
sample 21:
time = 3708000
time = 1447055
flags = 1
data = length 336, hash 84545F8C
sample 22:
time = 3732000
time = 1471055
flags = 1
data = length 336, hash F66F3045
sample 23:
time = 3756000
time = 1495055
flags = 1
data = length 576, hash 5AB089EA
sample 24:
time = 3780000
time = 1519055
flags = 1
data = length 336, hash 8868086
sample 25:
time = 3804000
time = 1543055
flags = 1
data = length 336, hash D5EB6D63
sample 26:
time = 3828000
time = 1567055
flags = 1
data = length 288, hash 7A5374B7
sample 27:
time = 3852000
time = 1591055
flags = 1
data = length 336, hash BEB27A75
sample 28:
time = 3876000
time = 1615055
flags = 1
data = length 336, hash E251E0FD
sample 29:
time = 3900000
time = 1639055
flags = 1
data = length 288, hash D54C970
sample 30:
time = 3924000
time = 1663055
flags = 1
data = length 336, hash 52C473B9
sample 31:
time = 3948000
time = 1687055
flags = 1
data = length 336, hash F5F13334
sample 32:
time = 3972000
time = 1711055
flags = 1
data = length 480, hash A5F1E987
sample 33:
time = 3996000
time = 1735055
flags = 1
data = length 288, hash 453A1267
sample 34:
time = 4020000
time = 1759055
flags = 1
data = length 288, hash 7C6C2EA9
sample 35:
time = 4044000
time = 1783055
flags = 1
data = length 336, hash F4BFECA4
sample 36:
time = 4068000
time = 1807055
flags = 1
data = length 336, hash 751A395A
sample 37:
time = 4092000
time = 1831055
flags = 1
data = length 336, hash EE38DB02
sample 38:
time = 4116000
time = 1855055
flags = 1
data = length 336, hash F18837E2
sample 39:
time = 4140000
time = 1879055
flags = 1
data = length 336, hash ED36B78E
sample 40:
time = 4164000
time = 1903055
flags = 1
data = length 336, hash B3D28289
sample 41:
time = 4188000
time = 1927055
flags = 1
data = length 288, hash 8BDE28E1
sample 42:
time = 4212000
time = 1951055
flags = 1
data = length 336, hash CFD5E966
sample 43:
time = 4236000
time = 1975055
flags = 1
data = length 288, hash DC08E267
sample 44:
time = 4260000
time = 1999055
flags = 1
data = length 336, hash 6530CB78
sample 45:
time = 4284000
time = 2023055
flags = 1
data = length 336, hash 6CC6636E
sample 46:
time = 4308000
time = 2047055
flags = 1
data = length 336, hash 613047C1
sample 47:
time = 4332000
time = 2071055
flags = 1
data = length 288, hash CDC747BF
sample 48:
time = 4356000
time = 2095055
flags = 1
data = length 336, hash AF22AA74
sample 49:
time = 4380000
time = 2119055
flags = 1
data = length 384, hash 82F326AA
sample 50:
time = 4404000
time = 2143055
flags = 1
data = length 384, hash EDA26C4D
sample 51:
time = 4428000
time = 2167055
flags = 1
data = length 336, hash 94C643DC
sample 52:
time = 4452000
time = 2191055
flags = 1
data = length 288, hash CB5D9C40
sample 53:
time = 4476000
time = 2215055
flags = 1
data = length 336, hash 1E69DE3F
sample 54:
time = 4500000
time = 2239055
flags = 1
data = length 336, hash 7E472219
sample 55:
time = 4524000
time = 2263055
flags = 1
data = length 336, hash DA47B9FA
sample 56:
time = 4548000
time = 2287055
flags = 1
data = length 336, hash DD0ABB7C
sample 57:
time = 4572000
time = 2311055
flags = 1
data = length 288, hash DBF93FAC
sample 58:
time = 4596000
time = 2335055
flags = 1
data = length 336, hash 243F4B2
sample 59:
time = 4620000
time = 2359055
flags = 1
data = length 336, hash 2E881490
sample 60:
time = 4644000
time = 2383055
flags = 1
data = length 288, hash 1C28C8BE
sample 61:
time = 4668000
time = 2407055
flags = 1
data = length 336, hash C73E5D30
sample 62:
time = 4692000
time = 2431055
flags = 1
data = length 288, hash 98B5BFF6
sample 63:
time = 4716000
time = 2455055
flags = 1
data = length 336, hash E0135533
sample 64:
time = 4740000
time = 2479055
flags = 1
data = length 336, hash D13C9DBC
sample 65:
time = 4764000
time = 2503055
flags = 1
data = length 336, hash 63D524CA
sample 66:
time = 4788000
time = 2527055
flags = 1
data = length 288, hash A28514C3
sample 67:
time = 4812000
time = 2551055
flags = 1
data = length 336, hash 72B647FF
sample 68:
time = 4836000
time = 2575055
flags = 1
data = length 336, hash 8F740AB1
sample 69:
time = 4860000
time = 2599055
flags = 1
data = length 336, hash 5E3C7E93
sample 70:
time = 4884000
time = 2623055
flags = 1
data = length 336, hash 121B913B
sample 71:
time = 4908000
time = 2647055
flags = 1
data = length 336, hash 578FCCF2
sample 72:
time = 4932000
time = 2671055
flags = 1
data = length 336, hash 5B5823DE
sample 73:
time = 4956000
time = 2695055
flags = 1
data = length 384, hash D8B83F78
sample 74:
time = 4980000
time = 2719055
flags = 1
data = length 240, hash E649682F
sample 75:
time = 5004000
time = 2743055
flags = 1
data = length 96, hash C559A6F4
sample 76:
time = 5028000
time = 2767055
flags = 1
data = length 96, hash 792796BC
sample 77:
time = 5052000
time = 2791055
flags = 1
data = length 120, hash 8172CD0E
sample 78:
time = 5076000
time = 2815055
flags = 1
data = length 120, hash F562B52F
sample 79:
time = 5100000
time = 2839055
flags = 1
data = length 96, hash FF8D5B98
tracksEnded = true

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 12624
sample count = 42
track duration = 9540000
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096
@ -21,171 +21,171 @@ track 0:
encoderPadding = 576
metadata = entries=[TSSE: description=null: values=[Lavf58.29.100]]
sample 0:
time = 6384000
time = 1879045
flags = 1
data = length 336, hash F18837E2
sample 1:
time = 6408000
time = 1903045
flags = 1
data = length 336, hash ED36B78E
sample 2:
time = 6432000
time = 1927045
flags = 1
data = length 336, hash B3D28289
sample 3:
time = 6456000
time = 1951045
flags = 1
data = length 288, hash 8BDE28E1
sample 4:
time = 6480000
time = 1975045
flags = 1
data = length 336, hash CFD5E966
sample 5:
time = 6504000
time = 1999045
flags = 1
data = length 288, hash DC08E267
sample 6:
time = 6528000
time = 2023045
flags = 1
data = length 336, hash 6530CB78
sample 7:
time = 6552000
time = 2047045
flags = 1
data = length 336, hash 6CC6636E
sample 8:
time = 6576000
time = 2071045
flags = 1
data = length 336, hash 613047C1
sample 9:
time = 6600000
time = 2095045
flags = 1
data = length 288, hash CDC747BF
sample 10:
time = 6624000
time = 2119045
flags = 1
data = length 336, hash AF22AA74
sample 11:
time = 6648000
time = 2143045
flags = 1
data = length 384, hash 82F326AA
sample 12:
time = 6672000
time = 2167045
flags = 1
data = length 384, hash EDA26C4D
sample 13:
time = 6696000
time = 2191045
flags = 1
data = length 336, hash 94C643DC
sample 14:
time = 6720000
time = 2215045
flags = 1
data = length 288, hash CB5D9C40
sample 15:
time = 6744000
time = 2239045
flags = 1
data = length 336, hash 1E69DE3F
sample 16:
time = 6768000
time = 2263045
flags = 1
data = length 336, hash 7E472219
sample 17:
time = 6792000
time = 2287045
flags = 1
data = length 336, hash DA47B9FA
sample 18:
time = 6816000
time = 2311045
flags = 1
data = length 336, hash DD0ABB7C
sample 19:
time = 6840000
time = 2335045
flags = 1
data = length 288, hash DBF93FAC
sample 20:
time = 6864000
time = 2359045
flags = 1
data = length 336, hash 243F4B2
sample 21:
time = 6888000
time = 2383045
flags = 1
data = length 336, hash 2E881490
sample 22:
time = 6912000
time = 2407045
flags = 1
data = length 288, hash 1C28C8BE
sample 23:
time = 6936000
time = 2431045
flags = 1
data = length 336, hash C73E5D30
sample 24:
time = 6960000
time = 2455045
flags = 1
data = length 288, hash 98B5BFF6
sample 25:
time = 6984000
time = 2479045
flags = 1
data = length 336, hash E0135533
sample 26:
time = 7008000
time = 2503045
flags = 1
data = length 336, hash D13C9DBC
sample 27:
time = 7032000
time = 2527045
flags = 1
data = length 336, hash 63D524CA
sample 28:
time = 7056000
time = 2551045
flags = 1
data = length 288, hash A28514C3
sample 29:
time = 7080000
time = 2575045
flags = 1
data = length 336, hash 72B647FF
sample 30:
time = 7104000
time = 2599045
flags = 1
data = length 336, hash 8F740AB1
sample 31:
time = 7128000
time = 2623045
flags = 1
data = length 336, hash 5E3C7E93
sample 32:
time = 7152000
time = 2647045
flags = 1
data = length 336, hash 121B913B
sample 33:
time = 7176000
time = 2671045
flags = 1
data = length 336, hash 578FCCF2
sample 34:
time = 7200000
time = 2695045
flags = 1
data = length 336, hash 5B5823DE
sample 35:
time = 7224000
time = 2719045
flags = 1
data = length 384, hash D8B83F78
sample 36:
time = 7248000
time = 2743045
flags = 1
data = length 240, hash E649682F
sample 37:
time = 7272000
time = 2767045
flags = 1
data = length 96, hash C559A6F4
sample 38:
time = 7296000
time = 2791045
flags = 1
data = length 96, hash 792796BC
sample 39:
time = 7320000
time = 2815045
flags = 1
data = length 120, hash 8172CD0E
sample 40:
time = 7344000
time = 2839045
flags = 1
data = length 120, hash F562B52F
sample 41:
time = 7368000
time = 2863045
flags = 1
data = length 96, hash FF8D5B98
tracksEnded = true

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 96
sample count = 1
track duration = 9540000
total output bytes = 0
sample count = 0
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096
@ -20,8 +20,4 @@ track 0:
encoderDelay = 576
encoderPadding = 576
metadata = entries=[TSSE: description=null: values=[Lavf58.29.100]]
sample 0:
time = 9516000
flags = 1
data = length 96, hash FF8D5B98
tracksEnded = true

View File

@ -1,14 +1,17 @@
seekMap:
isSeekable = true
duration = UNSET TIME
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 38160
sample count = 117
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 38160
sample count = 117
track duration = 9540000
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 25344
sample count = 80
track duration = 9540000
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096
@ -21,323 +21,323 @@ track 0:
encoderPadding = 576
metadata = entries=[TSSE: description=null: values=[Lavf58.29.100]]
sample 0:
time = 3204000
time = 943055
flags = 1
data = length 336, hash E917C122
sample 1:
time = 3228000
time = 967055
flags = 1
data = length 336, hash 10ED1470
sample 2:
time = 3252000
time = 991055
flags = 1
data = length 288, hash 706B8A7C
sample 3:
time = 3276000
time = 1015055
flags = 1
data = length 336, hash 71FFE4A0
sample 4:
time = 3300000
time = 1039055
flags = 1
data = length 336, hash D4160463
sample 5:
time = 3324000
time = 1063055
flags = 1
data = length 336, hash EC557B14
sample 6:
time = 3348000
time = 1087055
flags = 1
data = length 288, hash 5598CF8B
sample 7:
time = 3372000
time = 1111055
flags = 1
data = length 336, hash 7E0AB41
sample 8:
time = 3396000
time = 1135055
flags = 1
data = length 336, hash 1C585FEF
sample 9:
time = 3420000
time = 1159055
flags = 1
data = length 336, hash A4A4855E
sample 10:
time = 3444000
time = 1183055
flags = 1
data = length 336, hash CECA51D3
sample 11:
time = 3468000
time = 1207055
flags = 1
data = length 288, hash 2D362DC5
sample 12:
time = 3492000
time = 1231055
flags = 1
data = length 336, hash 9EB2609D
sample 13:
time = 3516000
time = 1255055
flags = 1
data = length 336, hash 28FFB3FE
sample 14:
time = 3540000
time = 1279055
flags = 1
data = length 288, hash 2AA2D216
sample 15:
time = 3564000
time = 1303055
flags = 1
data = length 336, hash CDBC7032
sample 16:
time = 3588000
time = 1327055
flags = 1
data = length 336, hash 25B13FE7
sample 17:
time = 3612000
time = 1351055
flags = 1
data = length 336, hash DB6BB1E
sample 18:
time = 3636000
time = 1375055
flags = 1
data = length 336, hash EBE951F4
sample 19:
time = 3660000
time = 1399055
flags = 1
data = length 288, hash 9E2EBFF7
sample 20:
time = 3684000
time = 1423055
flags = 1
data = length 336, hash 36A7D455
sample 21:
time = 3708000
time = 1447055
flags = 1
data = length 336, hash 84545F8C
sample 22:
time = 3732000
time = 1471055
flags = 1
data = length 336, hash F66F3045
sample 23:
time = 3756000
time = 1495055
flags = 1
data = length 576, hash 5AB089EA
sample 24:
time = 3780000
time = 1519055
flags = 1
data = length 336, hash 8868086
sample 25:
time = 3804000
time = 1543055
flags = 1
data = length 336, hash D5EB6D63
sample 26:
time = 3828000
time = 1567055
flags = 1
data = length 288, hash 7A5374B7
sample 27:
time = 3852000
time = 1591055
flags = 1
data = length 336, hash BEB27A75
sample 28:
time = 3876000
time = 1615055
flags = 1
data = length 336, hash E251E0FD
sample 29:
time = 3900000
time = 1639055
flags = 1
data = length 288, hash D54C970
sample 30:
time = 3924000
time = 1663055
flags = 1
data = length 336, hash 52C473B9
sample 31:
time = 3948000
time = 1687055
flags = 1
data = length 336, hash F5F13334
sample 32:
time = 3972000
time = 1711055
flags = 1
data = length 480, hash A5F1E987
sample 33:
time = 3996000
time = 1735055
flags = 1
data = length 288, hash 453A1267
sample 34:
time = 4020000
time = 1759055
flags = 1
data = length 288, hash 7C6C2EA9
sample 35:
time = 4044000
time = 1783055
flags = 1
data = length 336, hash F4BFECA4
sample 36:
time = 4068000
time = 1807055
flags = 1
data = length 336, hash 751A395A
sample 37:
time = 4092000
time = 1831055
flags = 1
data = length 336, hash EE38DB02
sample 38:
time = 4116000
time = 1855055
flags = 1
data = length 336, hash F18837E2
sample 39:
time = 4140000
time = 1879055
flags = 1
data = length 336, hash ED36B78E
sample 40:
time = 4164000
time = 1903055
flags = 1
data = length 336, hash B3D28289
sample 41:
time = 4188000
time = 1927055
flags = 1
data = length 288, hash 8BDE28E1
sample 42:
time = 4212000
time = 1951055
flags = 1
data = length 336, hash CFD5E966
sample 43:
time = 4236000
time = 1975055
flags = 1
data = length 288, hash DC08E267
sample 44:
time = 4260000
time = 1999055
flags = 1
data = length 336, hash 6530CB78
sample 45:
time = 4284000
time = 2023055
flags = 1
data = length 336, hash 6CC6636E
sample 46:
time = 4308000
time = 2047055
flags = 1
data = length 336, hash 613047C1
sample 47:
time = 4332000
time = 2071055
flags = 1
data = length 288, hash CDC747BF
sample 48:
time = 4356000
time = 2095055
flags = 1
data = length 336, hash AF22AA74
sample 49:
time = 4380000
time = 2119055
flags = 1
data = length 384, hash 82F326AA
sample 50:
time = 4404000
time = 2143055
flags = 1
data = length 384, hash EDA26C4D
sample 51:
time = 4428000
time = 2167055
flags = 1
data = length 336, hash 94C643DC
sample 52:
time = 4452000
time = 2191055
flags = 1
data = length 288, hash CB5D9C40
sample 53:
time = 4476000
time = 2215055
flags = 1
data = length 336, hash 1E69DE3F
sample 54:
time = 4500000
time = 2239055
flags = 1
data = length 336, hash 7E472219
sample 55:
time = 4524000
time = 2263055
flags = 1
data = length 336, hash DA47B9FA
sample 56:
time = 4548000
time = 2287055
flags = 1
data = length 336, hash DD0ABB7C
sample 57:
time = 4572000
time = 2311055
flags = 1
data = length 288, hash DBF93FAC
sample 58:
time = 4596000
time = 2335055
flags = 1
data = length 336, hash 243F4B2
sample 59:
time = 4620000
time = 2359055
flags = 1
data = length 336, hash 2E881490
sample 60:
time = 4644000
time = 2383055
flags = 1
data = length 288, hash 1C28C8BE
sample 61:
time = 4668000
time = 2407055
flags = 1
data = length 336, hash C73E5D30
sample 62:
time = 4692000
time = 2431055
flags = 1
data = length 288, hash 98B5BFF6
sample 63:
time = 4716000
time = 2455055
flags = 1
data = length 336, hash E0135533
sample 64:
time = 4740000
time = 2479055
flags = 1
data = length 336, hash D13C9DBC
sample 65:
time = 4764000
time = 2503055
flags = 1
data = length 336, hash 63D524CA
sample 66:
time = 4788000
time = 2527055
flags = 1
data = length 288, hash A28514C3
sample 67:
time = 4812000
time = 2551055
flags = 1
data = length 336, hash 72B647FF
sample 68:
time = 4836000
time = 2575055
flags = 1
data = length 336, hash 8F740AB1
sample 69:
time = 4860000
time = 2599055
flags = 1
data = length 336, hash 5E3C7E93
sample 70:
time = 4884000
time = 2623055
flags = 1
data = length 336, hash 121B913B
sample 71:
time = 4908000
time = 2647055
flags = 1
data = length 336, hash 578FCCF2
sample 72:
time = 4932000
time = 2671055
flags = 1
data = length 336, hash 5B5823DE
sample 73:
time = 4956000
time = 2695055
flags = 1
data = length 384, hash D8B83F78
sample 74:
time = 4980000
time = 2719055
flags = 1
data = length 240, hash E649682F
sample 75:
time = 5004000
time = 2743055
flags = 1
data = length 96, hash C559A6F4
sample 76:
time = 5028000
time = 2767055
flags = 1
data = length 96, hash 792796BC
sample 77:
time = 5052000
time = 2791055
flags = 1
data = length 120, hash 8172CD0E
sample 78:
time = 5076000
time = 2815055
flags = 1
data = length 120, hash F562B52F
sample 79:
time = 5100000
time = 2839055
flags = 1
data = length 96, hash FF8D5B98
tracksEnded = true

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 12624
sample count = 42
track duration = 9540000
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096
@ -21,171 +21,171 @@ track 0:
encoderPadding = 576
metadata = entries=[TSSE: description=null: values=[Lavf58.29.100]]
sample 0:
time = 6384000
time = 1879045
flags = 1
data = length 336, hash F18837E2
sample 1:
time = 6408000
time = 1903045
flags = 1
data = length 336, hash ED36B78E
sample 2:
time = 6432000
time = 1927045
flags = 1
data = length 336, hash B3D28289
sample 3:
time = 6456000
time = 1951045
flags = 1
data = length 288, hash 8BDE28E1
sample 4:
time = 6480000
time = 1975045
flags = 1
data = length 336, hash CFD5E966
sample 5:
time = 6504000
time = 1999045
flags = 1
data = length 288, hash DC08E267
sample 6:
time = 6528000
time = 2023045
flags = 1
data = length 336, hash 6530CB78
sample 7:
time = 6552000
time = 2047045
flags = 1
data = length 336, hash 6CC6636E
sample 8:
time = 6576000
time = 2071045
flags = 1
data = length 336, hash 613047C1
sample 9:
time = 6600000
time = 2095045
flags = 1
data = length 288, hash CDC747BF
sample 10:
time = 6624000
time = 2119045
flags = 1
data = length 336, hash AF22AA74
sample 11:
time = 6648000
time = 2143045
flags = 1
data = length 384, hash 82F326AA
sample 12:
time = 6672000
time = 2167045
flags = 1
data = length 384, hash EDA26C4D
sample 13:
time = 6696000
time = 2191045
flags = 1
data = length 336, hash 94C643DC
sample 14:
time = 6720000
time = 2215045
flags = 1
data = length 288, hash CB5D9C40
sample 15:
time = 6744000
time = 2239045
flags = 1
data = length 336, hash 1E69DE3F
sample 16:
time = 6768000
time = 2263045
flags = 1
data = length 336, hash 7E472219
sample 17:
time = 6792000
time = 2287045
flags = 1
data = length 336, hash DA47B9FA
sample 18:
time = 6816000
time = 2311045
flags = 1
data = length 336, hash DD0ABB7C
sample 19:
time = 6840000
time = 2335045
flags = 1
data = length 288, hash DBF93FAC
sample 20:
time = 6864000
time = 2359045
flags = 1
data = length 336, hash 243F4B2
sample 21:
time = 6888000
time = 2383045
flags = 1
data = length 336, hash 2E881490
sample 22:
time = 6912000
time = 2407045
flags = 1
data = length 288, hash 1C28C8BE
sample 23:
time = 6936000
time = 2431045
flags = 1
data = length 336, hash C73E5D30
sample 24:
time = 6960000
time = 2455045
flags = 1
data = length 288, hash 98B5BFF6
sample 25:
time = 6984000
time = 2479045
flags = 1
data = length 336, hash E0135533
sample 26:
time = 7008000
time = 2503045
flags = 1
data = length 336, hash D13C9DBC
sample 27:
time = 7032000
time = 2527045
flags = 1
data = length 336, hash 63D524CA
sample 28:
time = 7056000
time = 2551045
flags = 1
data = length 288, hash A28514C3
sample 29:
time = 7080000
time = 2575045
flags = 1
data = length 336, hash 72B647FF
sample 30:
time = 7104000
time = 2599045
flags = 1
data = length 336, hash 8F740AB1
sample 31:
time = 7128000
time = 2623045
flags = 1
data = length 336, hash 5E3C7E93
sample 32:
time = 7152000
time = 2647045
flags = 1
data = length 336, hash 121B913B
sample 33:
time = 7176000
time = 2671045
flags = 1
data = length 336, hash 578FCCF2
sample 34:
time = 7200000
time = 2695045
flags = 1
data = length 336, hash 5B5823DE
sample 35:
time = 7224000
time = 2719045
flags = 1
data = length 384, hash D8B83F78
sample 36:
time = 7248000
time = 2743045
flags = 1
data = length 240, hash E649682F
sample 37:
time = 7272000
time = 2767045
flags = 1
data = length 96, hash C559A6F4
sample 38:
time = 7296000
time = 2791045
flags = 1
data = length 96, hash 792796BC
sample 39:
time = 7320000
time = 2815045
flags = 1
data = length 120, hash 8172CD0E
sample 40:
time = 7344000
time = 2839045
flags = 1
data = length 120, hash F562B52F
sample 41:
time = 7368000
time = 2863045
flags = 1
data = length 96, hash FF8D5B98
tracksEnded = true

View File

@ -1,17 +1,17 @@
seekMap:
isSeekable = true
duration = 9540000
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=24000, position=333]]
getPosition(4770000) = [[timeUs=4752000, position=19245], [timeUs=4776000, position=19341]]
getPosition(9540000) = [[timeUs=9516000, position=38301]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 96
sample count = 1
track duration = 9540000
total output bytes = 0
sample count = 0
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096
@ -20,8 +20,4 @@ track 0:
encoderDelay = 576
encoderPadding = 576
metadata = entries=[TSSE: description=null: values=[Lavf58.29.100]]
sample 0:
time = 9516000
flags = 1
data = length 96, hash FF8D5B98
tracksEnded = true

View File

@ -1,13 +1,17 @@
seekMap:
isSeekable = false
duration = UNSET TIME
isSeekable = true
duration = 2807972
getPosition(0) = [[timeUs=0, position=237]]
getPosition(1) = [[timeUs=0, position=237], [timeUs=73, position=238]]
getPosition(1403986) = [[timeUs=1403912, position=19316], [timeUs=1403986, position=19317]]
getPosition(2807972) = [[timeUs=2807899, position=38396]]
numberOfTracks = 1
track 0:
total output bytes = 38160
sample count = 117
track duration = 2807972
format 0:
averageBitrate = 32000
averageBitrate = 108719
containerMimeType = audio/mpeg
sampleMimeType = audio/mpeg
maxInputSize = 4096