我正在使用带有node.js的fluent-ffmpeg库将最初采用flash电影格式的视频转码为具有多种分辨率,1080p等的mp3格式。一旦转码完成,我想移动转码视频到s3桶。
我从源s3存储桶中提取原始的.flv文件,并将该流传递给ffmpeg构造函数。问题是转码完成后,我如何获取要发送到s3的mp4数据流。
这是我到目前为止的代码:
var params = {
Bucket: process.env.SOURCE_BUCKET,
Key: fileName
};
s3.getObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
var format = ffmpeg(data)
.size('854x480')
.videoCodec('libx264')
.format('flv')
.toFormat('mp4');
.on('end', function () {
//Ideally, I would like to do the uploading here
var params = {
Body: //{This is my confusion, how do I get the stream to add here?},
Bucket: process.env.TRANSCODED_BUCKET,
Key: fileName
};
s3.putObject(params, function (err, data) {
});
})
.on('error', function (err) {
console.log('an error happened: ' + err.message);
});
});
对于上面的代码,我在哪里可以将转码后的流添加到" Body" params对象的属性?
更新:
以下是我要做的修订:
var outputStream: MemoryStream = new MemoryStream();
var proc = ffmpeg(currentStream)
.size('1920x1080')
.videoCodec('libx264')
.format('avi')
.toFormat('mp4')
.output(outputStream)
// setup event handlers
.on('end', function () {
uploadFile(outputStream, "").then(function(){
resolve();
})
})
.on('error', function (err) {
console.log('an error happened: ' + err.message);
});
我想避免将文件从s3复制到本地文件系统,而是我希望在内存中处理该文件并在完成后上传回s3。 fluent-ffmpeg会允许这种情况吗?
答案 0 :(得分:4)
您似乎没有在任何地方保存转码的输出。
output
将转码(您的新.flv
文件)的输出保存到本地文件系统。将新文件的内容提供给putObject
。根据{{3}},Body
参数接受:
Body
- (Buffer
,Typed Array
,Blob
,String
,ReadableStream
)对象数据。
以下是一些经过修改的示例代码:
// Generate a filename for the `.flv` version
var flvFileName = fileName.substring(0, fileName.length - path.extname(fileName).length) + '.flv';
// Perform transcoding, save new video to new file name
var format = ffmpeg(data)
.size('854x480')
.videoCodec('libx264')
.format('flv')
.toFormat('mp4');
.output(flvFileName)
.on('end', function () {
// Provide `ReadableStream` of new video as `Body` for `pubObject`
var params = {
Body: fs.createReadStream(flvFileName)
Bucket: process.env.TRANSCODED_BUCKET,
Key: flvFileName
};
s3.putObject(params, function (err, data) {
});
})
注意:如果您愿意,您可以从fluent-ffmpeg
创建输出流并将该流上传到AWS S3,但这会使逻辑和错误处理变得复杂。