全部产品
Search
文档中心

Function Compute:Praktik terbaik untuk pemrosesan audio dan video

更新时间:Jul 06, 2025

Anda dapat mencoba praktik terbaik dari instans yang dipercepat GPU menggunakan konsol Function Compute, SDK, atau Serverless Devs. Topik ini menjelaskan cara menggunakan Serverless Devs dan kode fungsi untuk mentranskode video dari format .mp4 ke .flv. Python digunakan sebagai contoh dalam topik ini.

Skenario dan manfaat

Dengan munculnya skenario aplikasi yang sangat interaktif seperti siaran langsung sosial, kelas online, dan telemedis, lalu lintas internet waktu nyata dan hampir waktu nyata menjadi tren. Dalam banyak kasus, platform video harus mentranskode konten video sumber untuk menghasilkan beberapa format distribusi video dalam rasio 1:N berdasarkan faktor-faktor seperti bitrate, resolusi, patch saluran, dan platform pemutaran guna memberikan penonton di berbagai platform dengan kualitas jaringan yang berbeda. Transkoding video adalah langkah kunci dalam produksi dan distribusi video. Solusi transkoding video yang ideal harus hemat biaya dalam hal biaya (CNY/stream) dan efisiensi daya (watts/stream).

Bagian ini menjelaskan manfaat instans yang dipercepat GPU dibandingkan dengan instans tanpa akselerasi GPU di Function Compute:

  • Skenario Aplikasi Waktu Nyata dan Hampir Waktu Nyata

    Instans yang dipercepat GPU dapat mentranskode video beberapa kali lebih cepat dan mendorong konten produksi kepada pengguna secara lebih efisien.

  • Skenario Aplikasi GPU yang Memrioritaskan Biaya

    Instans yang dipercepat GPU dapat disediakan secara elastis berdasarkan kebutuhan bisnis Anda, dan lebih hemat biaya daripada mesin virtual (VM) yang dibeli sendiri.

  • Skenario Aplikasi GPU yang Memrioritaskan Efisiensi

    Fokus pada pengembangan kode dan tujuan bisnis tanpa perlu melakukan operasi dan pemeliharaan kluster GPU, seperti manajemen driver dan versi CUDA, manajemen operasi mesin, serta manajemen GPU yang rusak.

Untuk informasi lebih lanjut tentang instans yang dipercepat GPU, lihat Jenis Instans dan Mode Instans.

Perbandingan kinerja

Instans yang dipercepat GPU dari Function Compute didasarkan pada arsitektur Turing dan mendukung format penyandian dan dekode berikut:

  • Format Penyandian

    H.264 (AVCHD) YUV 4:2:0

    H.264 (AVCHD) YUV 4:4:4

    H.264 (AVCHD) Lossless

    H.265 (HEVC) 4K YUV 4:2:0

    H.265 (HEVC) 4K YUV 4:4:4

    H.265 (HEVC) 4K Lossless

    H.265 (HEVC) 8k

    HEVC10-bitsupport

    HEVCB Framesupport

  • Format Dekode

    MPEG-1

    MPEG-2

    VC-1

    VP8

    VP9

    H.264 (AVCHD)

    H.265 (HEVC) 4:2:0

    *H.265 (HEVC) 4:4:4

    8 bit

    10 bit

    12 bit

    8 bit

    10 bit

    12 bit

    8 bit

    10 bit

    12 bit

Tabel berikut menunjukkan informasi tentang video sumber.

Item

Nilai

Durasi

2 menit dan 5 detik

Bitrate

4085 Kb/s

Informasi aliran video

