ffmpeg nodejs lambda裁剪问题



我有一个lambda函数,可以用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

我真的不知道哪个版本,但应该是最近的,因为我今天做了最后一次

然后,我的nodejs lambda函数与以下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

下面是经过轻微修改的代码:

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)并检查日志以查看用于验证它的确切命令;(

最新更新