将FFmpeg输出直接上传到Amazon S3

13

我正在使用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”属性中?
更新:
这是我正在尝试做的修改:
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。流畅的ffmpeg是否支持此场景?

1个回答

6
你似乎没有保存转码的输出结果。
  1. 使用output将转码后的新 .flv 文件保存到本地文件系统。
  2. 根据 putObject文档提供你的新文件内容给putObject。其中Body参数接受以下数据类型:

    Body — (BufferTyped ArrayBlobStringReadableStream) 对象数据。

这是修订后的示例代码:
// 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,但这会使逻辑和错误处理变得复杂。

3
有没有一种方法可以暂时将数据写入内存缓冲区,然后将该缓冲区作为请求的Body参数发送? - user1790300
3
有没有办法避免暂时将文件写入文件系统? - user1790300
请点击此处查看上传至S3的策略,无需本地编写。https://dev59.com/5uk5XIcBkEYKwwoY593M#54837065 - mabead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接