0

I'm currently realising a school project which aims a streaming video website (like Netflix) using torrent-stream (with the magnet link). I am using NodeJS for the stream part.

My problem is : I can't redirect the stream to the HTML 5 player while i'm trying to stream and converting (with ffmpeg) video at the same time. I think it's because I just can't know what's will be the final size of the converted file. In browser's console I have this message: net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)

I tried to put this in the header : Transfer-Encoding: chunked instead of Content-Length I specify that the stream (before conversion) works perfectly

This is my code :

getTorrentFile.then(function (file) {
                res.setHeader('Content-Type', 'video/mp4');
                res.setHeader('Content-Length', file.length);
                const ranges = parseRange(file.length, '15' /* variable à comprendre */, { combine: true });
                console.log(ranges);
                if (ranges === -1) {
                    // 416 Requested Range Not Satisfiable
                    console.log('416')
                    res.statusCode = 416;
                    return res.end();
                } else if (ranges === -2 || ranges.type !== 'bytes' || ranges.length > 1) {
                    // 200 OK requested range malformed or multiple ranges requested, stream ent'ire video
                    if (req.method !== 'GET') return res.end();
                    console.log('200')
                    stream = file.createReadStream()
                    ffmpeg(stream)
                    .videoCodec('libx264')
                    .audioCodec('aac')
                    .output(res)
                    .output('./video/' + film + '_s' + season + '_e' + episode + '.mp4')
                    .outputFormat('mp4')
                    .outputOptions('-movflags frag_keyframe+empty_moov')
                    .on('error', function(err) {
                        console.log('An error occurred: ' + err.message);
                    })
                    .on('progress', function(progress) {
                        console.log('Processing: ' + progress.targetSize + 'kb done');
                      })
                    .on('end', function() {
                        console.log('Processing finished !');
                    })
                    .addOutputOption('-acodec')
                    .run()


Sorry if i'm not really clear, ask me some questions if you need more informations :)

Thanks for your help, bye :)

aagrios
  • 87
  • 1
  • 8

1 Answers1

0

Mp4s can’t be streamed like that. You must wait until the file is complete before streaming. If you want to trans code on the fly, use a format that can support that, like hls.

szatmary
  • 29,969
  • 8
  • 44
  • 57