31f3e4db by Simeon Bateman Committed by David LaPalomento

fixed conflicts, added aacstream and h264stream elements

1 parent f239b405
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 (function(window, videojs, undefined) { 14 (function(window, videojs, undefined) {
15 'use strict'; 15 'use strict';
16 16
17 var PacketStream, ParseStream, ProgramStream, Transmuxer, MP2T_PACKET_LENGTH, H264_STREAM_TYPE, ADTS_STREAM_TYPE, mp4; 17 var PacketStream, ParseStream, ProgramStream, Transmuxer, AacStream, H264Stream, MP2T_PACKET_LENGTH, H264_STREAM_TYPE, ADTS_STREAM_TYPE, mp4;
18 18
19 MP2T_PACKET_LENGTH = 188; // bytes 19 MP2T_PACKET_LENGTH = 188; // bytes
20 H264_STREAM_TYPE = 0x1b; 20 H264_STREAM_TYPE = 0x1b;
...@@ -273,15 +273,22 @@ ProgramStream = function() { ...@@ -273,15 +273,22 @@ ProgramStream = function() {
273 data: [], 273 data: [],
274 size: 0 274 size: 0
275 }, 275 },
276 flushStream = function(stream, type) { 276 flushStream = function(stream, type, pes) {
277 var 277 var
278 event = { 278 event = {
279 type: type, 279 type: type,
280 data: new Uint8Array(stream.size) 280 data: new Uint8Array(stream.size),
281 }, 281 },
282 i = 0, 282 i = 0,
283 fragment; 283 fragment;
284 284
285 // move over data from PES into Stream frame
286 event.pts = pes.pts;
287 event.dts = pes.dts;
288 event.pid = pes.pid;
289 event.dataAlignmentIndicator = pes.dataAlignmentIndicator;
290 event.payloadUnitStartIndicator = pes.payloadUnitStartIndicator
291
285 // do nothing if there is no buffered data 292 // do nothing if there is no buffered data
286 if (!stream.data.length) { 293 if (!stream.data.length) {
287 return; 294 return;
...@@ -323,7 +330,7 @@ ProgramStream = function() { ...@@ -323,7 +330,7 @@ ProgramStream = function() {
323 // if a new packet is starting, we can flush the completed 330 // if a new packet is starting, we can flush the completed
324 // packet 331 // packet
325 if (data.payloadUnitStartIndicator) { 332 if (data.payloadUnitStartIndicator) {
326 flushStream(stream, streamType); 333 flushStream(stream, streamType, data);
327 } 334 }
328 335
329 // buffer this fragment until we are sure we've received the 336 // buffer this fragment until we are sure we've received the
...@@ -369,28 +376,69 @@ ProgramStream = function() { ...@@ -369,28 +376,69 @@ ProgramStream = function() {
369 * will flush the buffered packets. 376 * will flush the buffered packets.
370 */ 377 */
371 this.end = function() { 378 this.end = function() {
379 debugger
372 flushStream(video, 'video'); 380 flushStream(video, 'video');
373 flushStream(audio, 'audio'); 381 flushStream(audio, 'audio');
374 }; 382 };
375 }; 383 };
376 ProgramStream.prototype = new videojs.Hls.Stream(); 384 ProgramStream.prototype = new videojs.Hls.Stream();
377 385
386 /*
387 * Accepts a ProgramStream and emits data events with parsed
388 * AAC Audio Frames of the individual packets.
389 */
390 AacStream = function() {
391 var self;
392 AacStream.prototype.init.call(this);
393 self = this;
394
395 this.push = function(packet) {
396 if (packet.type == "audio") {
397 console.log('AAC Stream Push!');
398 this.trigger('data', packet);
399 }
400 };
401 };
402 AacStream.prototype = new videojs.Hls.Stream();
403
404 /**
405 * Accepts a ProgramStream and emits data events with parsed
406 * AAC Audio Frames of the individual packets.
407 */
408 H264Stream = function() {
409 var self;
410 H264Stream.prototype.init.call(this);
411 self = this;
412
413 this.push = function(packet) {
414 if (packet.type == "video") {
415 console.log('h264 Stream Push!');
416 this.trigger('data', packet);
417 }
418 };
419 };
420 H264Stream.prototype = new videojs.Hls.Stream();
421
422
378 Transmuxer = function() { 423 Transmuxer = function() {
379 var self = this, packetStream, parseStream, programStream; 424 var self = this, packetStream, parseStream, programStream, aacStream, h264Stream;
380 Transmuxer.prototype.init.call(this); 425 Transmuxer.prototype.init.call(this);
381 426
382 // set up the parsing pipeline 427 // set up the parsing pipeline
383 packetStream = new PacketStream(); 428 packetStream = new PacketStream();
384 parseStream = new ParseStream(); 429 parseStream = new ParseStream();
385 programStream = new ProgramStream(); 430 programStream = new ProgramStream();
431 aacStream = new AacStream();
432 h264Stream = new H264Stream();
386 433
387 packetStream.pipe(parseStream); 434 packetStream.pipe(parseStream);
388 parseStream.pipe(programStream); 435 parseStream.pipe(programStream);
436 programStream.pipe(aacStream);
389 437
390 // generate an init segment 438 // generate an init segment
391 this.initSegment = mp4.initSegment(); 439 this.initSegment = mp4.initSegment();
392 440
393 programStream.on('data', function(data) { 441 aacStream.on('data', function(data) {
394 self.trigger('data', data); 442 self.trigger('data', data);
395 }); 443 });
396 444
...@@ -411,6 +459,8 @@ window.videojs.mp2t = { ...@@ -411,6 +459,8 @@ window.videojs.mp2t = {
411 PacketStream: PacketStream, 459 PacketStream: PacketStream,
412 ParseStream: ParseStream, 460 ParseStream: ParseStream,
413 ProgramStream: ProgramStream, 461 ProgramStream: ProgramStream,
414 Transmuxer: Transmuxer 462 Transmuxer: Transmuxer,
463 AacStream: AacStream,
464 H264Stream: H264Stream
415 }; 465 };
416 })(window, window.videojs); 466 })(window, window.videojs);
......
...@@ -63,8 +63,7 @@ ...@@ -63,8 +63,7 @@
63 </div> 63 </div>
64 <div class="result-wrapper"> 64 <div class="result-wrapper">
65 <h3>Working</h3> 65 <h3>Working</h3>
66 <pre class="working-boxes"> 66 <pre class="working-boxes"></pre>
67 </pre>
68 </div> 67 </div>
69 </section> 68 </section>
70 <section> 69 <section>
...@@ -107,6 +106,8 @@ ...@@ -107,6 +106,8 @@
107 <script src="../../src/stream.js"></script> 106 <script src="../../src/stream.js"></script>
108 <script src="../../src/mp4-generator.js"></script> 107 <script src="../../src/mp4-generator.js"></script>
109 <script src="../../src/transmuxer.js"></script> 108 <script src="../../src/transmuxer.js"></script>
109 <script src="../../src/flv-tag.js"></script>
110 <script src="../../src/exp-golomb.js"></script>
110 <script src="js/mp4-inspector.js"></script> 111 <script src="js/mp4-inspector.js"></script>
111 112
112 <script src="../../src/bin-utils.js"></script> 113 <script src="../../src/bin-utils.js"></script>
...@@ -123,6 +124,7 @@ ...@@ -123,6 +124,7 @@
123 124
124 video = document.createElement('video'), 125 video = document.createElement('video'),
125 mediaSource = new MediaSource(), 126 mediaSource = new MediaSource(),
127 FlvTag = videojs.Hls.FlvTag;
126 128
127 logevent = function(event) { 129 logevent = function(event) {
128 console.log(event.type); 130 console.log(event.type);
...@@ -150,13 +152,17 @@ ...@@ -150,13 +152,17 @@
150 videojs.log = console.log.bind(console); 152 videojs.log = console.log.bind(console);
151 153
152 original.addEventListener('change', function() { 154 original.addEventListener('change', function() {
153 var reader = new FileReader(); 155 var reader = new FileReader(),
156 videoSegments= [],
157 audioSegments = [],
158 videoBuffer = [],
159 audioBuffer = [];
160
154 reader.addEventListener('loadend', function() { 161 reader.addEventListener('loadend', function() {
155 var segment = new Uint8Array(reader.result), 162 var segment = new Uint8Array(reader.result),
156 transmuxer = new videojs.mp2t.Transmuxer(), 163 transmuxer = new videojs.mp2t.Transmuxer(),
157 hex = ''; 164 hex = '';
158 165
159
160 transmuxer.on('data', function(data) { 166 transmuxer.on('data', function(data) {
161 if (data) { 167 if (data) {
162 console.log(data); 168 console.log(data);
...@@ -182,6 +188,8 @@ ...@@ -182,6 +188,8 @@
182 var hex = '', 188 var hex = '',
183 bytes = new Uint8Array(reader.result); 189 bytes = new Uint8Array(reader.result);
184 190
191
192 console.log("boxes", videojs.inspectMp4(bytes));
185 // clear old box info 193 // clear old box info
186 workingBoxes.innerHTML = JSON.stringify(videojs.inspectMp4(bytes), null, ' '); 194 workingBoxes.innerHTML = JSON.stringify(videojs.inspectMp4(bytes), null, ' ');
187 195
......
...@@ -14,7 +14,15 @@ ...@@ -14,7 +14,15 @@
14 <link rel="stylesheet" href="css/main.css"> 14 <link rel="stylesheet" href="css/main.css">
15 15
16 <script src="js/vendor/modernizr-2.6.2.min.js"></script> 16 <script src="js/vendor/modernizr-2.6.2.min.js"></script>
17 <script src="min-m4s.js"></script> 17
18 <script>
19 window.videojs = window.videojs || {
20 Hls: {}
21 };
22 </script>
23 <!--<script src="min-m4s.js"></script>-->
24 <script src="./js/mdat.js"></script>
25 <script src="../../src/mp4-generator.js"></script>
18 </head> 26 </head>
19 <body> 27 <body>
20 <!--[if lt IE 7]> 28 <!--[if lt IE 7]>
...@@ -59,7 +67,6 @@ ...@@ -59,7 +67,6 @@
59 sourceBuffer, 67 sourceBuffer,
60 video; 68 video;
61 69
62
63 function closed() { 70 function closed() {
64 console.log("MediaSource Closed."); 71 console.log("MediaSource Closed.");
65 } 72 }
...@@ -69,38 +76,38 @@ ...@@ -69,38 +76,38 @@
69 if (done) { 76 if (done) {
70 return; 77 return;
71 } 78 }
79
72 console.log("LOAD FRAGMENT"); 80 console.log("LOAD FRAGMENT");
73 /*
74 var req = new XMLHttpRequest();
75 req.responseType = "arraybuffer";
76 req.open("GET", "../fixtures/dash/1-avc1.42c00d.m4s", true);
77 */
78 81
82 var moov = videojs.mp4.moov(100, 600, 300, "video");
83 var moof = videojs.mp4.moof([{trackId: 1}]);
84 var frag = Array.prototype.slice.call(moov);
85 frag = frag.concat(Array.prototype.slice.call(moof));
86 frag = frag.concat(Array.prototype.slice.call(mdat));
79 87
80 //req.onload = function () {
81 console.log("FRAGMENT DONE LOADING");
82 88
83 sourceBuffer.appendBuffer(new Uint8Array(m4s)); 89
90 sourceBuffer.appendBuffer( new Uint8Array( frag ) );
91
84 done = true; 92 done = true;
85 //};
86 93
87 /* 94 }
88 req.onerror = function () { 95
89 window.alert("Could not load fragment."); 96 function loadMdat(){
90 }; 97 console.log('mdat', mdat);
98 setTimeout( function(){
99 sourceBuffer.appendBuffer(new Uint8Amdat);
100 },0);
91 101
92 req.send();
93 */
94 } 102 }
95 103
96 function loadInit() { 104 function loadInit() {
97
98 console.log("LOAD INIT"); 105 console.log("LOAD INIT");
99 var req = new XMLHttpRequest(); 106 var req = new XMLHttpRequest();
100 req.responseType = "arraybuffer"; 107 req.responseType = "arraybuffer";
101 req.open("GET", "../fixtures/dash/init.mp4", true); 108 req.open("GET", "./ts2/Header.m4s", true);
102 109
103 req.onload = function () { 110 req.onload = function() {
104 console.log("INIT DONE LOADING"); 111 console.log("INIT DONE LOADING");
105 sourceBuffer.appendBuffer(new Uint8Array(req.response)); 112 sourceBuffer.appendBuffer(new Uint8Array(req.response));
106 sourceBuffer.addEventListener('update', loadFragment); 113 sourceBuffer.addEventListener('update', loadFragment);
......
1 [ 1 [
2 { 2 {
3 "majorBrand": "iso5",
4 "minorVersion": 1,
5 "compatibleBrands": [
6 1769172845,
7 1769172789,
8 1684108136
9 ],
10 "size": 28,
11 "type": "ftyp" 3 "type": "ftyp"
12 }, 4 },
13 { 5 {
14 "data": {
15 "0": 73,
16 "1": 115,
17 "2": 111,
18 "3": 77,
19 "4": 101,
20 "5": 100,
21 "6": 105,
22 "7": 97,
23 "8": 32,
24 "9": 70,
25 "10": 105,
26 "11": 108,
27 "12": 101,
28 "13": 32,
29 "14": 80,
30 "15": 114,
31 "16": 111,
32 "17": 100,
33 "18": 117,
34 "19": 99,
35 "20": 101,
36 "21": 100,
37 "22": 32,
38 "23": 119,
39 "24": 105,
40 "25": 116,
41 "26": 104,
42 "27": 32,
43 "28": 71,
44 "29": 80,
45 "30": 65,
46 "31": 67,
47 "32": 32,
48 "33": 48,
49 "34": 46,
50 "35": 53,
51 "36": 46,
52 "37": 49,
53 "38": 45,
54 "39": 68,
55 "40": 69,
56 "41": 86,
57 "42": 45,
58 "43": 114,
59 "44": 101,
60 "45": 118,
61 "46": 52,
62 "47": 49,
63 "48": 57,
64 "49": 57,
65 "50": 0
66 },
67 "size": 59,
68 "type": "free" 6 "type": "free"
69 }, 7 },
70 { 8 {
71 "boxes": [ 9 "boxes": [
72 { 10 {
73 "version": 0,
74 "flags": {
75 "0": 0,
76 "1": 0,
77 "2": 0
78 },
79 "creationTime": "2012-10-23T11:14:28.000Z",
80 "modificationTime": "2012-10-23T11:14:28.000Z",
81 "timescale": 600,
82 "duration": 0,
83 "rate": 1,
84 "volume": 1,
85 "matrix": {
86 "0": 0,
87 "1": 1,
88 "2": 0,
89 "3": 0,
90 "4": 0,
91 "5": 0,
92 "6": 0,
93 "7": 0,
94 "8": 0,
95 "9": 0,
96 "10": 0,
97 "11": 0,
98 "12": 0,
99 "13": 0,
100 "14": 0,
101 "15": 0,
102 "16": 0,
103 "17": 1,
104 "18": 0,
105 "19": 0,
106 "20": 0,
107 "21": 0,
108 "22": 0,
109 "23": 0,
110 "24": 0,
111 "25": 0,
112 "26": 0,
113 "27": 0,
114 "28": 0,
115 "29": 0,
116 "30": 0,
117 "31": 0,
118 "32": 64,
119 "33": 0,
120 "34": 0,
121 "35": 0
122 },
123 "nextTrackId": 2,
124 "size": 108,
125 "type": "mvhd" 11 "type": "mvhd"
126 }, 12 },
127 { 13 {
128 "boxes": [ 14 "boxes": [
129 { 15 {
130 "data": {
131 "0": 0,
132 "1": 0,
133 "2": 0,
134 "3": 0,
135 "4": 0,
136 "5": 0,
137 "6": 0,
138 "7": 0
139 },
140 "size": 16,
141 "type": "mehd" 16 "type": "mehd"
142 }, 17 },
143 { 18 {
144 "version": 0,
145 "flags": {
146 "0": 0,
147 "1": 0,
148 "2": 0
149 },
150 "trackId": 1,
151 "defaultSampleDescriptionIndex": 1,
152 "defaultSampleDuration": 1000,
153 "defaultSampleSize": 0,
154 "sampleDependsOn": 0,
155 "sampleIsDependedOn": 0,
156 "sampleHasRedundancy": 0,
157 "samplePaddingValue": 0,
158 "sampleIsDifferenceSample": true,
159 "sampleDegradationPriority": 0,
160 "size": 32,
161 "type": "trex" 19 "type": "trex"
162 } 20 }
163 ], 21 ],
164 "size": 56,
165 "type": "mvex" 22 "type": "mvex"
166 }, 23 },
167 { 24 {
168 "boxes": [ 25 "boxes": [
169 { 26 {
170 "version": 0,
171 "flags": {
172 "0": 0,
173 "1": 0,
174 "2": 1
175 },
176 "creationTime": "2012-02-14T00:07:31.000Z",
177 "modificationTime": "2012-10-23T11:14:29.000Z",
178 "trackId": 1,
179 "duration": 0,
180 "layer": 0,
181 "alternateGroup": 0,
182 "volume": 0,
183 "matrix": {
184 "0": 0,
185 "1": 1,
186 "2": 0,
187 "3": 0,
188 "4": 0,
189 "5": 0,
190 "6": 0,
191 "7": 0,
192 "8": 0,
193 "9": 0,
194 "10": 0,
195 "11": 0,
196 "12": 0,
197 "13": 0,
198 "14": 0,
199 "15": 0,
200 "16": 0,
201 "17": 1,
202 "18": 0,
203 "19": 0,
204 "20": 0,
205 "21": 0,
206 "22": 0,
207 "23": 0,
208 "24": 0,
209 "25": 0,
210 "26": 0,
211 "27": 0,
212 "28": 0,
213 "29": 0,
214 "30": 0,
215 "31": 0,
216 "32": 64,
217 "33": 0,
218 "34": 0,
219 "35": 0
220 },
221 "width": 320,
222 "height": 180,
223 "size": 92,
224 "type": "tkhd" 27 "type": "tkhd"
225 }, 28 },
226 { 29 {
227 "boxes": [ 30 "boxes": [
228 { 31 {
229 "version": 0,
230 "flags": {
231 "0": 0,
232 "1": 0,
233 "2": 0
234 },
235 "language": "und",
236 "creationTime": "2012-02-14T00:07:31.000Z",
237 "modificationTime": "2012-02-14T00:07:33.000Z",
238 "timescale": 25000,
239 "duration": 0,
240 "size": 32,
241 "type": "mdhd" 32 "type": "mdhd"
242 }, 33 },
243 { 34 {
244 "version": 0, 35
245 "flags": {
246 "0": 0,
247 "1": 0,
248 "2": 0
249 },
250 "handlerType": "vide",
251 "name": "counter-10mn_I25_320x180_48kbps_baseline.264:dur=600 - Imported with GPAC 0.4.6-DEV-rev3915",
252 "size": 124,
253 "type": "hdlr" 36 "type": "hdlr"
254 }, 37 },
255 { 38 {
256 "boxes": [ 39 "boxes": [
257 { 40 {
258 "version": 0,
259 "flags": {
260 "0": 0,
261 "1": 0,
262 "2": 1
263 },
264 "graphicsmode": 0,
265 "opcolor": {
266 "0": 0,
267 "1": 0,
268 "2": 0
269 },
270 "size": 20,
271 "type": "vmhd" 41 "type": "vmhd"
272 }, 42 },
273 { 43 {
274 "boxes": [ 44 "boxes": [
275 { 45 {
276 "version": 0,
277 "flags": {
278 "0": 0,
279 "1": 0,
280 "2": 0
281 },
282 "dataReferences": [ 46 "dataReferences": [
283 { 47 {
284 "version": 0,
285 "flags": {
286 "0": 0,
287 "1": 0,
288 "2": 1
289 },
290 "size": 12,
291 "type": "url " 48 "type": "url "
292 } 49 }
293 ], 50 ],
294 "size": 28,
295 "type": "dref" 51 "type": "dref"
296 } 52 }
297 ], 53 ],
298 "size": 36,
299 "type": "dinf" 54 "type": "dinf"
300 }, 55 },
301 { 56 {
302 "boxes": [ 57 "boxes": [
303 { 58 {
304 "version": 0,
305 "flags": {
306 "0": 0,
307 "1": 0,
308 "2": 0
309 },
310 "sampleDescriptions": [ 59 "sampleDescriptions": [
311 { 60 {
312 "dataReferenceIndex": 1,
313 "width": 320,
314 "height": 180,
315 "horizresolution": 72,
316 "vertresolution": 72,
317 "frameCount": 1,
318 "depth": 24,
319 "config": [ 61 "config": [
320 { 62 {
321 "configurationVersion": 1,
322 "avcProfileIndication": 66,
323 "profileCompatibility": 192,
324 "avcLevelIndication": 13,
325 "lengthSizeMinusOne": 3,
326 "sps": [
327 {
328 "0": 103,
329 "1": 66,
330 "2": 192,
331 "3": 13,
332 "4": 217,
333 "5": 1,
334 "6": 65,
335 "7": 159,
336 "8": 158,
337 "9": 16,
338 "10": 0,
339 "11": 0,
340 "12": 3,
341 "13": 0,
342 "14": 16,
343 "15": 0,
344 "16": 0,
345 "17": 3,
346 "18": 3,
347 "19": 32,
348 "20": 241,
349 "21": 66,
350 "22": 164,
351 "23": 128
352 },
353 {
354 "0": 103,
355 "1": 66,
356 "2": 192,
357 "3": 30,
358 "4": 37,
359 "5": 144,
360 "6": 10,
361 "7": 2,
362 "8": 255,
363 "9": 150,
364 "10": 16,
365 "11": 0,
366 "12": 0,
367 "13": 3,
368 "14": 0,
369 "15": 16,
370 "16": 0,
371 "17": 0,
372 "18": 3,
373 "19": 3,
374 "20": 32,
375 "21": 241,
376 "22": 98,
377 "23": 228,
378 "24": 128
379 },
380 {
381 "0": 103,
382 "1": 66,
383 "2": 192,
384 "3": 31,
385 "4": 53,
386 "5": 144,
387 "6": 5,
388 "7": 0,
389 "8": 91,
390 "9": 161,
391 "10": 0,
392 "11": 0,
393 "12": 3,
394 "13": 0,
395 "14": 1,
396 "15": 0,
397 "16": 0,
398 "17": 3,
399 "18": 0,
400 "19": 50,
401 "20": 15,
402 "21": 24,
403 "22": 50,
404 "23": 72
405 },
406 {
407 "0": 103,
408 "1": 66,
409 "2": 192,
410 "3": 40,
411 "4": 17,
412 "5": 100,
413 "6": 1,
414 "7": 224,
415 "8": 8,
416 "9": 159,
417 "10": 150,
418 "11": 16,
419 "12": 0,
420 "13": 0,
421 "14": 3,
422 "15": 0,
423 "16": 16,
424 "17": 0,
425 "18": 0,
426 "19": 3,
427 "20": 3,
428 "21": 32,
429 "22": 241,
430 "23": 131,
431 "24": 36,
432 "25": 128
433 }
434 ],
435 "pps": [
436 {
437 "0": 104,
438 "1": 203,
439 "2": 140,
440 "3": 178
441 },
442 {
443 "0": 104,
444 "1": 33,
445 "2": 11,
446 "3": 140,
447 "4": 178
448 },
449 {
450 "0": 104,
451 "1": 49,
452 "2": 139,
453 "3": 140,
454 "4": 178
455 },
456 {
457 "0": 104,
458 "1": 16,
459 "2": 32,
460 "3": 184,
461 "4": 203,
462 "5": 32
463 }
464 ],
465 "size": 150,
466 "type": "avcC" 63 "type": "avcC"
467 }, 64 },
468 { 65 {
469 "bufferSizeDB": 3978,
470 "maxBitrate": 85216,
471 "avgBitrate": 49120,
472 "size": 20,
473 "type": "btrt" 66 "type": "btrt"
474 } 67 }
475 ], 68 ],
476 "size": 256,
477 "type": "avc1" 69 "type": "avc1"
478 } 70 }
479 ], 71 ],
480 "size": 272,
481 "type": "stsd" 72 "type": "stsd"
482 }, 73 },
483 { 74 {
484 "version": 0,
485 "flags": {
486 "0": 0,
487 "1": 0,
488 "2": 0
489 },
490 "timeToSamples": [],
491 "size": 16,
492 "type": "stts" 75 "type": "stts"
493 }, 76 },
494 { 77 {
495 "version": 0,
496 "flags": {
497 "0": 0,
498 "1": 0,
499 "2": 0
500 },
501 "sampleToChunks": [],
502 "size": 16,
503 "type": "stsc" 78 "type": "stsc"
504 }, 79 },
505 { 80 {
506 "version": 0,
507 "flags": {
508 "0": 0,
509 "1": 0,
510 "2": 0
511 },
512 "sampleSize": 0,
513 "entries": [],
514 "size": 20,
515 "type": "stsz" 81 "type": "stsz"
516 }, 82 },
517 { 83 {
518 "version": 0,
519 "flags": {
520 "0": 0,
521 "1": 0,
522 "2": 0
523 },
524 "chunkOffsets": [],
525 "size": 16,
526 "type": "stco" 84 "type": "stco"
527 } 85 }
528 ], 86 ],
529 "size": 348,
530 "type": "stbl" 87 "type": "stbl"
531 } 88 }
532 ], 89 ],
533 "size": 412,
534 "type": "minf" 90 "type": "minf"
535 } 91 }
536 ], 92 ],
537 "size": 576,
538 "type": "mdia" 93 "type": "mdia"
539 } 94 }
540 ], 95 ],
541 "size": 676,
542 "type": "trak" 96 "type": "trak"
543 } 97 }
544 ], 98 ],
545 "size": 848,
546 "type": "moov" 99 "type": "moov"
547 } 100 }
548 ] 101 ]
...\ No newline at end of file ...\ No newline at end of file
......