Procházet zdrojové kódy

update hls-segment-reader with byterange support

Gil Pedersen před 11 roky
rodič
revize
a4129d3aba
6 změnil soubory, kde provedl 26 přidání a 22 odebrání
  1. 9 9
      bin/hlsdump
  2. 1 1
      bin/hlsmon
  3. 2 1
      bin/hlsrecord
  4. 4 4
      lib/hls-reader.js
  5. 9 6
      lib/recorder.js
  6. 1 1
      package.json

+ 9 - 9
bin/hlsdump

@@ -49,7 +49,7 @@ if (!src) {
 
 if (hlsdump.bufferSize) hlsdump.sync = true;
 
-var segmentReader = new HlsSegmentReader(src, { highWaterMark: (hlsdump.concurrent || 1) - 1, fullStream: hlsdump.fullStream });
+var segmentReader = new HlsSegmentReader(src, { withData: true, highWaterMark: (hlsdump.concurrent || 1) - 1, fullStream: hlsdump.fullStream });
 var r = new HlsReader(segmentReader, hlsdump);
 
 segmentReader.once('index', function() {
@@ -83,20 +83,20 @@ r.on('end', function() {
 })
 
 var totalDuration = 0;
-r.on('segment', function(data) {
-  var downloadSize = data.meta.size;
-  var duration = data.segment.duration;
+r.on('segment', function(segmentInfo) {
+  var downloadSize = segmentInfo.file.size;
+  var duration = segmentInfo.details.duration;
   totalDuration += duration;
 
   // calculate size when missing
   if (downloadSize === -1) {
     downloadSize = 0;
-    data.stream.on('data', function(chunk) {
+    segmentInfo.stream.on('data', function(chunk) {
       downloadSize += chunk.length;
     });
   }
 
-  oncemore(data.stream).once('close', 'end', 'error', function(/*err*/) {
+  oncemore(segmentInfo.stream).once('close', 'end', 'error', function(/*err*/) {
     console.error('segment done at ' + totalDuration.toFixed(0) + ' seconds, avg bitrate (kbps):', (downloadSize / (duration * 1024 / 8)).toFixed(1));
   });
 });
@@ -114,11 +114,11 @@ if (hlsdump.infoPort) {
 
   stats.meter('streamErrors');
 
-  r.on('segment', function(data) {
-    currentSegment = data.seq;
+  r.on('segment', function(segmentInfo) {
+    currentSegment = segmentInfo.seq;
 
     var stopwatch = stats.timer('fetchTime').start();
-    oncemore(data.stream).once('close', 'end', 'error', function(err) {
+    oncemore(segmentInfo.stream).once('close', 'end', 'error', function(err) {
       stopwatch.end();
       if (err) stats.meter('streamErrors').mark();
     });

+ 1 - 1
bin/hlsmon

@@ -16,7 +16,7 @@ var src = process.argv[2];
 var sep = ';';
 
 function monitor(srcUrl) {
-  var r = new HlsSegmentReader(srcUrl, { noData:true });
+  var r = new HlsSegmentReader(srcUrl);
 
   var time = 0;
   r.on('readable', function() {

+ 2 - 1
bin/hlsrecord

@@ -62,10 +62,11 @@ var extensions = {};
 });
 
 var readerOptions = {
+  withData: true,
+  fullStream: !hlsrecord.beginDate,
   startDate: hlsrecord.beginDate,
   stopDate: hlsrecord.endDate,
   maxStallTime: 5 * 60 * 1000,
-  fullStream: true,
   extensions: extensions,
   highWaterMark: 0,
 };

+ 4 - 4
lib/hls-reader.js

@@ -64,16 +64,16 @@ function HlsReader(segmentReader, options) {
   this.isHooked = false;
   this.buffer = new Passthrough({ highWaterMark: this.bufferSize });
 
-  StreamProcess(this.reader, function (obj, done) {
+  StreamProcess(this.reader, function (segmentInfo, done) {
     self.isReading = true;
 
-    return self.decrypt(obj.stream, obj.segment.key, function (err, stream) {
+    return self.decrypt(segmentInfo.stream, segmentInfo.details.key, function (err, stream) {
       if (err) {
         console.error('decrypt failed', err.stack);
-        stream = obj.stream;
+        stream = segmentInfo.stream;
       }
 
-      self.emit('segment', obj);
+      self.emit('segment', segmentInfo);
 
       stream = oncemore(stream);
 

+ 9 - 6
lib/recorder.js

@@ -156,23 +156,26 @@ HlsStreamRecorder.prototype.updateIndex = function(update) {
     throw new Error('Invalid index');
 };
 
-HlsStreamRecorder.prototype.process = function(obj, next) {
+HlsStreamRecorder.prototype.process = function(segmentInfo, next) {
   var self = this;
 
-  var segment = new m3u8parse.M3U8Segment(obj.segment);
-  var meta = obj.meta;
+  var segment = new m3u8parse.M3U8Segment(segmentInfo.details, true);
+  var meta = segmentInfo.file;
+
+  // remove byterange info
+  delete segment.byterange;
 
   // mark discontinuities
   if (this.nextSegmentSeq !== -1 &&
-      this.nextSegmentSeq !== obj.seq)
+      this.nextSegmentSeq !== segmentInfo.seq)
     segment.discontinuity = true;
-  this.nextSegmentSeq = obj.seq + 1;
+  this.nextSegmentSeq = segmentInfo.seq + 1;
 
   // create our own uri
   segment.uri = util.format('%s.%s', this.segmentName(this.seq), mime.extension(meta.mime));
 
   // save the stream segment
-  var stream = oncemore(obj.stream);
+  var stream = oncemore(segmentInfo.stream);
   stream.pipe(fs.createWriteStream(path.join(this.dst, segment.uri)));
   stream.once('end', 'error', function(err) {
     // only to report errors

+ 1 - 1
package.json

@@ -29,7 +29,7 @@
     "commander": "^2.3.0",
     "debug": "^2.0.0",
     "deep-equal": "^1.0.0",
-    "hls-segment-reader": "^1.0.0",
+    "hls-segment-reader": "^2.0.0",
     "m3u8parse": "^0.1.13",
     "measured": "^1.0.0",
     "mime-types": "^2.0.1",