NodeJS视频流实时转码

11

我正在构建一个使用Node.js的应用程序,该应用程序将从磁盘向用户流式传输视频。感谢这个问题,我已经成功地为“静态”视频文件创建了工作视频源,存储在磁盘上,目前一切正常。

我的问题是,我需要动态转码视频,为此我使用了fluent-ffmpeg,并成功实现了转码,但HTML5播放器只显示视频的前3-4秒,然后停止。我猜测问题可能是文件大小,但即使我硬编码它也没有改变。

有任何想法吗?非常感谢 :)

var file = 'Big_Buck_Bunny_1080p_surround_FrostWire.com.mp4';
    fs.stat(file, function(err, stats) {
        var range = req.headers.range
        if (!range) { // 416 Wrong range
            return res.sendStatus(416)
        }
        var positions = range.replace(/bytes=/, "").split("-");
        var start = parseInt(positions[0], 10);
        var total = stats.size;
        var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
        var chunksize = (end - start) + 1;

        res.writeHead(206, {
            "Content-Range": "bytes " + start + "-" + end + "/" + total,
            "Accept-Ranges": "bytes",
            "Content-Length": chunksize,
            "Content-Type": "video/mp4"
        })

        var stream = fs.createReadStream(file, { start: start, end: end, autoclose: true })
        .on("open", function() {
            const ffmpegCommand = ffmpeg()
                .input(stream)
                .outputFormat('mp4')
                .outputOptions([ '-movflags faststart', '-frag_size 4096', '-cpu-used 2', '-deadline realtime', '-threads 4' ])
                .videoBitrate(640, true)
                .audioBitrate(128)
                .audioCodec('aac')
                .videoCodec('libx264')
                .output(res)
                .run()
        }).on("error", function(err) {
            res.end(err)
        })
    })

1
我不相信你可以在这里使用 output,你需要使用一个 pipe。请参考这个 SO 线程 https://dev59.com/Qarka4cB1Zd3GeqPYRnB#50016463 - Tarun Lalwani
另外,HTTP响应包含Content-RangeContent-Length头部信息,其中包括有关原始视频大小的信息,而不是转码后的视频大小,后者可能会有显著差异。在动态转码时,如果无法事先可靠地确定它们,则可能根本不应设置这些内容。 - Robert Rossmann
2个回答

0

我认为你应该放弃 .output(res) .run()

而使用 .stream().pipe(res, { end: true}) 代替


0

最终,我找到的最佳解决方案是使用更“流媒体友好”的格式,因此我转向了HLS,现在一切都更简单,并且运行良好:)


你的意思是从客户端吗? - Godfather

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接