【问题标题】:ffmpeg nodejs lambda crop issueffmpeg nodejs lambda裁剪问题
【发布时间】:2020-11-03 20:42:40
【问题描述】:

我有一个 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

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

然后我的 node js 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

【问题讨论】:

  • 所以看起来您将无效参数传递给 .videoFilters。您检查失败时的宽度、高度、x 和 y 值了吗?拒绝时传递值。
  • 我不认为这是一个参数问题,这是与具有完全相同参数的其他视频一起使用的
  • 你能把参数crop=${width}:${height}:${x}:${y}放在一个变量中,把它记录下来并粘贴到这里吗?我同意这很可能是这种情况。如果你计算 w/h 和crop 值,那么500.1 可能会给出准确的结果。
  • 尝试使用 ffprobe 找出视频的确切宽度和高度。

标签: node.js ffmpeg aws-lambda


【解决方案1】:

这里是稍微修改的代码:

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

【讨论】:

  • 我认为问题是由于 lambda 上的一些内存问题
  • @Ajouve 你可以检查日志以查看用于验证它的确切命令吗?
  • @Ajouve 然后完成此 QA 会话。其他人会发现这个问题没有正确的答案。
  • 感谢您的帮助,但我对您在 lambda 上的代码有同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2013-03-05
相关资源
最近更新 更多