我想串联在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();
您可以通过将其分为两个步骤来实现所需的目标:
由于s3是远程文件存储,因此您无法在s3服务器上运行代码以在本地执行操作(如@Andrey所述)。您在代码中需要做的是获取每个输入文件,在本地处理它们并将结果上传回s3。从Amazon检出代码示例:
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);
在此阶段,您将运行串联代码,并将结果上传回:
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) });
由于MP3文件包含指定某些信息(例如比特率)的标头,因此将它们简单地串联在一起可能会带来播放问题。参见:https : //stackoverflow.com/a/5364985/1265980
您想要使用什么工具。您可以采用一种方法将输入的mp3文件保存在tmp文件夹中,并执行外部程序,例如更改比特率,合并文件并修复标头。或者,您可以使用一个库,该库允许您在node.js中使用ffmpeg。
在显示的代码示例中,您可以看到它们如何在节点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');
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句