使用Node.js的标准输出流(stdout)管道输出FFmpeg

5

我无法将ffmpeg的输出通过标准输出流进行传输。

以下是我目前编写的代码块。

    var http = require('http')
    , fs = require('fs') 
    var child_process = require("child_process")

    http.createServer(function (req, res) {
    console.log("Request:", dump_req(req) , "\n")

    // path of the 
    var path = 'test-mp4.mp4'  //test-mp4-long.mp4
    , stat = fs.statSync(path)
    , total = stat.size


    var range = req.headers.range
    , parts = range.replace(/bytes=/, "").split("-")
    , partialstart = parts[0]
    , partialend = parts[1]
    , start = parseInt(partialstart, 10)
    , end = partialend ? parseInt(partialend, 10) : total-1
    , chunksize = (end-start)+1


    console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize +  "\n")


    var ffmpeg = child_process.spawn("ffmpeg",[
            "-i", path,             // path
            "-b:v" , "64k",         // bitrate to 64k
            "-bufsize", "64k", 
            "-"                     // Output to STDOUT
        ]);


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

    stdout[ params[1] ] = ffmpeg.stdout

    // Pipe the video output to the client response
    ffmpeg.stdout.pipe(res);

    console.log("Response", dump_res(res), "\n")
    }).listen(1337)

当我用上面的代码替换ffmpeg部分后,所有内容都正常工作。下面是当我替换ffmpeg部分时的代码片段。

 var file = fs.createReadStream(path, {start: start, end: end})

并且像管道一样:

file.pipe(res)

我运行错了什么?

编辑: ffmpeg命令正常工作。我已经通过命令行测试并生成了正确的输出。


如果有人尝试直接使用这个脚本,那么它缺少一部分:res.on("close", () => { ffmpeg.kill(); });否则,当关闭选项卡/浏览器窗口时,ffmpeg进程会在后台继续运行。 - Ciantic
1个回答

7

非常感谢。在添加'pipe:1'后,现在可以使用webm文件格式了。您有没有想过像YouTube一样控制带宽的方法? - rughimire
我使用了一个循环缓冲区来控制带宽。你可以在我的 GitHub 仓库中看到代码。 - Laurent Perrin
5
我收到了 无法找到适合'pipe:1'的输出格式 的信息。 - jpillora
@jpillora 尝试添加类似 -f mp3 的内容来强制指定输出格式 - ahmet alp balkan
2
应该是 -progress pipe:1,否则你会得到 @jpillora 提到的东西。 - Luke

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