我正在开发一个将音频文件发送到由sails.js 提供支持的服务器的应用程序。
我需要即时转换此音频文件并使用节点流将转换后的数据发送到亚马逊 S3。
我不想将数据存储在服务器上,而是在转换后直接将上传文件流式传输到 S3。
你知道这样做的方法吗?
我尝试使用强大的,但我无法让它工作。有没有人成功实施这样的事情?
谢谢
编辑
正如 jibsales 注意到的那样,如果我向您展示我迄今为止尝试过的部分内容可能会更好。所以基本上我的策略是使用强大的 fluent-ffmpeg 和 knox 与流。
我计划接收具有强大功能的文件流,并在第一个流(流 1)中写入接收到的数据块,这将是使用 fluent-ffmpeg 进行转换的入口点。然后 fluent-ffmpeg 将输出流写入到作为 Knox 的入口点的 stream2 中。
我必须面对的第一个问题是,强大的似乎不起作用。但是我不确定我的策略是否好...
到目前为止的代码如下所示:
upload : function(req,res){
//to streams to transfer file data
var stream1 = new stream.Stream(); //stream for the incoming file data
var stream2 = new stream.Stream(); //stream for the converted file data
var client = knox.createClient({
key: 'APIKEY'
, secret: 'SECRET'
, bucket: 'bucket'
});
//Using formidable to acces data chunks
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files){ //form.parse is not called
if(err){
return res.json(err);
}else{
return res.send('ok');
}
});
//overriding form.onPart to get the file data chunk
form.onPart = function(part) {
sails.log('getting part...');
if (!part.filename) {
form.handlePart(part);
return;
}
//we put the data chunk in stream1 to convert it
part.on('data', function(chunk) {
stream1.write(chunk[1]);
});
}
form.on('error',function(err){
return sails.log(err);
});
form.on('progress', function(bytesReceived, bytesExpected) {
sails.log(bytesReceived);
});
//conversion process
var proc = new ffmpeg({ source : stream1})
.withAudioCodec('libfdk_aac')
.toFormat('mp3')
.writeToStream(stream2, {end:true}, function(retcode, error){
console.log('file has been converted succesfully');
});
client.putStream(stream2, '/file.mp3', headers, function(err, response){
return res.send(response);
});
},