使用iojs express和fluent-ffmpeg

时间:2015-05-08 17:53:43

标签: node.js express ffmpeg io.js

我正在尝试创建一个简单的io.js,它将读取一个opus文件,将其转换为mp3,然后使用express将其传递给网页。这是我到目前为止所尝试的:

var express = require('express');
var ffmpeg = require('fluent-ffmpeg');
var app = express();
var fs = require('fs');

app.get ('/ffmpegTest', function(req,res) {
      var stream = fs.createWriteStream('tester.mp3'); 
      ffmpeg('./tester.opus')
         .audioCodec('libmp3lame')
         .output(stream, {end:true})
            // tested to make sure it worked .saveToFile('./testerTEST.mp3')
          .on('error', function(err) {
              console.log('Processing error! ' + err);
          })  ;
 });

 var server = app.listen(3000, function() {
    var host = server.address().address;
    var port = server.address().port;
    console.log('Example app listening at http://%s:%s', host, port);
 });

我也从网站示例中尝试了这个(这只是猜测)

var command = ffmpeg('./tester.opus')
    .audioCodec('libmp3lame')
    .on('error', function(err) {
         console.log('Processing error! ' + err);
    })  ;
 var ffstream = command.pipe();
 ffstream.on('data', function(chunk) {
    console.log('ffmpeg just wrote ' + chunk.length + ' bytes');
 });

这两个例子都给了我" ffmpeg退出代码1"。当我尝试使用" saveToFile"并编写一个测试mp3文件,它工作正常。

有更简单或更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这是一个基于user33946建议的工作解决方案(如下)。如果可能的话,我宁愿使用像fluent-ffmpeg这样的东西。

var childProcess = require('child_process');
var express = require('express');
var fs = require('fs');
var path = require('path');

'use strict;'

var app = express();


app.get ('/ffmpegTest/:formatType/', function(req, res) {
    var formatType   = req.params.formatType    ;
    var inputFile    = req.query.inputFile    ;

    console.log('formatType = ' + formatType);
    console.log('inputFile = ' + inputFile);

    var cmd = '/usr/local/bin/ffmpeg'
        + ' -i '
        + inputFile
        + ' -f '
        + formatType
        + ( formatType == 'mp3' ?  ' -codec:a libmp3lame ' : '' )
        + ' -;'
        ;

    var result = childProcess.exec
        (    cmd
        ,    { 'encoding'  : 'binary
             , 'maxBuffer' : 1024 * 500
             }
        ,    function (error, stdout, stderr) {
                if  (error) {
                    console.log(error.stack);
                    console.log('Child Process STDERR: ' + stderr);
                    console.log('Error code: ' + error.code);
                    console.log('Signal received: ' + error.signal);
                } else {
                    res.setHeader
                        ( 'Content-Disposition'
                        ,    'attachment; filename='
                            + path.basename(inputFile, path.extname(inputFile))
                            + '.'
                            + formatType
                        );
                    res.setHeader('Content-Type', 'audio/' + formatType );
                    res.setHeader('Content-Length', stdout.length );
                    res.end(new Buffer(stdout, 'binary'));
                    console.log('result length: ' + stdout.length);
                }
            }
        );

    result.on('exit', function (code) {
        console.log('Child process exited with exit code ' + code );
    });
});

var server = app.listen(3000, function() {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});