2016-03-17 46 views
4

我想编写一个响应S3事件处理程序来处理上传到mp4的所有avi文件。我在Eclipse中使用AWS工具箱插件在Java中执行此操作。对于视频转换,我使用了ffmpeg和ffmpeg-cli-wrapper,并且我在源码树中提供了一个ffmpeg的静态(linux)二进制文件。尝试使用ffmpeg时AWS Lambda权限被拒绝

我发现,当我上传的功能,二进制放在/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"; 
    } 
} 

并且stacktrace的第一行:java.io.IOException: Cannot run program "/var/task/ffmpeg": error=13, Permission denied

如何执行这个二进制文件?我已经按照其他人的建议和chmod 755完成了上传之前的二进制文件,但它没有任何区别。

回答

5

AWS Lambda在Amazon Linux上运行。这是一个已知的问题。尝试构建(启用静态)并检查它是否适用于Amazon Linux并上传该二进制文件。您无权chmod/var/task/中的文件。或者尝试这种解决方案的工作原理:

  • 移动ffmpeg/tmp
  • chmod 755 /tmp/ffmpeg
  • 呼叫/tmp/ffmpeg

更多信息请参阅本discussion

+0

如何移动文件?是我能从命令行执行一次的事情,还是我需要在方法开始时的代码中执行此操作?该方法的开始处为 – moarCoffee

+0

。如果'mv'失败,请尝试'cp'。它一直为我工作。 – helloV

+0

对不起,没有回复你。我用'ProcessBuilder'来完成,就像你说的那样,它一切正常。谢谢您的帮助! – moarCoffee

0

正如helloV提到的,您可能需要包含一个静态ffmpeg二进制文件并将其复制到一个位置并从那里执行。 详细答案(node.js代码)here

+0

是的,我使用了[本站]的二进制文件(http://johnvansickle.com/ffmpeg/) – moarCoffee