As you initially alluded to, your current approach is a viable option however there are bandwidth and bitrate considerations to keep in mind.
One potential caveat / 'gottcha' as well is that you may have to set the content type and disposition to "video/webm" and "inline" in order for the webm. file to be playable within the browser.
Working with object metadata : https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html
With that said, based on your use case, you may want to consider implementing an on-the-fly video conversion workflow.
The example blogpost below details a serverless workflow for on-the-fly video conversion; From MP4 video source files stored in an Amazon S3 bucket to HTTP Live Streaming (HLS) served through Amazon CloudFront. The workflow uses Lambda@Edge function to invoke an AWS Elemental MediaConvert job.
On-the-fly video conversion with Amazon CloudFront, Lambda@Edge, and AWS Elemental MediaConvert : https://aws.amazon.com/blogs/networking-and-content-delivery/on-the-fly-video-conversion-amazon-cloudfront-lambdaedge-mediaconvert/
Points 5 - 8 are likely of more interest to you:
- MediaConvert receives the conversion job request, and attempts to fetch the mp4 video source from the media source S3 bucket.
- MediaConvert begins to generate an HLS manifest and segments. It stores them in the HLS Stream S3 bucket, and continues to update the manifest until the conversion process is complete.
- While MediaConvert initiates the conversion job, Lambda@Edge function generates an HLS manifest pointing to an intro video segment, and return it immediately.
- CloudFront forwards the intro manifest back to the end user for playback.