Serverless Devsを使用すると、Function Compute、Object Storage Service (OSS) 、FFmpegなどのサービスと一緒にアプリケーションをデプロイして、オーディオおよびビデオファイルを処理できます。 たとえば、Serverless Devsを使用して、オーディオおよびビデオ情報を照会したり、オーディオおよびビデオファイルに透かしを追加したり、ファイル形式を変換したりできます。
背景
FFmpegは、オーディオおよびビデオファイルの記録、変換、およびストリーミングを可能にする一連のプログラムで構成されるオープンソースのソフトウェアプロジェクトです。 FFmpegは、GNU Lesser General Public License (LGPL) またはGNU General Public License (GPL) の下でライセンスされています。 FFmpegは、オーディオとビデオを録音、変換、ストリーミングするための包括的なソリューションを提供します。 FFmpegは、高度なオーディオおよびビデオコーデックライブラリであるlibavcodecを使用して、エンコードおよびデコードシナリオで高い移植性と品質を確保します。 詳細については、「FFmpeg」をご参照ください。
このトピックでは、オーディオファイルとビデオファイルを処理する際の機能について説明します。 このトピックでは、Python言語を使用します。 次の表に、特定の機能を実装するサンプル関数を示します。 各サンプル関数の関数コードを変更して、ビジネス要件に基づいてセカンダリ開発を実装できます。
サンプル関数 | 説明 |
GetMediaMeta | オーディオまたはビデオファイルのメタデータを照会します。 |
GetDuration | オーディオまたはビデオファイルのデュレーションを照会します。 |
GetSprites | ビデオのイメージスプライトを作成します。 |
VideoWatermark | テキスト透かし、画像透かし、またはアニメーション化されたGIF (Graphics Interchange Format) 透かしをビデオに追加します。 |
AudioConvert | オーディオまたはビデオファイルの形式を変換します。 |
VideoGif | ビデオファイルをGIFファイルに変換します。 |
始める前に
Serverless Devsを使用してアプリケーションをデプロイする
次のコマンドを実行して、管理するプロジェクトを初期化します。
sudo s init ffmpeg-app -d ffmpeg-app
前述のコマンドでは、
は、生成されるディレクトリの名前を指定します。
次のコマンドを実行して、プロジェクトのディレクトリに移動します。
cd ffmpeg-app
(オプション) ビジネス要件に基づいてディレクトリ内のサンプルコードを変更し、ビジネスロジックを実装できます。
次のコマンドを実行して、プロジェクトをデプロイします。
sudo s deploy -y
説明プロジェクトの特定の機能を展開する場合は、対応するコマンドを実行します。 たとえば、GetMediaMeta機能を展開してオーディオまたはビデオファイルのメタデータ情報を照会する場合は、次のコマンドを実行します。
sudo s GetMediaMeta deploy
別の機能をデプロイする場合は、
GetMediaMeta
を別の機能名に置き換えます。コマンド出力
[2021-11-25T17:35:56.524] [INFO ] [S-CLI] - Start ... [2021-11-25T17:35:56.529] [INFO ] [S-CLI] - It is detected that your project has the following projects < AudioConvert,GetMediaMeta,GetDuration,VideoGif,GetSprites,VideoWatermark > to be execute [2021-11-25T17:35:56.530] [INFO ] [S-CLI] - Start executing project AudioConvert [2021-11-25T17:35:57.725] [INFO ] [FC-DEPLOY] - Using region: cn-qingdao [2021-11-25T17:35:57.725] [INFO ] [FC-DEPLOY] - Using access alias: default [2021-11-25T17:35:57.726] [INFO ] [FC-DEPLOY] - Using accessKeyID: LTAI4G4cwJkK4Rza6xd9**** [2021-11-25T17:35:57.726] [INFO ] [FC-DEPLOY] - Using accessKeySecret: eCc0GxSpzfq1DVspnqqd6nmYNN**** Using fc deploy type: sdk, If you want to deploy with pulumi, you can [s cli fc-default set deploy-type pulumi] to switch. ...... There is auto config in the service: FcOssFFmpeg ...... AudioConvert: region: cn-qingdao service: name: FcOssFFmpeg function: name: AudioConvert runtime: python3 handler: index.handler memorySize: 256 timeout: 600 GetMediaMeta: region: cn-qingdao service: name: FcOssFFmpeg function: name: GetMediaMeta runtime: python3 handler: index.handler memorySize: 1024 timeout: 600 GetDuration: region: cn-qingdao service: name: FcOssFFmpeg function: name: GetDuration runtime: python3 handler: index.handler memorySize: 256 timeout: 600 VideoGif: region: cn-qingdao service: name: FcOssFFmpeg function: name: VideoGif runtime: python3 handler: index.handler memorySize: 512 timeout: 600 GetSprites: region: cn-qingdao service: name: FcOssFFmpeg function: name: GetSprites runtime: python3 handler: index.handler memorySize: 512 timeout: 600 VideoWatermark: region: cn-qingdao service: name: FcOssFFmpeg function: name: VideoWatermark runtime: python3 handler: index.handler memorySize: 256 timeout: 600
関数を呼び出します。
GetMediaMeta関数の呼び出しの詳細
GetMediaMeta関数を呼び出してオーディオまたはビデオファイルのメタデータを照会するには、次のコマンドを実行します。 ビジネス要件に基づいて特定のパラメーターの値を置き換えます。
sudo s GetMediaMeta invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4"}'
パラメータ:
bucket_name
: OSSバケットの名前。object_key
: メタデータを照会するオブジェクトの名前。
サンプルコマンド出力:
[2021-11-26T14:19:02.045] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: dda964e0-82b6-452a-b849-6b0b835f**** 2021-11-26T06:19:04.688Z dda964e0-82b6-452a-b849-6b0b835f**** [INFO] current Function [handler] excute time is 0.23 seconds FC Invoke End RequestId: dda964e0-82b6-452a-b849-6b0b835f**** Duration: 1238.78 ms, Billed Duration: 1239 ms, Memory Size: 1024 MB, Max Memory Used: 118.39 MB ========= FC invoke Logs end ========= FC Invoke Result: { "format": { "bit_rate": "17024829", "duration": "110.037333", "filename": "http://test-bucket.oss-cn-qingdao-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: invoke
GetDuration関数の呼び出しの詳細
GetDuration関数を呼び出してオーディオまたはビデオファイルのデュレーションを照会するには、次のコマンドを実行します。 ビジネス要件に基づいて特定のパラメーターの値を置き換えます。
sudo s GetDuration invoke -e '{"bucket_name": "bucket-name","object_key": "a.mp4"}'
パラメータ:
bucket_name
: OSSバケットの名前。object_key
: クエリを実行する期間を持つオブジェクトの名前。
サンプルコマンド出力:
[2021-11-26T14:21:48.877] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: 6bb9ecae-7f53-4efb-afea-7614ef87**** 2021-11-26T06:21:50.273Z 6bb9ecae-7f53-4efb-afea-7614ef87**** [INFO] current Function [handler] excute time is 0.17 seconds FC Invoke End RequestId: 6bb9ecae-7f53-4efb-afea-7614ef87**** Duration: 754.63 ms, Billed Duration: 755 ms, Memory Size: 256 MB, Max Memory Used: 61.21 MB ========= FC invoke Logs end ========= FC Invoke Result: 110.037333 End of method: invoke
GetSprites関数の呼び出しの詳細
GetSprites関数を呼び出してビデオファイルのスプライトを作成するには、次のコマンドを実行します。 ビジネス要件に基づいて特定のパラメーターの値を置き換えます。
sudo s GetSprites invoke -e '{"bucket_name": "test-bucket","object_key": "aclear.mp4", "output_dir" : "output/", "tile": "3*4"}'
パラメータ:
bucket_name
: OSSバケットの名前。object_key
: スプライトの作成に使用するオブジェクトの名前。output_dir
: ファイルをトランスコードした後にビデオファイルを保存するOSSバケットの名前。tile
: スプライトの行と列。(オプション)
start
: スプライトを作成するビデオの開始点。 デフォルト値:0(オプション)
duration
: startパラメーターを指定した後、スプライトを作成するためのビデオクリップの長さ。 たとえば、startパラメーターを10に、durationパラメーターを20に設定した場合、スナップショットはビデオの10〜30秒の間にキャプチャされます。(オプション)
itsoffset
: 表示されるビデオストリームのレイテンシ。 デフォルト値:0 このパラメーターは、startおよびintervalパラメーターと一緒に使用する必要があります。 例:start
パラメーターを0、interval
パラメーターを10、itsoffset
パラメーターを0に設定した場合、スナップショットはビデオの5秒、15秒、25秒にキャプチャされます。start
パラメーターを0に、interval
パラメーターを10に、itsoffset
パラメーターを1に設定した場合、スナップショットはビデオの4秒目、14秒目、24秒目にキャプチャされます。start
パラメーターを0に、interval
パラメーターを10に、itsoffset
パラメーターを-1に設定した場合、スナップショットはビデオの6秒、16秒、26秒にキャプチャされます。start
パラメーターを0に、interval
パラメーターを10に、itsoffset
パラメーターを4.999に設定した場合、スナップショットはビデオの0秒、10秒、20秒にキャプチャされます。
説明itsoffsetパラメーターを5に設定すると、0秒でキャプチャされたスナップショットが失われます。 このパラメーターを4.999に設定することを推奨します。
(オプション)
scale
: キャプチャされたスナップショットのサイズ。 デフォルトでは、キャプチャされたスナップショットのアスペクト比は-1:-1です。(オプション)
interval
: スナップショットがビデオからキャプチャされる間隔。 単位は秒です。 デフォルト値は 1 です。(オプション)
padding
: スナップショット間の距離。 デフォルト値:0(オプション)
color
: スプライトの背景色。 デフォルトでは、背景色は黒です。(オプション)
dst_type
: スプライトの形式。 デフォルト値: JPG。 有効な値: JPGとPNG。
サンプルコマンド出力:
[2021-11-26T16:07:42.585] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: 1b427831-e10f-4c2b-b780-9b504c29aa67 2021-11-26T08:07:44.684Z 1b427831-e10f-4c2b-b780-9b504c29aa67 [INFO] b'{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "dst_type":".wav"}' 2021-11-26T08:07:51.642Z 1b427831-e10f-4c2b-b780-9b504c29aa67 [INFO] Uploaded /tmp/transcoded_a.wav to output/transcoded_a.wav 2021-11-26T08:07:51.642Z 1b427831-e10f-4c2b-b780-9b504c29aa67 [INFO] current Function [handler] excute time is 6.96 seconds FC Invoke End RequestId: 1b427831-e10f-4c2b-b780-9b504c29aa67 Duration: 7876.26 ms, Billed Duration: 7877 ms, Memory Size: 3072 MB, Max Memory Used: 119.06 MB ========= FC invoke Logs end ========= FC Invoke Result: ok End of method: invoke
VideoWatermark関数の呼び出しの詳細
VideoWatermark関数を呼び出してビデオファイルに透かしを追加するには、次のコマンドを実行します。 ビジネス要件に基づいて特定のパラメーターの値を置き換えます。
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"}'
パラメータ:
bucket_name
: OSSバケットの名前。object_key
: 透かしを追加するビデオファイルの名前。output_dir
: ファイルをトランスコードした後にビデオファイルを保存するOSSバケットの名前。vf_args
: 追加するテキスト透かしまたは画像透かし。filter_complex_args
: 追加するアニメーションGIF透かし。 デフォルトでは、このパラメーターとvf_args
パラメーターを同時に設定すると、vf_args
パラメーターの値は無効になります。
サンプルコマンド出力:
[2021-11-26T15:20:24.396] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= static-master/target/lib ...... ...... FC Invoke End RequestId: 31ecddfa-4e41-44bb-9489-00708b07**** Duration: 1302.08 ms, Billed Duration: 1303 ms, Memory Size: 256 MB, Max Memory Used: 256.00 MB ========= FC invoke Logs end ========= FC Invoke Result: ok End of method: invoke
AudioConvert関数の呼び出しの詳細
AudioConvert関数を呼び出してオーディオまたはビデオファイルの形式を変換するには、次のコマンドを実行します。 ビジネス要件に基づいて特定のパラメーターの値を置き換えます。
sudo s AudioConvert invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "dst_type":".wav", "ac":"1", "ar":"4000"}'
パラメータ:
bucket_name
: OSSバケットの名前。object_key
: 変換する形式のオーディオファイルの名前。output_dir
: ファイルをトランスコードした後にビデオファイルを保存するOSSバケットの名前。dst_type
: 変換された形式。(オプション)
ac
: サウンドチャンネルの数。(オプション)
ar
: オーディオサンプリングレート。
サンプルコマンド出力:
[2021-11-26T16:04:16.293] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= ...... 2021-11-26T08:04:18.520Z 2fc578cd-8787-4681-ab21-a3f6b4ab1e2a [ERROR] returncode:1 ...... 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: invoke
VideoGif関数の呼び出しの詳細
VideoGif関数を呼び出してビデオファイルのアニメーションGIFを生成するには、次のコマンドを実行します。 ビジネス要件に基づいて特定のパラメーターの値を置き換えます。
sudo s VideoGif invoke -e '{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "vframes": "5", "start": "0", "duration": "2"}'
パラメータ:
bucket_name
: OSSバケットの名前。object_key
: GIFファイルに変換するビデオファイルの名前。output_dir
: ファイルをトランスコードした後にビデオファイルを保存するために使用されるOSSバケットの名前。(オプション)
vframes
:start
パラメーターを指定した後にGIFファイルを作成するビデオクリップの長さ。(オプション)
start
: 変換するビデオの開始点。 デフォルト値:0(オプション)
duration
:start
パラメーターを指定した後にGIFファイルを作成するビデオの長さ。
説明duration
パラメーターとvframes
パラメーターを同時に設定した場合、duration
パラメーターの値が優先されます。 デフォルトでは、2つのパラメータのいずれも設定されていない場合、ビデオ全体がGIFファイルに変換されます。サンプルコマンド出力:
[2021-11-26T15:27:26.647] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: a49fc8b4-ee8f-4e8b-9923-b8b41ced47cb 2021-11-26T07:27:28.279Z a49fc8b4-ee8f-4e8b-9923-b8b41ced47cb [INFO] b'{"bucket_name": "test-bucket","object_key": "a.mp4", "output_dir" : "output/", "vframes": "5", "start": "0", "duration": "2"}' 2021-11-26T07:27:28.280Z a49fc8b4-ee8f-4e8b-9923-b8b41ced47cb [INFO] cmd = ffmpeg -y -ss 0 -t 2 -accurate_seek -i ...... 2021-11-26T07:27:30.150Z a49fc8b4-ee8f-4e8b-9923-b8b41ced47cb [INFO] Uploaded /tmp/a.gif to output/a.gif 2021-11-26T07:27:30.151Z a49fc8b4-ee8f-4e8b-9923-b8b41ced47cb [INFO] current Function [handler] excute time is 1.87 seconds FC Invoke End RequestId: a49fc8b4-ee8f-4e8b-9923-b8b41ced47cb Duration: 2495.95 ms, Billed Duration: 2496 ms, Memory Size: 512 MB, Max Memory Used: 85.32 MB ========= FC invoke Logs end ========= FC Invoke Result: ok End of method: invoke
関連ドキュメント
大きなビデオのトランスコードを高速化したり、複雑な操作を実行したりするには、Serverless Workflowオーケストレーション機能を使用してビデオ処理システムを構築できます。 詳細については、「サーバーレスアーキテクチャに基づく柔軟で高可用性なオーディオおよびビデオ処理システムの構築」をご参照ください。
オーディオおよびビデオデータをリアルタイムまたはほぼリアルタイムで処理する場合は、GPU高速化インスタンスにアプリケーションをデプロイできます。 詳細については、「オーディオおよびビデオ処理のベストプラクティス」をご参照ください。