How to read remote video on Amazon S3 using ffmpeg

2020-02-17 03:59发布

问题:

I need to create poster frames from videos hosted on Amazon S3 via ffmpeg.

So is there a way to use the remote video file directly in ffmpeg command line like this:
ffmpeg -i "http://bucket.s3.amazonaws.com/video.mp4" -ss 00:00:10 -vframes 1 -f image2 "image%03d.jpg"

ffmpeg just returns:
http://bucket.s3.amazonaws.com/video.mp4: I/O error occurred
Usually that means that input file is truncated and/or corrupted.

I also tried forcing ffmpeg to use the videos mp4 container for reading:
ffmpeg -f mp4 -i "http://bucket.s3.amazonaws.com/video.mp4" ...
But no luck.

Wget this video from S3 and processing it locally works fine of course,
as well as reading the file remotely from other 'standard' http servers.
So I know that ffmpeg supports remote file reading, but why not on S3?

回答1:

Nevermind, I found an easy way to solve my problem.

I set up an amazon cloudfront download distribution pointing to my S3 bucket.
Via cloudfront the files are accessible with ffmpeg over http:

ffmpeg -i "http://subdomain.cloudfront.net/video.mp4" -ss 00:00:10 -vframes 1 -f image2 "image%03d.jpg"

And the data transfer is even cheaper! But still wondering why this won't work with S3 directly...



回答2:

In my case, reading directly form S3 bucket work like a charm. To be more specific, my S3 object has private permission so I'm passing a Signed-URL to ffmpeg.

I use ruby and AWSRubySDK to generate a Signed-URL. http://docs.amazonwebservices.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method

Check your S3 object's permission.



回答3:

For everyone who came here looking how to do this with S3 only, The AWS SDK can now generate presigned urls.

ffprobe -i "$(aws s3 presign s3://MY_BUCKET/MY_FILE --expires 5)"