h264 (High), yuv420p (progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc

Informasi audio dan video

aac (LC), 44100 Hz, stereo, fltp

Tabel berikut menunjukkan informasi tentang mesin uji yang menggunakan akselerasi GPU dan mesin tanpa akselerasi GPU.

Item

Mesin tanpa akselerasi GPU

Mesin dengan akselerasi GPU

CPU

CPU Xeon® Platinum 8163 4C

CPU Xeon® Platinum 8163 4C

RAM

16 GB

16 GB

GPU

N/A

T4

FFmpeg

git-2020-08-12-1201687

git-2020-08-12-1201687

Transkoding Video (1:1)

Uji Kinerja: 1 Aliran Masukan dan 1 Aliran Keluaran

Resolusi

Durasi transkoding tanpa akselerasi GPU

Durasi transkoding dengan akselerasi GPU

H264∶1920x1080 (1080p) (Full HD)

3 menit dan 19,331 detik

9,399 detik

H264∶1280x720 (720p) (Half HD)

2 menit dan 3,708 detik

5,791 detik

H264∶640x480 (480p)

1 menit dan 1,018 detik

5,753 detik

H264∶480x360 (360p)

44,376 detik

5,749 detik

Transkoding Video (1:N)

Uji Kinerja: 1 Aliran Masukan dan 3 Aliran Keluaran

Resolusi

Durasi transkoding tanpa akselerasi GPU

Durasi transkoding dengan akselerasi GPU

H264∶1920x1080 (1080p) (Full HD)

5 menit dan 58,696 detik

45,268 detik

H264∶1280x720 (720p) (Half HD)

H264∶640x480 (480p)

Perintah transkoding

  • Perintah untuk Transkoding Tanpa Akselerasi GPU

    • Transkoding Aliran Tunggal (1:1)

      docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg -y -i input.mp4 -c:v h264 -vf scale=1920:1080 -b:v 5M output.mp4
    • Transkoding Multi-Aliran (1:N)

      docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg \
      -y -i input.mp4 \
      -c:a copy -c:v h264 -vf scale=1920:1080 -b:v 5M output_1080.mp4 \
      -c:a copy -c:v h264 -vf scale=1280:720 -b:v 5M output_720.mp4 \
      -c:a copy -c:v h264 -vf scale=640:480 -b:v 5M output_480.mp4
    Tabel 1. Deskripsi Parameter

    Parameter

    Deskripsi

    -c:a copy

    Aliran audio dapat disalin tanpa rekoding.

    -c:v h264

    Pilih penyandi H.264 perangkat lunak untuk aliran keluaran.

    -b:v 5M

    Tetapkan bitrate keluaran menjadi 5 Mb/s.

  • Perintah untuk Transkoding dengan Akselerasi GPU

    • Transkoding Aliran Tunggal (1:1)

      docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -vf scale_cuda=1920:1080:1:4 -b:v 5M output.mp4
    • Transkoding Multi-Aliran (1:N)

      docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg \
      -y -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 \
      -c:a copy -c:v h264_nvenc -vf scale_npp=1920:1080 -b:v 5M output_1080.mp4 \
      -c:a copy -c:v h264_nvenc -vf scale_npp=1280:720 -b:v 5M output_720.mp4 \
      -c:a copy -c:v h264_nvenc -vf scale_npp=640:480 -b:v 5M output_480.mp4
    Tabel 2. Deskripsi Parameter

    Parameter

    Deskripsi

    -hwaccel cuda

    Pilih akselerator perangkat keras yang sesuai.

    -hwaccel_output_format cuda

    Simpan frame yang didekodekan di Memori GPU.

    -c:v h264_nvenc

    Gunakan perangkat keras NVIDIA untuk mempercepat penyandi H.264.

Persiapan

  • Untuk pengalaman pengguna terbaik, bergabunglah dengan grup DingTalk (ID 11721331) dan berikan informasi berikut:

    • Nama organisasi, seperti nama perusahaan Anda.

    • ID Akun Alibaba Cloud Anda.

    • Wilayah tempat Anda ingin menggunakan instans yang dipercepat GPU, seperti Tiongkok (Shenzhen).

    • Informasi kontak, seperti nomor ponsel, alamat email, atau akun DingTalk Anda.

  • Lakukan operasi berikut di wilayah tempat instans yang dipercepat GPU berada:

  • Kompilasi FFmpeg.

    FFmpeg harus dikompilasi sebelum Anda dapat menggunakan akselerasi GPU. Berikut adalah cara mengompilasi FFmpeg:

    • (Direkomendasikan) Gunakan FFmpeg yang sudah dikompilasi melalui Docker. Alamat unduhan: nvidia-ffmpeg atau ffmpeg.

    • Kompilasi Manual FFmpeg. Untuk informasi lebih lanjut, lihat Panduan Kompilasi.

  • Unggah sumber daya audio dan video yang ingin diproses ke bucket Object Storage Service (OSS) di wilayah tempat instans yang dipercepat GPU berada. Pastikan Anda memiliki izin baca dan tulis pada objek di bucket tersebut. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya audio dan video, lihat Unggah Objek. Untuk informasi lebih lanjut tentang izin, lihat Ubah ACL Bucket.

Deploy aplikasi GPU menggunakan Serverless Devs

Before you start

Procedure

  1. Buat proyek.

    s init devsapp/start-fc-custom-container-event-python3.9 -d fc-gpu-prj

    Kode sampel berikut menunjukkan direktori proyek yang dibuat:

    fc-gpu-prj
    ├── code
    │   ├── app.py        # Kode fungsi.
    │   └── Dockerfile    # Dockerfile: Image Dockerfile yang berisi kode.
    ├── README.md
    └── s.yaml            # Konfigurasi proyek, yang menentukan bagaimana image diterapkan di Function Compute
  2. Masuk ke direktori proyek.

    cd fc-gpu-prj
  3. Ubah konfigurasi parameter dalam file berikut sesuai kebutuhan bisnis Anda.

    • Edit file s.yaml.

      Untuk informasi lebih lanjut tentang parameter dalam file YAML, lihat Spesifikasi YAML.

      edition: 1.0.0
      name: container-demo
      access: default
      vars:
        region: cn-shenzhen
      services:
        customContainer-demo:
          component: devsapp/fc
          props:
            region: ${vars.region}
            service:
              name: tgpu_ffmpeg_service
              internetAccess: true
            function:
              name: tgpu_ffmpeg_func
              description: test gpu for ffmpeg
              handler: not-used
              timeout: 600
              caPort: 9000
              instanceType: fc.gpu.tesla.1
              gpuMemorySize: 8192
              cpu: 4
              memorySize: 16384
              diskSize: 512
              runtime: custom-container
              customContainerConfig:
                #1. Pastikan namespace:demo dan repositori repo:gpu-transcoding_s telah dibuat sebelumnya di Alibaba Cloud Container Registry.
                #2. Ubah tag dari v0.1 menjadi v0.2 saat Anda memperbarui fungsi nanti dan jalankan s build && s deploy lagi.
                image: registry.cn-shanghai.aliyuncs.com/demo/gpu-transcoding_s:v0.1
              codeUri: ./code
    • Edit file app.py.

      Contoh:

      # -*- coding: utf-8 -*-
      # python2 dan python3
      
      from __future__ import print_function
      from http.server import HTTPServer, BaseHTTPRequestHandler
      import json
      import sys
      import logging
      import os
      import time
      import urllib.request
      import subprocess
      
      class Resquest(BaseHTTPRequestHandler):
          def download(self, url, path):
              print("masuk download:", url)
              f = urllib.request.urlopen(url)
              with open(path, "wb") as local_file:
                  local_file.write(f.read())
      
          def upload(self, url, path):
              print("masuk upload:", url)
              headers = {
                  'Content-Type': 'application/octet-stream',
                  'Content-Length': os.stat(path).st_size,
              }
              req = urllib.request.Request(url, open(path, 'rb'), headers=headers, method='PUT')
              urllib.request.urlopen(req)
      
          def trans(self, input_path, output_path, enable_gpu):
              print("masuk trans input:", input_path, " output:", output_path, " enable_gpu:", enable_gpu)
      
              cmd = ['ffmpeg', '-y', '-i', input_path, "-c:a", "copy", "-c:v", "h264", "-b:v", "5M", output_path]
              if enable_gpu:
                  cmd = ["ffmpeg", "-y", "-hwaccel", "cuda", "-hwaccel_output_format", "cuda", "-i", input_path, "-c:v", "h264_nvenc", "-b:v", "5M", output_path]
      
              try:
                  subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
              except subprocess.CalledProcessError as exc:
                  print('\nreturncode:{}'.format(exc.returncode))
                  print('\ncmd:{}'.format(exc.cmd))
                  print('\noutput:{}'.format(exc.output))
                  print('\nstderr:{}'.format(exc.stderr))
                  print('\nstdout:{}'.format(exc.stdout))
      
          def trans_wrapper(self, enable_gpu):
              src_url = "https://your.domain/input.mp4"  # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut.
              dst_url = "https://your.domain/output.flv" # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut.
              src_path = "/tmp/input_c.flv"
              dst_path = "/tmp/output_c.mp4"
      
              if enable_gpu:
                  src_url = "https://your.domain/input.mp4"  # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut.
                  dst_url = "https://your.domain/output.flv" # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut.
                  src_path = "/tmp/input_g.flv"
                  dst_path = "/tmp/output_g.mp4"
      
              local_time = time.time()
              self.download(src_url, src_path)
              download_time = time.time() - local_time
      
              local_time = time.time()
              self.trans(src_path, dst_path, enable_gpu)
              trans_time = time.time() - local_time
      
              local_time = time.time()
              self.upload(dst_url, dst_path)
              upload_time = time.time() - local_time
      
              data = {'result':'ok', 'download_time':download_time, 'trans_time':trans_time, 'upload_time':upload_time}
              self.send_response(200)
              self.send_header('Content-type', 'application/json')
              self.end_headers()
              self.wfile.write(json.dumps(data).encode())
      
          def pong(self):
              data = {"function":"trans_gpu"}
              self.send_response(200)
              self.send_header('Content-type', 'application/json')
              self.end_headers()
              self.wfile.write(json.dumps(data).encode())
      
          def dispatch(self):
              mode = self.headers.get('TRANS-MODE')
      
              if mode == "ping":
                  self.pong()
              elif mode == "gpu":
                  self.trans_wrapper(True)
              elif mode == "cpu":
                  self.trans_wrapper(False)
              else:
                  self.pong()
      
          def do_GET(self):
              self.dispatch()
      
          def do_POST(self):
              self.dispatch()
      
      if __name__ == '__main__':
          host = ('0.0.0.0', 9000)
          server = HTTPServer(host, Resquest)
          print("Memulai server, mendengarkan pada: %s:%s" % host)
          server.serve_forever()
    • Edit file Dockerfile.

      Contoh:

      FROM registry.cn-shanghai.aliyuncs.com/serverless_devs/nvidia-ffmpeg:latest
      WORKDIR /usr/src/app
      RUN apt-get update --fix-missing
      RUN apt-get install -y python3
      RUN apt-get install -y python3-pip
      COPY . .
      ENTRYPOINT [ "python3", "-u", "/usr/src/app/app.py" ]
      EXPOSE 9000
  4. Bangun sebuah image.

    s build --dockerfile ./code/Dockerfile
  5. Deploy kode ke Function Compute.

    s deploy
    Catatan

    Jika Anda menjalankan perintah di atas berulang kali dan nama layanan serta fungsi tetap tidak berubah, jalankan perintah use local untuk menggunakan konfigurasi lokal.

  6. Konfigurasikan instans yang disediakan.

    s provision put --target 1 --qualifier LATEST
  7. Periksa apakah instans yang disediakan sudah siap.

    s provision get --qualifier LATEST

    Jika nilai current adalah 1, mode penyediaan instans yang dipercepat GPU sudah siap. Contoh:

    [2021-12-14 08:45:24] [INFO] [S-CLI] - Mulai ...
    [2021-12-14 08:45:24] [INFO] [FC] - Mendapatkan penyediaan: tgpu_ffmpeg_service.LATEST/tgpu_ffmpeg_func
    customContainer-demo:
     serviceName:      tgpu_ffmpeg_service
     functionName:      tgpu_ffmpeg_func
     qualifier:       LATEST
     resource:        188077086902****#tgpu_ffmpeg_service#LATEST#tgpu_ffmpeg_func
     target:         1
     current:        1
     scheduledActions:    (array kosong)
     targetTrackingPolicies: (array kosong)
     currentError:     
  8. Panggil fungsi.

    • Lihat Versi Fungsi Online

      s invoke
    • Gunakan CPU untuk Transkoding

      s invoke -e '{"method":"GET","headers":{"TRANS-MODE":"cpu"}}'
    • Gunakan GPU untuk Transkoding

      s invoke -e '{"method":"GET","headers":{"TRANS-MODE":"gpu"}}'
  9. Lepaskan instans yang dipercepat GPU.

    s provision put --target 0 --qualifier LATEST

Gunakan konsol Function Compute untuk menerapkan aplikasi GPU

  1. Terapkan sebuah image.

    1. Buat instance Container Registry Enterprise Edition atau Container Registry Personal Edition.

      Kami merekomendasikan agar Anda membuat instance Enterprise Edition. Untuk informasi lebih lanjut, lihat Buat Instance Container Registry Enterprise Edition.

    2. Buat namespace dan repositori gambar.

      Untuk informasi lebih lanjut, lihat bagian Langkah 2: Buat Namespace dan Langkah 3: Buat Repositori Gambar dari topik "Gunakan Instance Container Registry Enterprise Edition untuk Membangun Gambar".

    3. Lakukan operasi pada Docker sesuai petunjuk di Konsol Container Registry. Kemudian, dorong sampel app.py dan Dockerfile sebelumnya ke repositori gambar instance. Untuk informasi lebih lanjut tentang file-file tersebut, lilihat app.py dan Dockerfile di direktori /code saat Anda menerapkan aplikasi GPU menggunakan Serverless Devs.

      db-acr-docker

  2. Buat layanan. Untuk informasi lebih lanjut, lihat bagian "Buat Layanan" dari Kelola Layanan.

  3. Buat fungsi. Untuk informasi lebih lanjut, lihat Buat Fungsi Kontainer Kustom.

    Catatan

    Pilih GPU Instance untuk Instance Type dan Process HTTP Requests untuk Request Handler Type.

  4. Ubah periode batas waktu eksekusi fungsi.

    1. Temukan fungsi yang ingin Anda kelola dan klik Configure di kolom Actions.

    2. Di bagian Environment Information, ubah nilai Execution Timeout Period dan klik Save.

      db-gpu-time

    Catatan

    Durasi transkoding menggunakan CPU melebihi nilai default 60 detik. Oleh karena itu, kami merekomendasikan agar Anda menetapkan nilai Execution Timeout Period menjadi nilai yang lebih besar.

  5. Konfigurasikan instans GPU yang disediakan.

    1. Di halaman Detail Fungsi, klik tab Auto Scaling dan klik Create Rule.

    2. Di halaman yang muncul, konfigurasikan parameter berikut untuk menyediakan instans yang dipercepat GPU dan klik Create.

      Untuk informasi lebih lanjut tentang cara mengonfigurasi instans yang disediakan, lihat Konfigurasikan Aturan Penskalaan Otomatis. db-gpu-reserved

      Setelah konfigurasi selesai, Anda dapat memeriksa apakah instans GPU yang disediakan sudah siap di daftar aturan. Secara spesifik, periksa apakah nilai Current Reserved Instances adalah jumlah instans yang disediakan yang ditentukan.

  6. Gunakan cURL untuk Menguji Fungsi

    1. Di halaman detail fungsi, klik tab Triggers untuk melihat konfigurasi pemicu dan mendapatkan titik akhir pemicu.

    2. Jalankan perintah berikut di antarmuka baris perintah (CLI) untuk memanggil fungsi GPU:

      • Lihat Versi Fungsi Online

        curl -v "https://tgpu-ff-console-tgpu-ff-console-ajezot****.cn-shenzhen.fcapp.run"
        {"function": "trans_gpu"}
      • Gunakan CPU untuk Transkoding

        curl "https://tgpu-ff-console-tgpu-ff-console-ajezot****.cn-shenzhen.fcapp.run" -H 'TRANS-MODE: cpu'
        {"result": "ok", "upload_time": 8.75510573387146, "download_time": 4.910430669784546, "trans_time": 105.37688875198364}
      • Gunakan GPU untuk Transkoding

        curl "https://tgpu-ff-console-tgpu-ff-console-ajezotchpx.cn-shenzhen.fcapp.run" -H 'TRANS-MODE: gpu'
        {"result": "ok", "upload_time": 8.313958644866943, "download_time": 5.096682548522949, "trans_time": 8.72346019744873}

Hasil

Anda dapat melihat video setelah transkoding dengan mengakses domain berikut di browser Anda:

https://cri-zbtsehbrr8******-registry.oss-cn-shenzhen.aliyuncs.com/output.flv

Domain ini digunakan sebagai contoh. Domain aktual yang berlaku.