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

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)

Ere*_*eli 6

您可以通过将其分为两个步骤来实现您想要的:

在 s3 上操作文件

由于 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 文件

由于 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)