亚马逊S3服务器上的Concat MP3 /媒体audio文件

我想连接在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是一个远程文件存储,你不能在s3服务器上运行代码来在本地执行操作(就像@Andrey提到的那样)。 您需要在代码中执行的操作是获取每个input文件,在本地处理它们并将结果上传回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文件

由于MP3文件包含一个指定比特率等信息的头文件,因此将它们连接在一起可能会导致播放问题。 请参阅: https : //stackoverflow.com/a/5364985/1265980

你想用什么工具。 你可以有一种方法,将你的inputmp3文件保存在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'); 

这是我的快速承担下载和处理S3 objects 。 我的例子主要集中在获取数据本地,然后处理它的所有下载。 我build议你使用上面提到的ffmpeg方法之一。

 var RSVP = require('rsvp'); var s3 = new AWS.S3(); var bucket = '<your bucket name>'; var getFile = function(key, filePath) { return new RSVP.Promise(function(resolve, reject) { var file = require('fs').createWriteStream(filePath); if(!file) { reject('unable to open file'); } s3.getObject({ Bucket: bucket, Key: key }).on('httpData', function(chunk) { file.write(chunk); }).on('httpDone', function() { file.end(); resolve(filePath); }); }); }; var tempFiles = ['<local temp filename 1>', '<local temp filename 2>']; var keys = ['<s3 object key 1>', '<s3 object key 2>']; var promises = []; for(var i = 0; i < keys.length; ++i) { var promise = getFile(keys[i], tempFiles[i]); promises.push(promise); } RSVP.all(promises).then(function(data) { //do something with your files }).catch(function(error) { //handle errors });