我正在处理一个将音频文件发送到由sails.js驱动的服务器的应用程序。
我需要即时转换此音频文件,并使用节点流将转换后的数据发送到Amazon S3。
我不想将数据存储在服务器上,但是将上传文件转换后直接将其流式传输到S3。
你知道这样做的方法吗?
我尝试使用强大的功能,但无法正常工作。有人成功实现了这样的事情吗?
谢谢
编辑
正如jibsales所注意到的,如果我向您展示到目前为止我尝试过的内容,可能会更好。因此,基本上我的策略是对流使用强大,流畅的ffmpeg和knox。
我计划接收具有强大功能的文件流,并将接收到的数据块写入第一流(流1),这将是使用fluent-ffmpeg进行转换的入口。然后fluent-ffmpeg将输出流写入到stream2中,该流是Knox的入口点。
我要面对的第一个问题是,强大的功能似乎并没有发挥作用。但是我不确定我的策略是否正确...
到目前为止的代码如下所示:
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);
});
},
我想出了一种使用fluent-ffmpeg和强大工具即时转换文件的方法。但是,暂时无法将来自ffmpeg转换的转换后的数据块直接流式传输到亚马逊,因为您必须精确调整转换期间未知的“ Content-Length”标头...
对于第一部分(客户端上传),我首先必须在config / express.js文件的上传路由中禁用express bodyParser:
var express = require('sails/node_modules/express');
module.exports.express = {
bodyParser: function() {
return function (req, res, next){
console.log(req.path);
if (!(req.path === '/upload' && req.method === 'POST')) {
return express.bodyParser()(req, res, next);
} else {
return next();
}
}
}
}
对于实现,我使用了基本上不执行任何操作的转换流。它只是获取上传数据的正确部分(与文件数据相关的部分)。它将强大的解析器链接到fluent-ffmpeg。然后,我只能将转换后的文件保存到磁盘上,然后再将其发送到亚马逊...
upload : function(req,res){
var Transform = Stream.Transform; //stream for the incoming file data
var client = knox.createClient({
key: 'KEY'
, secret: 'SECRET'
, bucket: 'BUCKET',
region : 'eu-west-1' //don't forget the region (My bucket is in Europe)
});
function InputStream(options)
{
if(!(this instanceof InputStream))
{
return new InputStream(options);
}
Transform.call(this,options);
return;
};
util.inherits(InputStream, Transform);
var inputDataStream = new InputStream;
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files)
{
if(err){
return res.send(err);
}else{
return;
}
});
form.onPart = function(part)
{
if (!part.filename)
{
form.handlePart(part);
return;
}
//we put the data chunk in stream1 to convert it
part.on('data', function (chunk)
{
if(!inputDataStream.write(chunk));
form.pause()
inputDataStream.once('drain', function(){form.resume()});
});
part.on('end', function (chunk){
inputDataStream.end(chunk);
});
}
InputStream.prototype._transform = function (chunk, enc, cb)
{
this.push(chunk);
cb();
}
var proc = new ffmpeg({ source : inputDataStream})
.withAudioBitrate('64k')
.withAudioCodec('libmp3lame')
.toFormat('mp3')
.saveToFile('file.mp3', function (retcode, error){
console.log('file has been converted successfully');
res.send('ok');
var upload = new MultiPartUpload(
{
client : client,
objectName: 'file.mp3',
file: 'file.mp3'
}, function(err,body){
if(err) {
console.log(err);
return;
}
console.log(body);
return;
});
});
},
编辑
实际上,使用knox-mpu可以直接将数据流传输到Amazon s3!您只需要创建另一个转换流,它将成为您上传的源,而knox-mpu就是魔术。谢谢大家!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句