Use the Serverless Devs tool to quickly deploy applications based on Function Compute, Object Storage Service (OSS), and FFmpeg. This lets you perform audio and video processing operations, such as retrieving audio and video information, adding watermarks, and converting formats.
Background information
FFmpeg is an open source computer program that provides a complete solution for recording, converting, and streaming audio and video. It is licensed under the LGPL or GPL and includes the advanced audio and video codec library libavcodec, which ensures high portability and codec quality. For more information, see FFmpeg.
The examples in this topic use Python. The sample template includes the following features. You can also modify the sample function code for custom development.
Example name | Description |
GetMediaMeta | Gets the metadata of an audio or video file. |
GetDuration | Gets the duration of an audio or video file. |
GetSprites | Creates a sprite from a video. |
VideoWatermark | Adds a text watermark, a static image watermark, or a dynamic GIF watermark. |
AudioConvert | Converts the format of an audio or video file. |
VideoGif | Extracts a GIF from a video file. |
Prerequisites
You have completed the following operations:
Use Serverless Devs to deploy the application
Run the following command to initialize the project.
sudo s init ffmpeg-app-v3 -d ffmpeg-app-v3-dspecifies the name of the directory to be created.Run the following command to navigate to the project directory.
cd ffmpeg-app-v3Optional: Modify the code samples in the project directory to implement your business logic.
Run the following command to deploy the project.
sudo s deploy -yNoteTo deploy only a specific feature in the project, such as the GetMediaMeta feature for retrieving audio and video metadata, run the following command:
sudo s GetMediaMeta deployWhen you deploy other features, replace
GetMediaMetawith the name of the feature.The following is a sample output after deployment.
Downloading[/v3/packages/fc3/zipball/0.0.47]... Download fc3 successfully Steps for [deploy] of [ffmpeg-app] ==================== Downloading[/v3/packages/fc3-domain/zipball/0.0.23]... Download fc3-domain successfully TIPS: You can use "s info" get more detail ✔ [AudioConvert] completed (2.19s) ✔ [GetMediaMeta] completed (0.85s) ✔ [GetDuration] completed (0.78s) ✔ [VideoGif] completed (0.77s) ✔ [GetSprites] completed (0.71s) ✔ [VideoWatermark] completed (0.82s) Result for [deploy] of [ffmpeg-app] ==================== AudioConvert: region: cn-hangzhou description: Audio format converter functionArn: acs:fc:cn-hangzhou:************0898:functions/AudioConvert-**** functionName: AudioConvert-**** handler: index.handler internetAccess: true memorySize: 1024 role: acs:ram::************0898:role/aliyunfcdefaultrole runtime: python3.9 timeout: 900 __component: fc3 GetMediaMeta: region: cn-hangzhou description: Get audio and video metadata functionArn: acs:fc:cn-hangzhou:************0898:functions/GetMediaMeta-**** functionName: GetMediaMeta-**** handler: index.handler internetAccess: true memorySize: 1024 role: acs:ram::************0898:role/aliyunfcdefaultrole runtime: python3.9 timeout: 900 __component: fc3 GetDuration: region: cn-hangzhou description: Get audio and video duration functionArn: acs:fc:cn-hangzhou:************0898:functions/GetDuration-**** functionName: GetDuration-**** handler: index.handler internetAccess: true memorySize: 1024 role: acs:ram::************0898:role/aliyunfcdefaultrole runtime: python3.9 timeout: 900 __component: fc3 VideoGif: region: cn-hangzhou description: A powerful function to extract a GIF from a video functionArn: acs:fc:cn-hangzhou:************0898:functions/VideoGif-**** functionName: VideoGif-**** handler: index.handler internetAccess: true memorySize: 1024 role: acs:ram::************0898:role/aliyunfcdefaultrole runtime: python3.9 timeout: 900 __component: fc3 GetSprites: region: cn-hangzhou description: A powerful function to create a sprite functionArn: acs:fc:cn-hangzhou:************0898:functions/GetSprites-**** functionName: GetSprites-**** handler: index.handler internetAccess: true memorySize: 1024 role: acs:ram::************0898:role/aliyunfcdefaultrole runtime: python3.9 timeout: 900 __component: fc3 VideoWatermark: region: cn-hangzhou description: A powerful feature to add a watermark to a video functionArn: acs:fc:cn-hangzhou:************0898:functions/VideoWatermark-**** functionName: VideoWatermark-**** handler: index.handler internetAccess: true memorySize: 1024 role: acs:ram::************0898:role/aliyunfcdefaultrole runtime: python3.9 timeout: 900 __component: fc3Invoke the sample functions.
Invoke the GetMediaMeta function to retrieve audio and video metadata
The following sample command shows how to invoke the GetMediaMeta function.
sudo s GetMediaMeta invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4"}'Parameter description:
bucket_name: The name of the bucket.object_key: The name of the file whose metadata you want to retrieve.
Sample output:
Steps for [invoke] of [ffmpeg-app] ==================== ========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: 1-67051746-15265ec4-4fa70b****** 2024-10-08T11:28:07.836Z 1-67051746-15265ec4-4fa70b****** [INFO] current Function [handler] excute time is 0.46 seconds FC Invoke End RequestId: 1-67051746-15265ec4-4fa70b****** Duration: 891.57 ms, Billed Duration: 892 ms, Memory Size: 1024 MB, Max Memory Used: 60.01 MB ========= FC invoke Logs end ========= Invoke instanceId: c-67051746-152fc2e0-b08240****** Code Checksum: 3393206491906161454 Qualifier: LATEST RequestId: 1-67051746-15265ec4-4fa70b****** Invoke Result: { "format": { "bit_rate": "17024829", "duration": "110.037333", "filename": "http://test-bucket.oss-cn-hangzhou-internal.aliyuncs.com/a.mp4......", "format_long_name": "QuickTime / MOV", "format_name": "mov,mp4,m4a,3gp,3g2,mj2", "nb_programs": 0, "nb_streams": 2, "probe_score": 100, "size": "234170850", "start_time": "0.000000", "tags": { "compatible_brands": "mp42mp41", "creation_time": "2020-09-05T06:03:49.000000Z", "major_brand": "mp42", "minor_version": "0" } }, "streams": [ { "avg_frame_rate": "25/1", "bit_rate": "16708594", "bits_per_raw_sample": "8", "chroma_location": "left", "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10", "codec_name": "h264", "codec_tag": "0x31637661", "codec_tag_string": "avc1", "codec_time_base": "1/50", "codec_type": "video", "coded_height": 1088, "coded_width": 1920, "color_primaries": "bt709", "color_range": "tv", "color_space": "bt709", "color_transfer": "bt709", "disposition": { "attached_pic": 0, "clean_effects": 0, "comment": 0, "default": 1, "dub": 0, "forced": 0, "hearing_impaired": 0, "karaoke": 0, "lyrics": 0, "original": 0, "timed_thumbnails": 0, "visual_impaired": 0 }, "duration": "110.000000", "duration_ts": 2750000, "has_b_frames": 1, "height": 1080, "index": 0, "is_avc": "true", "level": 41, "nal_length_size": "4", "nb_frames": "2750", "pix_fmt": "yuv420p", "profile": "Main", "r_frame_rate": "25/1", "refs": 1, "start_pts": 0, "start_time": "0.000000", "tags": { "creation_time": "2020-09-05T06:03:49.000000Z", "encoder": "AVC Coding", "handler_name": "\u001fMainconcept Video Media Handler", "language": "eng" }, "time_base": "1/25000", "width": 1920 }, { "avg_frame_rate": "0/0", "bit_rate": "317375", "bits_per_sample": 0, "channel_layout": "stereo", "channels": 2, "codec_long_name": "AAC (Advanced Audio Coding)", "codec_name": "aac", "codec_tag": "0x6134706d", "codec_tag_string": "mp4a", "codec_time_base": "1/48000", "codec_type": "audio", "disposition": { "attached_pic": 0, "clean_effects": 0, "comment": 0, "default": 1, "dub": 0, "forced": 0, "hearing_impaired": 0, "karaoke": 0, "lyrics": 0, "original": 0, "timed_thumbnails": 0, "visual_impaired": 0 }, "duration": "110.000000", "duration_ts": 5280000, "index": 1, "max_bit_rate": "417750", "nb_frames": "5158", "profile": "LC", "r_frame_rate": "0/0", "sample_fmt": "fltp", "sample_rate": "48000", "start_pts": 0, "start_time": "0.000000", "tags": { "creation_time": "2020-09-05T06:03:49.000000Z", "handler_name": "#Mainconcept MP4 Sound Media Handler", "language": "eng" }, "time_base": "1/48000" } ] } End of method: invokeInvoke the GetDuration function to retrieve the duration of an audio or video file
The following sample command shows how to invoke the GetDuration function.
sudo s GetDuration invoke -e '{"bucket_name": "bucket-name","object_key": "a.mp4"}'Parameter description:
bucket_name: The name of the bucket.object_key: The name of the file whose duration you want to retrieve.
Sample output:
Steps for [invoke] of [ffmpeg-app] ==================== ========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: 1-67051470-15a07456-27998a****** 2024-10-08T11:16:03.069Z 1-67051470-15a07456-27998a****** [INFO] current Function [handler] excute time is 0.46 seconds FC Invoke End RequestId: 1-67051470-15a07456-27998a****** Duration: 866.68 ms, Billed Duration: 867 ms, Memory Size: 1024 MB, Max Memory Used: 60.00 MB ========= FC invoke Logs end ========= Invoke instanceId: c-67051470-152fc2e0-782287****** Code Checksum: 6541531297040229118 Qualifier: LATEST RequestId: 1-67051470-15a07456-27998a****** Invoke Result: 18.416667 [GetDuration] completed (2.67s)Invoke the GetSprites function to create a sprite from a video
The following sample command shows how to invoke the GetSprites function.
sudo s GetSprites invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "tile": "3*4"}'Parameter description:
bucket_name: The name of the bucket.object_key: The name of the file from which you want to create a sprite.output_dir: The directory in the bucket for storing the transcoded video.tile: The rows and columns of the sprite.(Optional)
start: The time at which to start creating the sprite. The default value is 0.(Optional)
duration: The duration of the video segment to capture, starting from thestarttime. For example, if you setstartto 10 anddurationto 20, the video from 10s to 30s is captured.(Optional)
itsoffset: The stream offset, which specifies a delay. The default value is 0. This parameter must be used with thestartandintervalparameters. The following are examples:If
startis 0,intervalis 10, anditsoffsetis 0, screenshots are taken at 5s, 15s, 25s, and so on.If
startis 0,intervalis 10, anditsoffsetis 1, then the timestamps for the screenshots are 4, 14, 24, and so on.If
startis 0,intervalis 10, anditsoffsetis -1, screenshots are taken at 6s, 16s, 26s, and so on.If
startis 0,intervalis 10, anditsoffsetis 4.999, the screenshot timestamps are 0, 10, 20, and so on.
NoteIf you set this parameter to 5, the image at 0s is lost. To avoid this, set the parameter to 4.999.
(Optional)
scale: The size of the screenshot. The default value is -1:-1.(Optional)
interval: The interval in seconds at which to take screenshots. The default value is 1.(Optional)
padding: The space between images. The default value is 0.(Optional)
color: The background color of the sprite. The default color is black.(Optional)
dst_type: The image format of the generated sprite. The default value is JPG. Valid values are JPG and PNG.
Sample output:
Steps for [invoke] of [ffmpeg-app] ==================== ========= FC invoke Logs begin ========= yuvj420p(pc), 11520x8640, q=2-31, 200 kb/s, 0.08 fps, 0.08 tbn, 0.08 tbc (default)\n Metadata:\n creation_time : 2024-10-08T06:45:29.000000Z\n handler_name : Core Media Video\n encoder : Lavc58.54.100 mjpeg\n Side data:\n cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1\nframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=1.21x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=1.15x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed= 1.1x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=1.05x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=1.01x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.966x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.923x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.887x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.855x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.822x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.794x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.768x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.736x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.714x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.693x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.673x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.652x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.634x \rframe= 1 fps=0.1 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.615x \rframe= 1 fps=0.0 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.597x \rframe= 1 fps=0.0 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.582x \rframe= 1 fps=0.0 q=21.1 size=N/A time=00:00:12.00 bitrate=N/A speed=0.566x \r[mjpeg @ 0x464b0c0] get_buffer() failed\n[mjpeg @ 0x464b0c0] thread_get_buffer() failed\n[mjpeg @ 0x464b0c0] get_buffer() failed (-12 (nil))\nVideo encoding failed\nConversion failed!\n" 2024-10-08T11:16:59.390Z 1-67051494-15cef74d-1880b1****** [ERROR] stdout:b'' 2024-10-08T11:16:59.540Z 1-67051494-15cef74d-1880b1****** [INFO] Uploaded /tmp/screen.record1.jpg to output/screen.record1.jpg 2024-10-08T11:16:59.540Z 1-67051494-15cef74d-1880b1****** [INFO] current Function [handler] excute time is 22.28 seconds FC Invoke End RequestId: 1-67051494-15cef74d-1880b1****** Duration: 22703.61 ms, Billed Duration: 22704 ms, Memory Size: 1024 MB, Max Memory Used: 926.45 MB ========= FC invoke Logs end ========= Invoke instanceId: c-67051494-152fc2e0-aecae7****** Code Checksum: 3870681690589467457 Qualifier: LATEST RequestId: 1-67051494-15cef74d-1880b1****** Invoke Result: ok [GetSprites] completed (23.38s)Invoke the VideoWatermark function to add a watermark to a video
The following sample command shows how to invoke the VideoWatermark function.
sudo s VideoWatermark invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "vf_args" : "drawtext=fontfile=/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc:text='hello Function Compute':x=100:y=50:fontsize=24:fontcolor=red"}'Parameters:
bucket_name: The name of the bucket.object_key: The name of the file to be watermarked.output_dir: The directory in the bucket where the transcoded video is stored.vf_args: Specifies a text watermark or a static image watermark.filter_complex_args: Specifies a dynamic image watermark. If you set this parameter and thevf_argsparameter at the same time, the value ofvf_argsis ignored.
Sample output:
Steps for [invoke] of [ffmpeg-app] ========= FC invoke Logs begin ========= static-master/target/lib ...... ...... FC Invoke End RequestId: 31ecddfa-4e41-44bb-9489-00708b07**** Duration: 3740.74 ms, Billed Duration: 3741 ms, Memory Size: 1024 MB, Max Memory Used: 979.74 MB ========= FC invoke Logs end ========= Invoke instanceId: c-67051514-152fc2e0-7ca0b5****** Code Checksum: 15811305094477563349 Qualifier: LATEST RequestId: 1-67051514-15f4ad6f-b9e770****** Invoke Result: ok [VideoWatermark] completed (7.04s)Invoke the AudioConvert function to convert an audio format
The following sample command shows how to invoke the AudioConvert function. Modify the parameters as needed.
sudo s AudioConvert invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "dst_type":".wav", "ac":"1", "ar":"4000"}'Metric description:
bucket_name: The name of the bucket.object_key: The name of the file whose audio format you want to convert.output_dir: The storage path for the transcoded video in the bucket.dst_type: The format of the output file.(Optional)
ac: Specifies the number of sound channels.(Optional)
ar: Specifies the sample rate.
Sample output:
Steps for [invoke] of [ffmpeg-app] ========= FC invoke Logs begin ========= ...... 2024-10-08T11:19:14.345Z 1-67051531-1540ac27-5efd5d****** [INFO] current Function [handler] excute time is 0.39 seconds FC Invoke End RequestId: 1-67051531-1540ac27-5efd5d****** Duration: 1156.09 ms, Billed Duration: 1157 ms, Memory Size: 256 MB, Max Memory Used: 88.23 MB ========= FC invoke Logs end ========= FC Invoke Result: ok End of method: invokeInvoke the VideoGif function to extract a GIF from a video
The following sample command shows how to invoke the VideoGif function. You can modify the parameters as needed.
sudo s VideoGif invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "vframes": "5", "start": "0", "duration": "2"}'Parameters:
bucket_name: The name of the bucket.object_key: The name of the file that you want to convert to the GIF format.output_dir: The storage path in Object Storage Service for the transcoded video.(Optional)
vframes: The number of video frames to transform, starting at the time specified by thestartparameter.(Optional)
start: The start time for the conversion. The default value is 0.(Optional)
duration: The duration of the video to be transformed, starting at the time specified by thestartparameter.
NoteIf you set both the
durationandvframesparameters, thedurationparameter takes precedence. If you do not set either of these parameters, the entire video is converted to the GIF format by default.Sample output:
Steps for [invoke] of [ffmpeg-app] ========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: 1-6705158b-15aae364-e8b091****** 2024-10-08T11:20:48.472Z 1-6705158b-15aae364-e8b091****** [INFO] b'{"bucket_name": "csy-test-bucket-hangzhou","object_key": "screen.record.mov", "output_dir" : "output/", "vframes": "5", "start": "0", "duration": "2"}' 2024-10-08T11:20:48.553Z 1-6705158b-15aae364-e8b091****** [INFO] cmd = ffmpeg -y -ss 0 -t 2 -accurate_seek -i http://csy-test-bucket-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/screen.record.mov?security-token=CAISzgJ1q6Ft5B2yfSjIr5bgJd%2BBj5FX%2FbSlR3HinW8hR95tobDlkzz2IHhMe3JhAuwdtPw0lG1Y5vgYlqZdVplOWU3Da%2BB364xK7Q75%2FH00TwPvv9I%2Bk5SANTW5KXyShb3%2FAYjQSNfaZY3eCTTtnTNyxr3XbCirW0ffX7SClZ9gaKZ8PGD6F00kYu1bPQx%2FssQXGGLMPPK2SH7Qj3HXEVBjt3gX6wo9y9zmmZfDs0CA1AenkLVN99WhGPX%2BMZkwZqUYesyuwel7epDG1CNt8BVQ%2FM909vccoWic74rBWAMJuEXbY7qKqMcUJQt4d7U8FaVIofb1iPlkoOvXmpRJRpfKsXy0OM62ZvdDoKOscIvBXr6y5QAursKXmZkJus1AV6%2Fw%2FbD%2FoDkLGrxvYzY7alc3aVrxMYzcwxvBAWzIcMvovuxIl%2FQ8oTrmlUSOVA3RK93xGoABgSZSgv9GieOwVAhZcBP%2Ff6NCPBIJkOXSUDRUiIqoLG0NMAEvGz1kHRhxkSShhCrHGqFD1OXkwdmwzOtcE8s%2F3VP6%2Fw4t6kj0pFtSkl7HWbvyI1Pdxd%2Fs6GLV8xnoIoSQAAOTNjIHUHVx22GPGGDGmMcsAphusXkjHmB5KAldSL0gAA%3D%3D&OSSAccessKeyId=STS.NUUne5bNvJvNEWSyotKQANuNq&Expires=1728390048&Signature=AWhsgR2D3xRMFZZ35PKpUVPwjH4%3D -pix_fmt rgb24 /tmp/screen.record.gif 2024-10-08T11:21:01.793Z 1-6705158b-15aae364-e8b091****** [INFO] Uploaded /tmp/screen.record.gif to output/screen.record.gif 2024-10-08T11:21:01.796Z 1-6705158b-15aae364-e8b091****** [INFO] current Function [handler] excute time is 13.32 seconds FC Invoke End RequestId: 1-6705158b-15aae364-e8b091****** Duration: 13803.77 ms, Billed Duration: 13804 ms, Memory Size: 1024 MB, Max Memory Used: 414.34 MB ========= FC invoke Logs end ========= Invoke instanceId: c-6705158b-152fc2e0-5ca045****** Code Checksum: 5414709321074418652 Qualifier: LATEST RequestId: 1-6705158b-15aae364-e8b091****** Invoke Result: ok [VideoGif] completed (18.86s)
References
For accelerated transcoding of large videos or multiple complex operations, you can use a serverless workflow to orchestrate functions and build a video processing system. For more information, see Build an elastic and highly available audio and video processing system based on a serverless architecture.
For real-time or near-real-time audio and video processing, you can deploy applications on GPU-accelerated instances. For more information, see Best practices for audio and video processing.