ffmpeg nodejs проблема с обрезкой лямбда - PullRequest
0 голосов
/ 14 июля 2020

У меня есть лямбда-функция для обрезки видео с помощью ffmpeg

Я устанавливаю слой таким образом

#!/bin/bash
mkdir -p layer
cd layer
rm -rf *
curl -O https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz
tar -xf ffmpeg-git-amd64-static.tar.xz
mv ffmpeg-git-*-amd64-static ffmpeg
rm ffmpeg-git-amd64-static.tar.xz

Я не совсем понимаю, какая версия, но должна быть последней, как я сделал это сегодня в последний раз

Тогда моя node js лямбда-функция работает со следующим модулем nodejs https://github.com/fluent-ffmpeg/node-fluent-ffmpeg

return new Promise((resolve, reject) => {
        ffmpeg(inputFile.name)
            .videoFilters(`crop=${width}:${height}:${x}:${y}`)
            .format('mp4')
            .on('error', reject)
            .on('end', () => resolve(fs.readFileSync(outputFile.name)))
            .save(outputFile.name);

с, например, videoFilters('crop=500:500:20:20')

И у меня следующая ошибка

ffmpeg exited with code 1: Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
Conversion failed!

На моем локальном компьютере я запускаю следующую команду на том же самом изображении

ffmpeg -i in.mp4 -filter:v "crop=500:500:20:20" out.mp4

моя версия ffmpeg 4.2.2, и это отлично работает

У меня нет проблемы со всеми видео, вот одно видео, которое вызывает у меня проблему https://ajouve-util.s3.amazonaws.com/earth.mp4

1 Ответ

0 голосов
/ 29 июля 2020

Вот немного измененный код, который работает:

var ffmpeg = require('fluent-ffmpeg');

var reject = function(something) {
    console.error("got error", something);
}

var resolve = function() {
    console.info("Good, job done. Now read output file");
}

var width = 500;
var height = 500;
var x = 20;
var y = 20;
var filter_string = `crop=${width}:${height}:${x}:${y}`;
console.log("filter_string", filter_string);

var onStart = function(commandLine) {
    console.log('Spawned Ffmpeg with command: ' + commandLine);
}

var command = ffmpeg('earth.mp4')
    .videoFilters(filter_string)
    .format('mp4')
    .on('error', reject)
    .on('end', resolve)
    .on('start', onStart)
    .output('earth_cropped.mp4');

console.log("running..");
command.run();
console.log("Done");

С earth.mp4, загруженным по вашей ссылке в том же каталоге, вывод:

node main.js
filter_string crop=500:500:20:20
running..
Done
Spawned Ffmpeg with command: ffmpeg -i earth.mp4 -y -filter:v crop=500:500:20:20 -f mp4 earth_cropped.mp4
Good, job done. Now read output file

И мы получаем earth_cropped.mp4 файл как и ожидалось.

Держу пари, что ошибка находится во входных параметрах, поэтому добавьте .on('start', onStart) в свой код и проверьте журналы, чтобы увидеть точную команду, используемую для ее проверки;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...