すべてのプロダクト
Search
ドキュメントセンター

Function Compute:Function ComputeでFFmpegベースのアプリケーションを使用してオーディオおよびビデオファイルを処理する

最終更新日:Sep 09, 2024

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を使用してアプリケーションをデプロイする

  1. 次のコマンドを実行して、管理するプロジェクトを初期化します。

    sudo s init ffmpeg-app -d ffmpeg-app

    前述のコマンドでは、は、生成されるディレクトリの名前を指定します。

  2. 次のコマンドを実行して、プロジェクトのディレクトリに移動します。

    cd ffmpeg-app
  3. (オプション) ビジネス要件に基づいてディレクトリ内のサンプルコードを変更し、ビジネスロジックを実装できます。

  4. 次のコマンドを実行して、プロジェクトをデプロイします。

    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
  5. 関数を呼び出します。

    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

関連ドキュメント