我正在尝试让 ffmpeg 在 AWS Lambda 中读取和写入 S3。我浏览了数十篇 AWS 文档、stackoverflow 问题和博客文章。所有人的做法都略有不同,但最终没有一个对我有用。所以我希望在这里找到帮助:) 我坚持使用 InPlainEnglish 的教程:https://plainenglish.io/community/automated-video-processing-with-aws-lambda-and-ffmpeg-2834b7
ffprobe 命令确实有效,因此 ffmpeg 是可调用的。但是当在 child_process.spawn 命令中调用 ffmpeg 时,我收到错误
Failed to resolve hostname my-bucket.s3.eu-central-1.amazonaws.com: System error
export const handler = async (event) => {
const s3 = new S3Client({});
const bucket = event.Records[0].s3.bucket.name;
const sourceKey = event.Records[0].s3.object.key;
const sourceURL = await getSignedUrl(s3, new GetObjectCommand({
Bucket: bucket,
Key: sourceKey,
}), {
expiresIn: 900,
});
const tmpFilePath = 'tmp/video.mp4';
const { convertOut } = await commander(`/opt/ffmpeg -i "${sourceURL}" -vf scale=1080:-2,format=yuv420p ${tmpFilePath}`);
return {
statusCode: 200,
body: {
result: JSON.stringify(convertOut),
},
};
};
签名的网址没问题。我用 vanilla js
await fetch(sourceURL)
测试了它,它返回了文件。问题是由于某种原因 child_process 无法访问互联网。
如果有人能够指出我正确的方向,我将不胜感激:D
完整错误消息:
{
"errorType": "Error",
"errorMessage": "Command failed: /opt/ffmpeg -i \"https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject\" -vf scale=1080:-2,crop=1080:1350,format=yuv420p tmp/video.mp4\nffmpeg version 6.1-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2023 the FFmpeg developers\n built with gcc 8 (Debian 8.3.0-6)\n configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzimg\n libavutil 58. 29.100 / 58. 29.100\n libavcodec 60. 31.102 / 60. 31.102\n libavformat 60. 16.100 / 60. 16.100\n libavdevice 60. 3.100 / 60. 3.100\n libavfilter 9. 12.100 / 9. 12.100\n libswscale 7. 5.100 / 7. 5.100\n libswresample 4. 12.100 / 4. 12.100\n libpostproc 57. 3.100 / 57. 3.100\n[tcp @ 0x141950d0] Failed to resolve hostname my-bucket.s3.eu-central-1.amazonaws.com: System error\n[in#0 @ 0x14190900] Error opening input: Input/output error\nError opening input file https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject.\nError opening input files: Input/output error\n",
"trace": [
"Error: Command failed: /opt/ffmpeg -i \"https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject\" -vf scale=1080:-2,crop=1080:1350,format=yuv420p tmp/video.mp4",
"ffmpeg version 6.1-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2023 the FFmpeg developers",
" built with gcc 8 (Debian 8.3.0-6)",
" configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzimg",
" libavutil 58. 29.100 / 58. 29.100",
" libavcodec 60. 31.102 / 60. 31.102",
" libavformat 60. 16.100 / 60. 16.100",
" libavdevice 60. 3.100 / 60. 3.100",
" libavfilter 9. 12.100 / 9. 12.100",
" libswscale 7. 5.100 / 7. 5.100",
" libswresample 4. 12.100 / 4. 12.100",
" libpostproc 57. 3.100 / 57. 3.100",
"[tcp @ 0x141950d0] Failed to resolve hostname my-bucket.s3.eu-central-1.amazonaws.com: System error",
"[in#0 @ 0x14190900] Error opening input: Input/output error",
"Error opening input file https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject.",
"Error opening input files: Input/output error",
"",
" at ChildProcess.exithandler (node:child_process:422:12)",
" at ChildProcess.emit (node:events:518:28)",
" at maybeClose (node:internal/child_process:1105:16)",
" at ChildProcess._handle.onexit (node:internal/child_process:305:5)"
]
}
enter code here
更新:事实证明这不是S3或互联网,而是child_process似乎无法访问互联网。我已经更新了上面的描述。
我无法对你的问题发表评论,所以我写一个答案。
我遇到了与你描述的完全相同的问题,只是使用Python而不是JS。使用视频 url 调用 ffmpeg 时,
FFmpeg
无法解析主机名。 John Van Sickle 的 FFmpeg 静态链接版本会出现这种情况,请参阅 自述文件。
正如自述文件中建议的那样,我尝试安装
nscd
。这解决了在本地测试容器但未在 AWS Lambda 上测试容器时的问题。
以下选项对我有用:从 URL 下载视频并将其保存到临时文件。然后,在临时本地文件上运行 ffmpeg。
如果它对您有帮助或者您以其他方式解决了问题,请告诉我。