我需要通过ffmpeg在Amazon S3上托管的视频中创建海报帧。
有没有办法直接在ffmpeg命令行中使用远程视频文件,如下所示:
ffmpeg -i "http://bucket.s3.amazonaws.com/video.mp4" -ss 00:00:10 -vframes 1 -f image2 "image%03d.jpg"
ffmpeg只返回:
http://bucket.s3.amazonaws.com/video.mp4: I/O error occurred
Usually that means that input file is truncated and/or corrupted.
我还尝试强制ffmpeg使用视频mp4容器进行阅读:
ffmpeg -f mp4 -i "http://bucket.s3.amazonaws.com/video.mp4" ...
但没有运气。
从S3获取此视频并在本地处理它当然可以正常工作,
以及从其他“标准”http服务器远程读取文件
所以我知道ffmpeg支持远程文件读取,但为什么不在S3?
答案 0 :(得分:30)
没关系,我找到了解决问题的简单方法。
我设置了指向我的S3存储桶的亚马逊云端下载分发版 通过cloudfront,可以通过http:
使用ffmpeg访问这些文件 ffmpeg -i "http://subdomain.cloudfront.net/video.mp4" -ss 00:00:10 -vframes 1 -f image2 "image%03d.jpg"
数据传输甚至更便宜! 但仍然想知道为什么这不能直接与S3一起工作......
答案 1 :(得分:9)
在我的情况下,直接从S3桶中读取就像魅力一样。 更具体地说,我的S3对象具有私有权限,因此我将一个签名URL传递给ffmpeg。
我使用ruby和AWSRubySDK生成签名URL。 http://docs.amazonwebservices.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method
检查S3对象的权限。
答案 2 :(得分:1)
对于来到这里只是想使用S3做到这一点的每个人,AWS开发工具包现在都可以生成预签名的URL。
ffprobe -i "$(aws s3 presign s3://MY_BUCKET/MY_FILE --expires 5)"