AWS elastic transcoder — вывод Gif является массовым

#amazon-web-services #aws-lambda

#amazon-веб-сервисы #aws-lambda

Вопрос:

Итак, я играю с Elastic transcoder, чтобы преобразовать загруженное видео из моей корзины S3 в GIF.

На данный момент, когда я загружаю на S3, у меня есть базовый лямбда-код, который запускает конвейер для преобразования в gif.

Теперь, что здесь происходит, я загружаю 7 МБ mp4, и когда он перекодирован, выходной GIF составляет более 80 МБ??

Я просмотрел документы и не могу найти ничего, что помогло бы мне. Кто-нибудь может пролить свет…

Ниже приведены мои предварительные настройки в elastic transcoding

 Codec -- gif

Codec Options:

LoopCount: 5

Bit Rate -- auto
Frame Rate -- auto
Video Max Frame Rate -- 10
Max Width -- auto
Max Height -- auto
Sizing Policy -- ShrinkToFit
Padding Policy -- NoPad
Display Aspect Ratio -- auto
  

Любой мой lamdba выглядит так:

 'use strict';
var AWS = require('aws-sdk'),
    transcoder = new AWS.ElasticTranscoder({
        apiVersion: '2012-09-25',
        region: 'eu-west-1'
    });
exports.handler = (event, context, callback) => {
    let fileName = event.Records[0].s3.object.key;
    var srcKey =  decodeURIComponent(event.Records[0].s3.object.key.replace(/ /g, " "));
    var newKey = fileName.split('.')[0];
    console.log('New video has been uploaded:', fileName);
transcoder.createJob({
     PipelineId: process.env.PIPELINE_ID,
     Input: {
      Key: srcKey,
      FrameRate: 'auto',
      Resolution: 'auto',
      AspectRatio: 'auto',
      Interlaced: 'auto',
      Container: 'auto'
     },
     Output: {
      Key: getOutputName(fileName),
      ThumbnailPattern: '',
      PresetId: 'XXXXXXXXXXX',
      Rotate: 'auto'
     }
    }, function(err, data){
        if(err){
            console.log('Something went wrong:',err)
        }else{
            console.log('Converting is done');
        }
     callback(err, data);
    });
};
function getOutputName(srcKey){
 let baseName = srcKey.replace('videos/','');
 let withOutExtension = removeExtension(baseName);
 return 'gifs/'   withOutExtension   '.gif';
}
function removeExtension(srcKey){
    let lastDotPosition = srcKey.lastIndexOf(".");
    if (lastDotPosition === -1) return srcKey;
    else return srcKey.substr(0, lastDotPosition);
}
  

Ответ №1:

Здесь нет абсолютно никакой ошибки, GIF-файлы БОЛЬШИЕ.

10-секундный mp4 со скоростью 24 кадра в секунду при разрешении 1024×768 и цветовом пространстве в 3 байта (по 1 для каждого красного, зеленого и синего) содержит 540 МБ данных.

Сжатие видео ПОТРЯСАЮЩЕЕ, и оно действительно может сжать его во что-то маленькое, но GIF-файлы, как известно, неэффективны при выполнении того же самого. Кроме того, их качество ужасное. Для получения дополнительной информации об этом, пожалуйста, ознакомьтесь с этим удивительным ответом: https://superuser.com/questions/53600/jpeg-vs-png-vs-bmp-vs-gif-vs-svg

Для решения вашей проблемы: используйте WebP

Он поддерживается повсеместно, намного эффективнее и выглядит намного лучше.

Кроме того, будьте осторожны с расходами на хостинг в AWS, поскольку только ввод данных бесплатный, передача данных может стать очень дорогой!

Комментарии:

1. Спасибо за ваш ответ.

2. Итак, во-первых, вы правы, теперь еще одна вещь, которую мне нужно было сделать, это также установить предустановленные значения в лямбде (то есть не только в предустановке конвейера). Я все же проверю WebP!