109 lines
5.2 KiB
JavaScript
109 lines
5.2 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
|
|
* MP3 demuxer
|
|
*/
|
|
|
|
|
|
var _id = require('../demux/id3');
|
|
|
|
var _id2 = _interopRequireDefault(_id);
|
|
|
|
var _logger = require('../utils/logger');
|
|
|
|
var _mpegaudio = require('./mpegaudio');
|
|
|
|
var _mpegaudio2 = _interopRequireDefault(_mpegaudio);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
var MP3Demuxer = function () {
|
|
function MP3Demuxer(observer, remuxer, config) {
|
|
_classCallCheck(this, MP3Demuxer);
|
|
|
|
this.observer = observer;
|
|
this.config = config;
|
|
this.remuxer = remuxer;
|
|
}
|
|
|
|
_createClass(MP3Demuxer, [{
|
|
key: 'resetInitSegment',
|
|
value: function resetInitSegment(initSegment, audioCodec, videoCodec, duration) {
|
|
this._audioTrack = { container: 'audio/mpeg', type: 'audio', id: -1, sequenceNumber: 0, isAAC: false, samples: [], len: 0, manifestCodec: audioCodec, duration: duration, inputTimeScale: 90000 };
|
|
}
|
|
}, {
|
|
key: 'resetTimeStamp',
|
|
value: function resetTimeStamp() {}
|
|
}, {
|
|
key: 'append',
|
|
|
|
|
|
// feed incoming data to the front of the parsing pipeline
|
|
value: function append(data, timeOffset, contiguous, accurateTimeOffset) {
|
|
var id3Data = _id2.default.getID3Data(data, 0);
|
|
var pts = 90 * _id2.default.getTimeStamp(id3Data);
|
|
var offset = id3Data.length;
|
|
var length = data.length;
|
|
var frameIndex = 0,
|
|
stamp = 0;
|
|
var track = this._audioTrack;
|
|
|
|
var id3Samples = [{ pts: pts, dts: pts, data: id3Data }];
|
|
|
|
while (offset < length) {
|
|
if (_mpegaudio2.default.isHeader(data, offset)) {
|
|
var frame = _mpegaudio2.default.appendFrame(track, data, offset, pts, frameIndex);
|
|
if (frame) {
|
|
offset += frame.length;
|
|
stamp = frame.sample.pts;
|
|
frameIndex++;
|
|
} else {
|
|
//logger.log('Unable to parse Mpeg audio frame');
|
|
break;
|
|
}
|
|
} else if (_id2.default.isHeader(data, offset)) {
|
|
id3Data = _id2.default.getID3Data(data, offset);
|
|
id3Samples.push({ pts: stamp, dts: stamp, data: id3Data });
|
|
offset += id3Data.length;
|
|
} else {
|
|
//nothing found, keep looking
|
|
offset++;
|
|
}
|
|
}
|
|
|
|
this.remuxer.remux(track, { samples: [] }, { samples: id3Samples, inputTimeScale: 90000 }, { samples: [] }, timeOffset, contiguous, accurateTimeOffset);
|
|
}
|
|
}, {
|
|
key: 'destroy',
|
|
value: function destroy() {}
|
|
}], [{
|
|
key: 'probe',
|
|
value: function probe(data) {
|
|
// check if data contains ID3 timestamp and MPEG sync word
|
|
var offset, length;
|
|
var id3Data = _id2.default.getID3Data(data, 0);
|
|
if (id3Data && _id2.default.getTimeStamp(id3Data) !== undefined) {
|
|
// Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either 0 or 1 and Y or Z should be 1
|
|
// Layer bits (position 14 and 15) in header should be always different from 0 (Layer I or Layer II or Layer III)
|
|
// More info http://www.mp3-tech.org/programmer/frame_header.html
|
|
for (offset = id3Data.length, length = Math.min(data.length - 1, offset + 100); offset < length; offset++) {
|
|
if (_mpegaudio2.default.probe(data, offset)) {
|
|
_logger.logger.log('MPEG Audio sync word found !');
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}]);
|
|
|
|
return MP3Demuxer;
|
|
}();
|
|
|
|
exports.default = MP3Demuxer; |