NodeJS 视频流动态转码

Posted

技术标签:

【中文标题】NodeJS 视频流动态转码【英文标题】:NodeJS video streaming transcode on the fly 【发布时间】:2018-11-13 00:14:31 【问题描述】:

我正在构建一个 nodejs 应用程序,它将视频从磁盘流式传输到用户。感谢this 问题,我有一个工作视频供稿,用于存储在磁盘上的“静态”视频文件,到目前为止一切顺利。

我的问题是我需要即时转码视频,为此我使用了 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)
        )
    )

【问题讨论】:

我不相信你可以在这里使用output,你需要使用pipe。请参阅此 SO 线程 ***.com/questions/49483191/… 此外,http 响应包含 Content-RangeContent-Length 标头,其中包含有关 原始 视频大小的信息,而不是转码的视频,这可能会有很大不同.在动态转码时,如果您无法提前可靠地确定它们,则可能根本不应该设置它们。 【参考方案1】:

最终,我找到的最佳解决方案是使用更“流媒体友好”的格式,因此我切换到 HLS,现在一切都变得更简单并且工作正常:)

【讨论】:

你的意思是从客户端?【参考方案2】:

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

改用.stream().pipe(res, end: true)

【讨论】:

以上是关于NodeJS 视频流动态转码的主要内容,如果未能解决你的问题,请参考以下文章

avi格式的视频能转码成gif文件吗?

java 用ffmpeg和mencoder进行视频转码

【FFMPEG做视频转码】

视频流异步转码和实时流式转码是什么意思?有什么区别?

不用转码工具 直接上传视频 后台自动转码系统

视频转码: linux下用mplayer做视频转码