将FFmpeg输出直接上传到Amazon S3

时间:2017-10-10 16:57:26

标签: video amazon-s3 ffmpeg transcoding

我正在使用带有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会允许这种情况吗?

1 个答案:

答案 0 :(得分:4)

您似乎没有在任何地方保存转码的输出。

  1. 使用output将转码(您的新.flv文件)的输出保存到本地文件系统。
  2. 将新文件的内容提供给putObject。根据{{​​3}},Body参数接受:

      

    Body - (BufferTyped ArrayBlobStringReadableStream)对象数据。

  3. 以下是一些经过修改的示例代码:

    // 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,但这会使逻辑和错误处理变得复杂。