coolps811
coolps811

Reputation: 323

How to stream a presigned video from an AWS S3 bucket?

When generating a presigned video URL from AWS S3 bucket the video will download in mp4 format if I use the URL in the web browser , however, it will not stream if I put it in the src attribute of a video tag. Below is an example of what the presigned url looks like. How can I use this url to stream?

<video width="320" height="240" controls preload="auto">
  <source src="https://s3.eu-north-1.amazonaws.com/daycare.videos/iland-guard/yamit/2020-12-09/cam_0/20201209_043123.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6OHOPCC5DWJXXO7O%2F20210309%2Feu-north-1%2Fs3%2Faws4_request&X-Amz-Date=20210309T075948Z&X-Amz-Expires=900&X-Amz-Signature=1cfb2dc7658b90714cd5b52b157f3caf878be6504a4d5f9d1a1be76a599abae8&X-Amz-SignedHeaders=host" type="video/mp4">
</video>

Upvotes: 2

Views: 7547

Answers (3)

Dhanushka Dayawansha
Dhanushka Dayawansha

Reputation: 356

Do the following things:

  1. Go to S3 console and select your file.
  2. Go to Action , after that click Edit metadata and type the Metadata value as video/mp4 and save changes and go back.
  3. Go to Action after that click Share with a presigned URL and create Presinged URL.

or if you use NodeJs

const s3 = new AWS.S3({
        accessKeyId: xxx,
        secretAccessKey: xxx,
        region: xxx,
        signatureVersion: xxx,
        Expires: 120,
      });

      const params = {
        Key: xxx,
        Bucket: xxx,
        ResponseContentType: `video/mp4`,
      };
      const url = await new Promise((resolve, reject) => {
        s3.getSignedUrl('getObject', params, (err, url) => {
          err ? reject(err) : resolve(url);
        });
      });

This is work for me

Upvotes: 0

FAB
FAB

Reputation: 1

I replicated above, using the Node library. The code seems to work fine. The key thing to make sure is whether the presigned URL works when placed in your browser. The SDK generates a URL regardless of whether the file exists or not, so make sure the presigned URL is actually functioning.

The format of my presigned URL matches that of yours:

<video width="320" height="240" controls preload="auto">
    <source src="https://bucket.s3.ca-central-1.amazonaws.com/Glass%20one/2e71b368-1d22-4c56-a690-b534eea3def8.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAQOTARPS7GGSVO5F7%2F20210915%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210915T223104Z&X-Amz-Expires=3600&X-Amz-Signature=f61fc82b7ebd55ea83290587786d61fe41cb6137624d243bf36c46257ef2aab6&X-Amz-SignedHeaders=host&x-id=GetObject" type="video/mp4">
  </video>

Upvotes: 0

John Rotenstein
John Rotenstein

Reputation: 270224

To test this, I did the following:

  • Put an .mp4 file in an Amazon S3 bucket (no Bucket Policy, no ACL)
  • Generated a pre-signed url using the AWS CLI aws s3 presign command
  • Tested the pre-signed URL by pasting it into a browser Address Bar -- it worked
  • Substituted the pre-signed URL in your code (above) -- it worked

I did have a strange problem with a space in the filename -- I had to quote the path for the AWS CLI to include the raw space rather than using a + to represent the space.

The pre-signed URL that was generated looked like this:

https://bucketname.s3.amazonaws.com/A2%20File.mp4?AWSAccessKeyId=AKIAxxx&Signature=xxx&Expires=1615413373

I see that it uses a different format to the one presented in your question.

Upvotes: 3

Related Questions