2014-03-04 109 views
2

我無法通過stdout管道輸出ffmpeg。使用nodejs管道輸出ffmpeg stdout

以下是我編碼到目前爲止的代碼塊。

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命令正常工作。我已經通過命令行測試了它並生成了正確的輸出。

回答

2

您必須通過pipe:1告訴FFmpeg將輸出寫入標準輸出。下面是我的一個項目採取了一個例子:

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

+0

非常感謝。在添加'pipe:1'後,它現在以webm文件格式工作。您是否有任何想法來控制youtube中的帶寬? – rughimire

+0

我用一個循環緩衝區來控制帶寬。你可以在我的github回購中看到代碼。 –

+4

我得到'無法爲管道找到合適的輸出格式:1'' – jpillora