【问题标题】:Upload FFmpeg output directly to Amazon S3将 FFmpeg 输出直接上传到 Amazon S3
【发布时间】:2017-10-26 23:50:54
【问题描述】:

我正在使用带有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);
            });

        });

对于上面的代码,我在哪里可以得到转码流以添加到 params 对象的“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。 fluent-ffmpeg 会允许这种情况吗?

【问题讨论】:

    标签: video amazon-s3 ffmpeg transcoding


    【解决方案1】:

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

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

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

    【讨论】:

    • 有没有办法暂时写入内存缓冲区,然后在 Body 参数中发送缓冲区?
    • 有没有办法避免临时将文件写入文件系统?
    • 查看此处了解上传到 s3 而不在本地写入的策略。 stackoverflow.com/a/54837065/2679757
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多