Fix codec initialization data for Opus in MP4

PiperOrigin-RevId: 325327466
This commit is contained in:
olly 2020-08-06 23:48:58 +01:00 committed by kim-vde
parent eee9b312dc
commit b9612bc338
14 changed files with 3242 additions and 29 deletions

View File

@ -213,6 +213,7 @@
timestamps ([#7464](https://github.com/google/ExoPlayer/issues/7464)). timestamps ([#7464](https://github.com/google/ExoPlayer/issues/7464)).
* Ogg: Allow non-contiguous pages * Ogg: Allow non-contiguous pages
([#7230](https://github.com/google/ExoPlayer/issues/7230)). ([#7230](https://github.com/google/ExoPlayer/issues/7230)).
* MP4: Fix playback of MP4 containing Opus.
* Matroska: Remove support for "Invisible" block header flag. * Matroska: Remove support for "Invisible" block header flag.
* FLV: Ignore SCRIPTDATA segments with invalid name types, rather than failing * FLV: Ignore SCRIPTDATA segments with invalid name types, rather than failing
playback ([#7675](https://github.com/google/ExoPlayer/issues/7675)). playback ([#7675](https://github.com/google/ExoPlayer/issues/7675)).

View File

@ -4,8 +4,7 @@
"samples": [ "samples": [
{ {
"name": "Google Glass H264 (MP4)", "name": "Google Glass H264 (MP4)",
"uri": "https://www.youtube.com/api/manifest/dash/id/bf5bb2419360daf1/source/youtube?as=fmp4_audio_clear,fmp4_sd_hd_clear&sparams=ip,ipbits,expire,source,id,as&ip=0.0.0.0&ipbits=0&expire=19000000000&signature=51AF5F39AB0CEC3E5497CD9C900EBFEAECCCB5C7.8506521BFC350652163895D4C26DEE124209AA9E&key=ik0", "uri": "file:///sdcard/1.mp4"
"extension": "mpd"
}, },
{ {
"name": "Google Play H264 (MP4)", "name": "Google Play H264 (MP4)",

View File

@ -27,6 +27,7 @@ import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.audio.AacUtil; import com.google.android.exoplayer2.audio.AacUtil;
import com.google.android.exoplayer2.audio.Ac3Util; import com.google.android.exoplayer2.audio.Ac3Util;
import com.google.android.exoplayer2.audio.Ac4Util; import com.google.android.exoplayer2.audio.Ac4Util;
import com.google.android.exoplayer2.audio.OpusUtil;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.extractor.GaplessInfoHolder; import com.google.android.exoplayer2.extractor.GaplessInfoHolder;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
@ -40,9 +41,9 @@ import com.google.android.exoplayer2.video.AvcConfig;
import com.google.android.exoplayer2.video.DolbyVisionConfig; import com.google.android.exoplayer2.video.DolbyVisionConfig;
import com.google.android.exoplayer2.video.HevcConfig; import com.google.android.exoplayer2.video.HevcConfig;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.checkerframework.checker.nullness.compatqual.NullableType; import org.checkerframework.checker.nullness.compatqual.NullableType;
@ -913,7 +914,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
parent.setPosition(position + Atom.HEADER_SIZE + StsdData.STSD_HEADER_SIZE); parent.setPosition(position + Atom.HEADER_SIZE + StsdData.STSD_HEADER_SIZE);
// Default values. // Default values.
@Nullable List<byte[]> initializationData = null; @Nullable ImmutableList<byte[]> initializationData = null;
long subsampleOffsetUs = Format.OFFSET_SAMPLE_RELATIVE; long subsampleOffsetUs = Format.OFFSET_SAMPLE_RELATIVE;
String mimeType; String mimeType;
@ -924,7 +925,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
int sampleDescriptionLength = atomSize - Atom.HEADER_SIZE - 8; int sampleDescriptionLength = atomSize - Atom.HEADER_SIZE - 8;
byte[] sampleDescriptionData = new byte[sampleDescriptionLength]; byte[] sampleDescriptionData = new byte[sampleDescriptionLength];
parent.readBytes(sampleDescriptionData, 0, sampleDescriptionLength); parent.readBytes(sampleDescriptionData, 0, sampleDescriptionLength);
initializationData = Collections.singletonList(sampleDescriptionData); initializationData = ImmutableList.of(sampleDescriptionData);
} else if (atomType == Atom.TYPE_wvtt) { } else if (atomType == Atom.TYPE_wvtt) {
mimeType = MimeTypes.APPLICATION_MP4VTT; mimeType = MimeTypes.APPLICATION_MP4VTT;
} else if (atomType == Atom.TYPE_stpp) { } else if (atomType == Atom.TYPE_stpp) {
@ -1042,7 +1043,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
mimeType = mimeTypeAndInitializationDataBytes.first; mimeType = mimeTypeAndInitializationDataBytes.first;
@Nullable byte[] initializationDataBytes = mimeTypeAndInitializationDataBytes.second; @Nullable byte[] initializationDataBytes = mimeTypeAndInitializationDataBytes.second;
if (initializationDataBytes != null) { if (initializationDataBytes != null) {
initializationData = Collections.singletonList(initializationDataBytes); initializationData = ImmutableList.of(initializationDataBytes);
} }
} else if (childAtomType == Atom.TYPE_pasp) { } else if (childAtomType == Atom.TYPE_pasp) {
pixelWidthHeightRatio = parsePaspFromParent(parent, childStartPosition); pixelWidthHeightRatio = parsePaspFromParent(parent, childStartPosition);
@ -1242,7 +1243,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
mimeType = MimeTypes.AUDIO_FLAC; mimeType = MimeTypes.AUDIO_FLAC;
} }
@Nullable byte[] initializationData = null; @Nullable List<byte[]> initializationData = null;
while (childPosition - position < size) { while (childPosition - position < size) {
parent.setPosition(childPosition); parent.setPosition(childPosition);
int childAtomSize = parent.readInt(); int childAtomSize = parent.readInt();
@ -1255,14 +1256,18 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
Pair<@NullableType String, byte @NullableType []> mimeTypeAndInitializationData = Pair<@NullableType String, byte @NullableType []> mimeTypeAndInitializationData =
parseEsdsFromParent(parent, esdsAtomPosition); parseEsdsFromParent(parent, esdsAtomPosition);
mimeType = mimeTypeAndInitializationData.first; mimeType = mimeTypeAndInitializationData.first;
initializationData = mimeTypeAndInitializationData.second; @Nullable byte[] initializationDataBytes = mimeTypeAndInitializationData.second;
if (MimeTypes.AUDIO_AAC.equals(mimeType) && initializationData != null) { if (initializationDataBytes != null) {
// Update sampleRate and channelCount from the AudioSpecificConfig initialization data, if (MimeTypes.AUDIO_AAC.equals(mimeType)) {
// which is more reliable. See [Internal: b/10903778]. // Update sampleRate and channelCount from the AudioSpecificConfig initialization
AacUtil.Config aacConfig = AacUtil.parseAudioSpecificConfig(initializationData); // data,
sampleRate = aacConfig.sampleRateHz; // which is more reliable. See [Internal: b/10903778].
channelCount = aacConfig.channelCount; AacUtil.Config aacConfig = AacUtil.parseAudioSpecificConfig(initializationDataBytes);
codecs = aacConfig.codecs; sampleRate = aacConfig.sampleRateHz;
channelCount = aacConfig.channelCount;
codecs = aacConfig.codecs;
}
initializationData = ImmutableList.of(initializationDataBytes);
} }
} }
} else if (childAtomType == Atom.TYPE_dac3) { } else if (childAtomType == Atom.TYPE_dac3) {
@ -1291,30 +1296,32 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
// Build an Opus Identification Header (defined in RFC-7845) by concatenating the Opus Magic // Build an Opus Identification Header (defined in RFC-7845) by concatenating the Opus Magic
// Signature and the body of the dOps atom. // Signature and the body of the dOps atom.
int childAtomBodySize = childAtomSize - Atom.HEADER_SIZE; int childAtomBodySize = childAtomSize - Atom.HEADER_SIZE;
initializationData = new byte[opusMagic.length + childAtomBodySize]; byte[] headerBytes = Arrays.copyOf(opusMagic, opusMagic.length + childAtomBodySize);
System.arraycopy(opusMagic, 0, initializationData, 0, opusMagic.length);
parent.setPosition(childPosition + Atom.HEADER_SIZE); parent.setPosition(childPosition + Atom.HEADER_SIZE);
parent.readBytes(initializationData, opusMagic.length, childAtomBodySize); parent.readBytes(headerBytes, opusMagic.length, childAtomBodySize);
initializationData = OpusUtil.buildInitializationData(headerBytes);
} else if (childAtomType == Atom.TYPE_dfLa) { } else if (childAtomType == Atom.TYPE_dfLa) {
int childAtomBodySize = childAtomSize - Atom.FULL_HEADER_SIZE; int childAtomBodySize = childAtomSize - Atom.FULL_HEADER_SIZE;
initializationData = new byte[4 + childAtomBodySize]; byte[] initializationDataBytes = new byte[4 + childAtomBodySize];
initializationData[0] = 0x66; // f initializationDataBytes[0] = 0x66; // f
initializationData[1] = 0x4C; // L initializationDataBytes[1] = 0x4C; // L
initializationData[2] = 0x61; // a initializationDataBytes[2] = 0x61; // a
initializationData[3] = 0x43; // C initializationDataBytes[3] = 0x43; // C
parent.setPosition(childPosition + Atom.FULL_HEADER_SIZE); parent.setPosition(childPosition + Atom.FULL_HEADER_SIZE);
parent.readBytes(initializationData, /* offset= */ 4, childAtomBodySize); parent.readBytes(initializationDataBytes, /* offset= */ 4, childAtomBodySize);
initializationData = ImmutableList.of(initializationDataBytes);
} else if (childAtomType == Atom.TYPE_alac) { } else if (childAtomType == Atom.TYPE_alac) {
int childAtomBodySize = childAtomSize - Atom.FULL_HEADER_SIZE; int childAtomBodySize = childAtomSize - Atom.FULL_HEADER_SIZE;
initializationData = new byte[childAtomBodySize]; byte[] initializationDataBytes = new byte[childAtomBodySize];
parent.setPosition(childPosition + Atom.FULL_HEADER_SIZE); parent.setPosition(childPosition + Atom.FULL_HEADER_SIZE);
parent.readBytes(initializationData, /* offset= */ 0, childAtomBodySize); parent.readBytes(initializationDataBytes, /* offset= */ 0, childAtomBodySize);
// Update sampleRate and channelCount from the AudioSpecificConfig initialization data, // Update sampleRate and channelCount from the AudioSpecificConfig initialization data,
// which is more reliable. See https://github.com/google/ExoPlayer/pull/6629. // which is more reliable. See https://github.com/google/ExoPlayer/pull/6629.
Pair<Integer, Integer> audioSpecificConfig = Pair<Integer, Integer> audioSpecificConfig =
CodecSpecificDataUtil.parseAlacAudioSpecificConfig(initializationData); CodecSpecificDataUtil.parseAlacAudioSpecificConfig(initializationDataBytes);
sampleRate = audioSpecificConfig.first; sampleRate = audioSpecificConfig.first;
channelCount = audioSpecificConfig.second; channelCount = audioSpecificConfig.second;
initializationData = ImmutableList.of(initializationDataBytes);
} }
childPosition += childAtomSize; childPosition += childAtomSize;
} }
@ -1328,8 +1335,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
.setChannelCount(channelCount) .setChannelCount(channelCount)
.setSampleRate(sampleRate) .setSampleRate(sampleRate)
.setPcmEncoding(pcmEncoding) .setPcmEncoding(pcmEncoding)
.setInitializationData( .setInitializationData(initializationData)
initializationData == null ? null : Collections.singletonList(initializationData))
.setDrmInitData(drmInitData) .setDrmInitData(drmInitData)
.setLanguage(language) .setLanguage(language)
.build(); .build();

View File

@ -98,6 +98,14 @@ public final class FragmentedMp4ExtractorTest {
simulationConfig); simulationConfig);
} }
@Test
public void sampleWithOpusTrack() throws Exception {
ExtractorAsserts.assertBehavior(
getExtractorFactory(ImmutableList.of()),
"mp4/sample_opus_fragmented.mp4",
simulationConfig);
}
@Test @Test
public void samplePartiallyFragmented() throws Exception { public void samplePartiallyFragmented() throws Exception {
ExtractorAsserts.assertBehavior( ExtractorAsserts.assertBehavior(

View File

@ -74,4 +74,9 @@ public final class Mp4ExtractorTest {
public void mp4SampleWithEac3jocTrack() throws Exception { public void mp4SampleWithEac3jocTrack() throws Exception {
ExtractorAsserts.assertBehavior(Mp4Extractor::new, "mp4/sample_eac3joc.mp4", simulationConfig); ExtractorAsserts.assertBehavior(Mp4Extractor::new, "mp4/sample_eac3joc.mp4", simulationConfig);
} }
@Test
public void mp4SampleWithOpusTrack() throws Exception {
ExtractorAsserts.assertBehavior(Mp4Extractor::new, "mp4/sample_opus.mp4", simulationConfig);
}
} }

Binary file not shown.

View File

@ -0,0 +1,428 @@
seekMap:
isSeekable = true
duration = 1460000
getPosition(0) = [[timeUs=0, position=179]]
getPosition(1) = [[timeUs=1, position=179]]
getPosition(730000) = [[timeUs=730000, position=398]]
getPosition(1460000) = [[timeUs=1460000, position=3701]]
numberOfTracks = 1
track 0:
total output bytes = 3651
sample count = 101
format 0:
id = 1
sampleMimeType = audio/opus
maxInputSize = 278
channelCount = 2
sampleRate = 48000
language = und
metadata = entries=[TSSE: description=null: value=Lavf58.29.100]
initializationData:
data = length 19, hash 86852AE2
data = length 8, hash 72CBCBF5
data = length 8, hash 79C07075
sample 0:
time = 0
flags = 1
data = length 3, hash 4732
sample 1:
time = 3500
flags = 1
data = length 3, hash 4732
sample 2:
time = 13500
flags = 1
data = length 3, hash 4732
sample 3:
time = 23500
flags = 1
data = length 3, hash 4732
sample 4:
time = 33500
flags = 1
data = length 3, hash 4732
sample 5:
time = 43500
flags = 1
data = length 3, hash 4732
sample 6:
time = 53500
flags = 1
data = length 3, hash 4732
sample 7:
time = 63500
flags = 1
data = length 3, hash 4732
sample 8:
time = 73500
flags = 1
data = length 3, hash 4732
sample 9:
time = 83500
flags = 1
data = length 3, hash 4732
sample 10:
time = 93500
flags = 1
data = length 3, hash 4732
sample 11:
time = 103500
flags = 1
data = length 3, hash 4732
sample 12:
time = 113500
flags = 1
data = length 3, hash 4732
sample 13:
time = 123500
flags = 1
data = length 3, hash 4732
sample 14:
time = 133500
flags = 1
data = length 3, hash 4732
sample 15:
time = 143500
flags = 1
data = length 3, hash 4732
sample 16:
time = 153500
flags = 1
data = length 3, hash 4732
sample 17:
time = 163500
flags = 1
data = length 3, hash 4732
sample 18:
time = 173500
flags = 1
data = length 3, hash 4732
sample 19:
time = 183500
flags = 1
data = length 3, hash 4732
sample 20:
time = 193500
flags = 1
data = length 3, hash 4732
sample 21:
time = 203500
flags = 1
data = length 3, hash 4732
sample 22:
time = 213500
flags = 1
data = length 3, hash 4732
sample 23:
time = 223500
flags = 1
data = length 3, hash 4732
sample 24:
time = 233500
flags = 1
data = length 3, hash 4732
sample 25:
time = 243500
flags = 1
data = length 3, hash 4732
sample 26:
time = 253500
flags = 1
data = length 3, hash 4732
sample 27:
time = 263500
flags = 1
data = length 3, hash 4732
sample 28:
time = 273500
flags = 1
data = length 3, hash 4732
sample 29:
time = 283500
flags = 1
data = length 3, hash 4732
sample 30:
time = 293500
flags = 1
data = length 3, hash 4732
sample 31:
time = 303500
flags = 1
data = length 3, hash 4732
sample 32:
time = 313500
flags = 1
data = length 3, hash 4732
sample 33:
time = 323500
flags = 1
data = length 3, hash 4732
sample 34:
time = 333500
flags = 1
data = length 3, hash 4732
sample 35:
time = 343500
flags = 1
data = length 3, hash 4732
sample 36:
time = 353500
flags = 1
data = length 3, hash 4732
sample 37:
time = 363500
flags = 1
data = length 3, hash 4732
sample 38:
time = 373500
flags = 1
data = length 3, hash 4732
sample 39:
time = 383500
flags = 1
data = length 3, hash 4732
sample 40:
time = 393500
flags = 1
data = length 3, hash 4732
sample 41:
time = 403500
flags = 1
data = length 3, hash 4732
sample 42:
time = 413500
flags = 1
data = length 3, hash 4732
sample 43:
time = 423500
flags = 1
data = length 3, hash 4732
sample 44:
time = 433500
flags = 1
data = length 3, hash 4732
sample 45:
time = 443500
flags = 1
data = length 3, hash 4732
sample 46:
time = 453500
flags = 1
data = length 3, hash 4732
sample 47:
time = 463500
flags = 1
data = length 3, hash 4732
sample 48:
time = 473500
flags = 1
data = length 3, hash 4732
sample 49:
time = 483500
flags = 1
data = length 3, hash 4732
sample 50:
time = 493500
flags = 1
data = length 3, hash 4732
sample 51:
time = 503500
flags = 1
data = length 3, hash 4732
sample 52:
time = 513499
flags = 1
data = length 3, hash 4732
sample 53:
time = 523499
flags = 1
data = length 3, hash 4732
sample 54:
time = 533500
flags = 1
data = length 3, hash 4732
sample 55:
time = 543500
flags = 1
data = length 3, hash 4732
sample 56:
time = 553500
flags = 1
data = length 3, hash 4732
sample 57:
time = 563500
flags = 1
data = length 3, hash 4732
sample 58:
time = 573500
flags = 1
data = length 3, hash 4732
sample 59:
time = 583500
flags = 1
data = length 3, hash 4732
sample 60:
time = 593500
flags = 1
data = length 3, hash 4732
sample 61:
time = 603500
flags = 1
data = length 3, hash 4732
sample 62:
time = 613500
flags = 1
data = length 3, hash 4732
sample 63:
time = 623500
flags = 1
data = length 3, hash 4732
sample 64:
time = 633500
flags = 1
data = length 3, hash 4732
sample 65:
time = 643500
flags = 1
data = length 3, hash 4732
sample 66:
time = 653500
flags = 1
data = length 3, hash 4732
sample 67:
time = 663500
flags = 1
data = length 3, hash 4732
sample 68:
time = 673500
flags = 1
data = length 3, hash 4732
sample 69:
time = 683500
flags = 1
data = length 3, hash 4732
sample 70:
time = 693500
flags = 1
data = length 3, hash 4732
sample 71:
time = 703500
flags = 1
data = length 3, hash 4732
sample 72:
time = 713500
flags = 1
data = length 3, hash 4732
sample 73:
time = 723500
flags = 1
data = length 3, hash 4732
sample 74:
time = 733500
flags = 1
data = length 3, hash 4732
sample 75:
time = 743500
flags = 1
data = length 66, hash 648F0BC5
sample 76:
time = 753500
flags = 1
data = length 248, hash D07B1166
sample 77:
time = 763500
flags = 1
data = length 239, hash 61AA7E3B
sample 78:
time = 773500
flags = 1
data = length 142, hash F01726AD
sample 79:
time = 783500
flags = 1
data = length 124, hash 35B50117
sample 80:
time = 793500
flags = 1
data = length 122, hash 6ED2EA14
sample 81:
time = 803500
flags = 1
data = length 118, hash AAB319C9
sample 82:
time = 813500
flags = 1
data = length 117, hash 7B08A466
sample 83:
time = 823500
flags = 1
data = length 120, hash AF62F442
sample 84:
time = 833500
flags = 1
data = length 120, hash 21A0E5E9
sample 85:
time = 843500
flags = 1
data = length 122, hash F191C09
sample 86:
time = 853500
flags = 1
data = length 120, hash C52E4F2D
sample 87:
time = 863500
flags = 1
data = length 120, hash D4554502
sample 88:
time = 873500
flags = 1
data = length 121, hash D4E641CF
sample 89:
time = 883500
flags = 1
data = length 123, hash 518700A8
sample 90:
time = 893500
flags = 1
data = length 123, hash 6EA13134
sample 91:
time = 903500
flags = 1
data = length 123, hash A4264A7B
sample 92:
time = 913500
flags = 1
data = length 126, hash 593B6BA5
sample 93:
time = 923500
flags = 1
data = length 127, hash 15988F8A
sample 94:
time = 933500
flags = 1
data = length 134, hash 165D0213
sample 95:
time = 943500
flags = 1
data = length 129, hash 1F5ABD5B
sample 96:
time = 953500
flags = 1
data = length 131, hash 65E1E196
sample 97:
time = 963500
flags = 1
data = length 128, hash 70A740A1
sample 98:
time = 973500
flags = 1
data = length 130, hash 2D3733ED
sample 99:
time = 983500
flags = 1
data = length 124, hash 6CC37521
sample 100:
time = 993500
flags = 536870913
data = length 129, hash 722253A8
tracksEnded = true

View File

@ -0,0 +1,232 @@
seekMap:
isSeekable = true
duration = 1460000
getPosition(0) = [[timeUs=0, position=179]]
getPosition(1) = [[timeUs=1, position=179]]
getPosition(730000) = [[timeUs=730000, position=398]]
getPosition(1460000) = [[timeUs=1460000, position=3701]]
numberOfTracks = 1
track 0:
total output bytes = 3504
sample count = 52
format 0:
id = 1
sampleMimeType = audio/opus
maxInputSize = 278
channelCount = 2
sampleRate = 48000
language = und
metadata = entries=[TSSE: description=null: value=Lavf58.29.100]
initializationData:
data = length 19, hash 86852AE2
data = length 8, hash 72CBCBF5
data = length 8, hash 79C07075
sample 0:
time = 483500
flags = 1
data = length 3, hash 4732
sample 1:
time = 493500
flags = 1
data = length 3, hash 4732
sample 2:
time = 503500
flags = 1
data = length 3, hash 4732
sample 3:
time = 513499
flags = 1
data = length 3, hash 4732
sample 4:
time = 523499
flags = 1
data = length 3, hash 4732
sample 5:
time = 533500
flags = 1
data = length 3, hash 4732
sample 6:
time = 543500
flags = 1
data = length 3, hash 4732
sample 7:
time = 553500
flags = 1
data = length 3, hash 4732
sample 8:
time = 563500
flags = 1
data = length 3, hash 4732
sample 9:
time = 573500
flags = 1
data = length 3, hash 4732
sample 10:
time = 583500
flags = 1
data = length 3, hash 4732
sample 11:
time = 593500
flags = 1
data = length 3, hash 4732
sample 12:
time = 603500
flags = 1
data = length 3, hash 4732
sample 13:
time = 613500
flags = 1
data = length 3, hash 4732
sample 14:
time = 623500
flags = 1
data = length 3, hash 4732
sample 15:
time = 633500
flags = 1
data = length 3, hash 4732
sample 16:
time = 643500
flags = 1
data = length 3, hash 4732
sample 17:
time = 653500
flags = 1
data = length 3, hash 4732
sample 18:
time = 663500
flags = 1
data = length 3, hash 4732
sample 19:
time = 673500
flags = 1
data = length 3, hash 4732
sample 20:
time = 683500
flags = 1
data = length 3, hash 4732
sample 21:
time = 693500
flags = 1
data = length 3, hash 4732
sample 22:
time = 703500
flags = 1
data = length 3, hash 4732
sample 23:
time = 713500
flags = 1
data = length 3, hash 4732
sample 24:
time = 723500
flags = 1
data = length 3, hash 4732
sample 25:
time = 733500
flags = 1
data = length 3, hash 4732
sample 26:
time = 743500
flags = 1
data = length 66, hash 648F0BC5
sample 27:
time = 753500
flags = 1
data = length 248, hash D07B1166
sample 28:
time = 763500
flags = 1
data = length 239, hash 61AA7E3B
sample 29:
time = 773500
flags = 1
data = length 142, hash F01726AD
sample 30:
time = 783500
flags = 1
data = length 124, hash 35B50117
sample 31:
time = 793500
flags = 1
data = length 122, hash 6ED2EA14
sample 32:
time = 803500
flags = 1
data = length 118, hash AAB319C9
sample 33:
time = 813500
flags = 1
data = length 117, hash 7B08A466
sample 34:
time = 823500
flags = 1
data = length 120, hash AF62F442
sample 35:
time = 833500
flags = 1
data = length 120, hash 21A0E5E9
sample 36:
time = 843500
flags = 1
data = length 122, hash F191C09
sample 37:
time = 853500
flags = 1
data = length 120, hash C52E4F2D
sample 38:
time = 863500
flags = 1
data = length 120, hash D4554502
sample 39:
time = 873500
flags = 1
data = length 121, hash D4E641CF
sample 40:
time = 883500
flags = 1
data = length 123, hash 518700A8
sample 41:
time = 893500
flags = 1
data = length 123, hash 6EA13134
sample 42:
time = 903500
flags = 1
data = length 123, hash A4264A7B
sample 43:
time = 913500
flags = 1
data = length 126, hash 593B6BA5
sample 44:
time = 923500
flags = 1
data = length 127, hash 15988F8A
sample 45:
time = 933500
flags = 1
data = length 134, hash 165D0213
sample 46:
time = 943500
flags = 1
data = length 129, hash 1F5ABD5B
sample 47:
time = 953500
flags = 1
data = length 131, hash 65E1E196
sample 48:
time = 963500
flags = 1
data = length 128, hash 70A740A1
sample 49:
time = 973500
flags = 1
data = length 130, hash 2D3733ED
sample 50:
time = 983500
flags = 1
data = length 124, hash 6CC37521
sample 51:
time = 993500
flags = 536870913
data = length 129, hash 722253A8
tracksEnded = true

View File

@ -0,0 +1,40 @@
seekMap:
isSeekable = true
duration = 1460000
getPosition(0) = [[timeUs=0, position=179]]
getPosition(1) = [[timeUs=1, position=179]]
getPosition(730000) = [[timeUs=730000, position=398]]
getPosition(1460000) = [[timeUs=1460000, position=3701]]
numberOfTracks = 1
track 0:
total output bytes = 511
sample count = 4
format 0:
id = 1
sampleMimeType = audio/opus
maxInputSize = 278
channelCount = 2
sampleRate = 48000
language = und
metadata = entries=[TSSE: description=null: value=Lavf58.29.100]
initializationData:
data = length 19, hash 86852AE2
data = length 8, hash 72CBCBF5
data = length 8, hash 79C07075
sample 0:
time = 963500
flags = 1
data = length 128, hash 70A740A1
sample 1:
time = 973500
flags = 1
data = length 130, hash 2D3733ED
sample 2:
time = 983500
flags = 1
data = length 124, hash 6CC37521
sample 3:
time = 993500
flags = 536870913
data = length 129, hash 722253A8
tracksEnded = true

View File

@ -0,0 +1,28 @@
seekMap:
isSeekable = true
duration = 1460000
getPosition(0) = [[timeUs=0, position=179]]
getPosition(1) = [[timeUs=1, position=179]]
getPosition(730000) = [[timeUs=730000, position=398]]
getPosition(1460000) = [[timeUs=1460000, position=3701]]
numberOfTracks = 1
track 0:
total output bytes = 129
sample count = 1
format 0:
id = 1
sampleMimeType = audio/opus
maxInputSize = 278
channelCount = 2
sampleRate = 48000
language = und
metadata = entries=[TSSE: description=null: value=Lavf58.29.100]
initializationData:
data = length 19, hash 86852AE2
data = length 8, hash 72CBCBF5
data = length 8, hash 79C07075
sample 0:
time = 993500
flags = 536870913
data = length 129, hash 722253A8
tracksEnded = true

View File

@ -0,0 +1,428 @@
seekMap:
isSeekable = true
duration = 1460000
getPosition(0) = [[timeUs=0, position=179]]
getPosition(1) = [[timeUs=1, position=179]]
getPosition(730000) = [[timeUs=730000, position=398]]
getPosition(1460000) = [[timeUs=1460000, position=3701]]
numberOfTracks = 1
track 0:
total output bytes = 3651
sample count = 101
format 0:
id = 1
sampleMimeType = audio/opus
maxInputSize = 278
channelCount = 2
sampleRate = 48000
language = und
metadata = entries=[TSSE: description=null: value=Lavf58.29.100]
initializationData:
data = length 19, hash 86852AE2
data = length 8, hash 72CBCBF5
data = length 8, hash 79C07075
sample 0:
time = 0
flags = 1
data = length 3, hash 4732
sample 1:
time = 3500
flags = 1
data = length 3, hash 4732
sample 2:
time = 13500
flags = 1
data = length 3, hash 4732
sample 3:
time = 23500
flags = 1
data = length 3, hash 4732
sample 4:
time = 33500
flags = 1
data = length 3, hash 4732
sample 5:
time = 43500
flags = 1
data = length 3, hash 4732
sample 6:
time = 53500
flags = 1
data = length 3, hash 4732
sample 7:
time = 63500
flags = 1
data = length 3, hash 4732
sample 8:
time = 73500
flags = 1
data = length 3, hash 4732
sample 9:
time = 83500
flags = 1
data = length 3, hash 4732
sample 10:
time = 93500
flags = 1
data = length 3, hash 4732
sample 11:
time = 103500
flags = 1
data = length 3, hash 4732
sample 12:
time = 113500
flags = 1
data = length 3, hash 4732
sample 13:
time = 123500
flags = 1
data = length 3, hash 4732
sample 14:
time = 133500
flags = 1
data = length 3, hash 4732
sample 15:
time = 143500
flags = 1
data = length 3, hash 4732
sample 16:
time = 153500
flags = 1
data = length 3, hash 4732
sample 17:
time = 163500
flags = 1
data = length 3, hash 4732
sample 18:
time = 173500
flags = 1
data = length 3, hash 4732
sample 19:
time = 183500
flags = 1
data = length 3, hash 4732
sample 20:
time = 193500
flags = 1
data = length 3, hash 4732
sample 21:
time = 203500
flags = 1
data = length 3, hash 4732
sample 22:
time = 213500
flags = 1
data = length 3, hash 4732
sample 23:
time = 223500
flags = 1
data = length 3, hash 4732
sample 24:
time = 233500
flags = 1
data = length 3, hash 4732
sample 25:
time = 243500
flags = 1
data = length 3, hash 4732
sample 26:
time = 253500
flags = 1
data = length 3, hash 4732
sample 27:
time = 263500
flags = 1
data = length 3, hash 4732
sample 28:
time = 273500
flags = 1
data = length 3, hash 4732
sample 29:
time = 283500
flags = 1
data = length 3, hash 4732
sample 30:
time = 293500
flags = 1
data = length 3, hash 4732
sample 31:
time = 303500
flags = 1
data = length 3, hash 4732
sample 32:
time = 313500
flags = 1
data = length 3, hash 4732
sample 33:
time = 323500
flags = 1
data = length 3, hash 4732
sample 34:
time = 333500
flags = 1
data = length 3, hash 4732
sample 35:
time = 343500
flags = 1
data = length 3, hash 4732
sample 36:
time = 353500
flags = 1
data = length 3, hash 4732
sample 37:
time = 363500
flags = 1
data = length 3, hash 4732
sample 38:
time = 373500
flags = 1
data = length 3, hash 4732
sample 39:
time = 383500
flags = 1
data = length 3, hash 4732
sample 40:
time = 393500
flags = 1
data = length 3, hash 4732
sample 41:
time = 403500
flags = 1
data = length 3, hash 4732
sample 42:
time = 413500
flags = 1
data = length 3, hash 4732
sample 43:
time = 423500
flags = 1
data = length 3, hash 4732
sample 44:
time = 433500
flags = 1
data = length 3, hash 4732
sample 45:
time = 443500
flags = 1
data = length 3, hash 4732
sample 46:
time = 453500
flags = 1
data = length 3, hash 4732
sample 47:
time = 463500
flags = 1
data = length 3, hash 4732
sample 48:
time = 473500
flags = 1
data = length 3, hash 4732
sample 49:
time = 483500
flags = 1
data = length 3, hash 4732
sample 50:
time = 493500
flags = 1
data = length 3, hash 4732
sample 51:
time = 503500
flags = 1
data = length 3, hash 4732
sample 52:
time = 513499
flags = 1
data = length 3, hash 4732
sample 53:
time = 523499
flags = 1
data = length 3, hash 4732
sample 54:
time = 533500
flags = 1
data = length 3, hash 4732
sample 55:
time = 543500
flags = 1
data = length 3, hash 4732
sample 56:
time = 553500
flags = 1
data = length 3, hash 4732
sample 57:
time = 563500
flags = 1
data = length 3, hash 4732
sample 58:
time = 573500
flags = 1
data = length 3, hash 4732
sample 59:
time = 583500
flags = 1
data = length 3, hash 4732
sample 60:
time = 593500
flags = 1
data = length 3, hash 4732
sample 61:
time = 603500
flags = 1
data = length 3, hash 4732
sample 62:
time = 613500
flags = 1
data = length 3, hash 4732
sample 63:
time = 623500
flags = 1
data = length 3, hash 4732
sample 64:
time = 633500
flags = 1
data = length 3, hash 4732
sample 65:
time = 643500
flags = 1
data = length 3, hash 4732
sample 66:
time = 653500
flags = 1
data = length 3, hash 4732
sample 67:
time = 663500
flags = 1
data = length 3, hash 4732
sample 68:
time = 673500
flags = 1
data = length 3, hash 4732
sample 69:
time = 683500
flags = 1
data = length 3, hash 4732
sample 70:
time = 693500
flags = 1
data = length 3, hash 4732
sample 71:
time = 703500
flags = 1
data = length 3, hash 4732
sample 72:
time = 713500
flags = 1
data = length 3, hash 4732
sample 73:
time = 723500
flags = 1
data = length 3, hash 4732
sample 74:
time = 733500
flags = 1
data = length 3, hash 4732
sample 75:
time = 743500
flags = 1
data = length 66, hash 648F0BC5
sample 76:
time = 753500
flags = 1
data = length 248, hash D07B1166
sample 77:
time = 763500
flags = 1
data = length 239, hash 61AA7E3B
sample 78:
time = 773500
flags = 1
data = length 142, hash F01726AD
sample 79:
time = 783500
flags = 1
data = length 124, hash 35B50117
sample 80:
time = 793500
flags = 1
data = length 122, hash 6ED2EA14
sample 81:
time = 803500
flags = 1
data = length 118, hash AAB319C9
sample 82:
time = 813500
flags = 1
data = length 117, hash 7B08A466
sample 83:
time = 823500
flags = 1
data = length 120, hash AF62F442
sample 84:
time = 833500
flags = 1
data = length 120, hash 21A0E5E9
sample 85:
time = 843500
flags = 1
data = length 122, hash F191C09
sample 86:
time = 853500
flags = 1
data = length 120, hash C52E4F2D
sample 87:
time = 863500
flags = 1
data = length 120, hash D4554502
sample 88:
time = 873500
flags = 1
data = length 121, hash D4E641CF
sample 89:
time = 883500
flags = 1
data = length 123, hash 518700A8
sample 90:
time = 893500
flags = 1
data = length 123, hash 6EA13134
sample 91:
time = 903500
flags = 1
data = length 123, hash A4264A7B
sample 92:
time = 913500
flags = 1
data = length 126, hash 593B6BA5
sample 93:
time = 923500
flags = 1
data = length 127, hash 15988F8A
sample 94:
time = 933500
flags = 1
data = length 134, hash 165D0213
sample 95:
time = 943500
flags = 1
data = length 129, hash 1F5ABD5B
sample 96:
time = 953500
flags = 1
data = length 131, hash 65E1E196
sample 97:
time = 963500
flags = 1
data = length 128, hash 70A740A1
sample 98:
time = 973500
flags = 1
data = length 130, hash 2D3733ED
sample 99:
time = 983500
flags = 1
data = length 124, hash 6CC37521
sample 100:
time = 993500
flags = 536870913
data = length 129, hash 722253A8
tracksEnded = true

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff