我正在尝试创建一个简单的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文件,它工作正常。
有更简单或更好的方法吗?
答案 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);
});