gho*_*... 13 amazon-s3 amazon-web-services node.js express
我想连接在Amazon S3服务器上上传的文件.我怎样才能做到这一点.
在本地机器上连接我可以使用以下代码.
var fs = require('fs'),
files = fs.readdirSync('./files'),
clips = [],
stream,
currentfile,
dhh = fs.createWriteStream('./concatfile.mp3');
files.forEach(function (file) {
clips.push(file.substring(0, 6));
});
function main() {
if (!clips.length) {
dhh.end("Done");
return;
}
currentfile = './files/' + clips.shift() + '.mp3';
stream = fs.createReadStream(currentfile);
stream.pipe(dhh, {end: false});
stream.on("end", function() {
main();
});
}
main();Run Code Online (Sandbox Code Playgroud)
您可以通过将其分为两个步骤来实现您想要的:
由于 s3 是远程文件存储,因此您无法在 s3 服务器上运行代码以在本地执行操作(如@Andrey 所述)。您需要在代码中做的是获取每个输入文件,在本地处理它们并将结果上传回 s3。查看亚马逊的代码示例:
var s3 = new AWS.S3();
var params = {Bucket: 'myBucket', Key: 'mp3-input1.mp3'};
var file = require('fs').createWriteStream('/path/to/input.mp3');
s3.getObject(params).createReadStream().pipe(file);
Run Code Online (Sandbox Code Playgroud)
在这个阶段,您将运行您的串联代码,并将结果上传回来:
var fs = require('fs');
var zlib = require('zlib');
var body = fs.createReadStream('bigfile.mp3').pipe(zlib.createGzip());
var s3obj = new AWS.S3({params: {Bucket: 'myBucket', Key: 'myKey'}});
s3obj.upload({Body: body}).
on('httpUploadProgress', function(evt) { console.log(evt); }).
send(function(err, data) { console.log(err, data) });
Run Code Online (Sandbox Code Playgroud)
由于 MP3 文件包含指定比特率等一些信息的标头,因此简单地将它们连接在一起可能会导致播放问题。参见:https : //stackoverflow.com/a/5364985/1265980
你想用什么工具来表示。您可以使用一种方法将输入的 mp3 文件保存在 tmp 文件夹中,并执行外部程序,例如更改比特率、连接文件和修复标题。或者,您可以使用允许您在 node.js 中使用ffmpeg的库。
在他们显示的代码示例中,您可以看到他们如何在 node api 中将两个文件合并在一起。
ffmpeg('/path/to/part1.avi')
.input('/path/to/part2.avi')
.input('/path/to/part2.avi')
.on('error', function(err) {
console.log('An error occurred: ' + err.message);
})
.on('end', function() {
console.log('Merging finished !');
})
.mergeToFile('/path/to/merged.avi', '/path/to/tempDir');
Run Code Online (Sandbox Code Playgroud)