⚠️ This repository is now archived. Please see the Quipt mediaHandler for a current implementation. ⚠️
An AWS Lambda function that resizes videos and outputs thumbnails using FFmpeg. This function is meant for short-duration videos. If you need to transcode long videos, check out AWS Elastic Transcoder.
git clone ...
npm install
See config_samples.
At minimum, you need to modify:
functionBucket
- The name of the bucket where your the lambda function code will be uploaded to. It's necessary for CloudFormation.sourceBucket
- The name of the bucket that will receive the videos and send them to the lambda for processing.destinationBucket
- The name of the bucket that will be used to store the output video and thumbnail image.npm test
event/{platform}.json
and run node test/{platform}.js
, where platform is (aws|msa|gcp)+
so be aware of this and handle errors appropriately. If you try to download the file with the AWS SDK for JavaScript like in this example, without handling this, it will throw an error.context.fail(error)
will cause the function to run until the timeout is reached.# Environment variables
export AWS_ACCESS_KEY_ID=AKIDEXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY
export AWS_REGION=us-east-1
# Note that the following variable is single-quote escaped. Use $KEY_PREFIX to get the filename minus the extension.
export FFMPEG_ARGS=$'-c:a copy -vf scale=\'min(320\\,iw):-2\' -movflags +faststart -metadata description=http://my.site/$KEY_PREFIX.mp4 out.mp4 -vf thumbnail -vf scale=\'min(320\\,iw):-2\' -vframes 1 out.png'
export MIME_TYPES='{"png":"image/png","mp4":"video/mp4"}'
export VIDEO_MAX_DURATION='30'
# Node version
nvm use 14 # This is subject to change
# Babel-node test script
node node_modules/babel-cli/bin/babel-node.js test/aws.js
aws:create-cfn-bucket
Creates the CloudFormation for your CloudFormation template and Lambda function code. Run this once. Set the CFN_S3_BUCKET
environment variable to the name of the bucket you want to create.
CFN_S3_BUCKET=cloudformation-bucket gulp aws:create-cfn-bucket
The following environment variables must be set prior to using the rest of the gulp commands
export CFN_S3_BUCKET=cloudformation-bucket
export SOURCE_BUCKET=source-bucket
export DESTINATION_BUCKET=destination-bucket
# Note that the following variable is single-quote escaped. Use $KEY_PREFIX to get the filename minus the extension.
export FFMPEG_ARGS=$'-c:a copy -vf scale=\'min(320\\,iw):-2\' -movflags +faststart -metadata description=http://my.site/$KEY_PREFIX.mp4 out.mp4 -vf thumbnail -vf scale=\'min(320\\,iw):-2\' -vframes 1 out.png'
export MIME_TYPES='{"png":"image/png","mp4":"video/mp4"}' # must be a JSON object with "extension": "mimeType" as the key/value pairs
export VIDEO_MAX_DURATION='30' # must be a number
aws:default
Everything you need to get started. Note: You can change the stack name by setting environment variable STACK_NAME
.
aws:build-upload
taskaws:deployStack
taskaws:build-upload
dist.zip
dist.zip
to the function's S3 bucketaws:deployStack
aws:update
Run after modifying anything in the function or configuration, if you've already created the stack. This will rebuild dist.zip
, upload it to S3, and update the lambda function created during the CloudFormation stack creation.
See the quickstart guide.
Note: you must have the gcloud CLI tool installed.
gcp:default
build/
directorynpm install
on the server-side, so there is no need to build a zip file.# Environment variables
export GCLOUD_PROJECT=example-project-name
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json
export CONFIG_FILE=../config/gcp.json
# Node version
nvm use 6.9.1 # This is subject to change
# Babel-node test script
node node_modules/babel-cli/bin/babel-node.js --presets es2015 test/gcp.js
See Azure functions reference.
# Environment variables
export AZURE_STORAGE_CONNECTION_STRING=... # copy from azure console
export CONFIG_FILE=../config/msa.json
# Node version
nvm use 5.9.1 # This is subject to change
# Babel-node test script
node node_modules/babel-cli/bin/babel-node.js --presets es2015-node5 test/aws.js
Submit issues if you find bugs or something is unclear. Pull requests are even better, especially if you can make something more generalized.
If you use it, :star: it!