node.js - 使用 iojs express 和 fluent-ffmpeg

标签 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 exited with code 1”。当我尝试使用“saveToFile”并编写一个测试 mp3 文件时,它工作正常。

有没有更简单或更好的方法来做到这一点?

最佳答案

这是一个基于 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);
});

关于node.js - 使用 iojs express 和 fluent-ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129935/

相关文章:

node.js - AWS Lambda 使用触发器创建函数

javascript - 如何将字符串转换为 Typescript 中的枚举

ffmpeg - 如何在 ffmpeg h264 编码器中启用去 block 过滤器

node.js - 如何识别osx上USB设备的 "path"并从 Node createReadStream其数据?

javascript - 我可以通过路由/中间件提醒用户吗?

node.js - Access-Control-Allow-Headers 不允许请求 header 字段进行身份验证

javascript - 试图弄清楚如何绕过 Promise : Pending situation

video - ffmpeg:找不到合适的输出格式,libfaac

php - 上传时ffmpeg水印视频

Node.js Express、handlebars - 获取数组的元素