Pipe output of ffmpeg using nodejs stdout

15,945

You have to pass pipe:1 to tell FFmpeg to write output to stdout. Here's an example taken from one of my projects:

 var ffmpeg = spawn(argv.ffmpeg, [
    '-i', argv.file,
    '-f', 's16le', // PCM 16bits, little-endian
    '-ar', '44100', // Sampling rate
    '-ac', 2, // Stereo
    'pipe:1' // Output on stdout
  ]);

https://github.com/lperrin/node_airtunes/blob/master/examples/play_ffmpeg.js

Share:
15,945
rughimire
Author by

rughimire

Computer Engineer, Software Developer, .NET Developer, Android App Developer

Updated on August 21, 2022

Comments

  • rughimire
    rughimire over 1 year

    I am not being able to pipe the output of the ffmpeg over a stdout.

    Following are the block of code what I coded so far.

        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)
    

    When i replaced the ffmpeg stuffs from above code, all works fine. Following is the part of the code when i replace the ffmpeg stuffs.

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

    And piping like:

    file.pipe(res)
    

    What wrong I am running?

    Edit: The ffmpeg command works fine. I have tested this through the command line and generating proper output.

  • rughimire
    rughimire about 10 years
    Thanks a lot. it s now working in webm file format after adding 'pipe:1'. Did you have any idea to control the bandwidth like in youtube?
  • Laurent Perrin
    Laurent Perrin about 10 years
    I used a circular buffer to control the bandwidth. You can see the code in my github repo.
  • jpillora
    jpillora almost 9 years
    I get Unable to find a suitable output format for 'pipe:1'
  • ahmet alp balkan
    ahmet alp balkan about 8 years
    @jpillora try adding something like -f mp3 to force the output format
  • Luke
    Luke almost 3 years
    It should be -progress pipe:1 or you will get what @jpillora mentioned