我想编写一个响应S3 put事件的处理程序来转换任何上传到mp4的avi文件。我在Java中使用AWS工具包插件在Eclipse中完成它。对于视频转换,我使用ffmpeg和ffmpeg-cli-wrapper,我在源代码树中提供了ffmpeg的静态(linux)二进制文件。
我发现当我上传函数时,二进制文件放在/var/task
中,但是当我尝试使用我编写的测试函数时,我收到“权限被拒绝”错误。
import net.bramp.ffmpeg.FFmpeg;
public class LambdaFunctionHandler implements RequestHandler<S3Event, String> {
private static final String FFMPEG = "/var/task/ffmpeg";
public String handleRequest(S3Event event, Context context) {
try {
FFmpeg ff = new FFmpeg(FFMPEG);
System.out.println(ff.version());
} catch (Exception e) {
e.printStackTrace();
}
return "foo";
}
}
而堆栈跟踪的第一行:java.io.IOException: Cannot run program "/var/task/ffmpeg": error=13, Permission denied
。
我该如何执行这个二进制文件?我已经完成了其他人的建议和chmod 755
上传之前的二进制文件,但它没有什么区别。
AWS Lambda在Amazon Linux上运行。这是一个众所周知的问题。尝试构建(启用静态)并检查它是否适用于Amazon Linux并上传该二进制文件。您没有chmod
中/var/task/
文件的权限。或尝试这个有效的解决方案:
ffmpeg
移动到/tmp
chmod 755 /tmp/ffmpeg
/tmp/ffmpeg
有关更多信息,请参阅此discussion。
正如helloV所提到的,您可能必须包含静态ffmpeg二进制文件并将其复制到某个位置并从那里执行。一个详细的答案,(node.js代码)给出here