Todos os produtos
Search
Central de documentação

Intelligent Media Management:Transcode while streaming

Última atualização: Jun 27, 2026

A transcodificação durante o streaming é um recurso de transcodificação em tempo real para reprodução de vídeo online. Ele inicia a reprodução imediatamente após o upload e transcodifica apenas os segmentos assistidos.

Visão geral

Diferentemente do ApsaraVideo Media Processing, que exige a conclusão da transcodificação completa do vídeo após o upload antes do início da reprodução, a transcodificação durante o streaming começa assim que o upload do vídeo source termina. O sistema transcodifica apenas os segmentos necessários para a reprodução. Essa abordagem oferece:

  • Transcodificação durante a reprodução — sem espera.

  • Transcodificação otimizada com tempos de início e busca inferiores a um segundo — experiência de reprodução quase local.

  • Transcodificação somente mediante reprodução. Mesmo se os arquivos transcodificados forem excluídos, o sistema os regenera sob demanda — redução significativa nos custos de transcodificação e armazenamento.

  • Suporte a dezenas de parâmetros de transcodificação — configurações altamente personalizáveis.

  • Alta compatibilidade — mais de 300 formatos de áudio e vídeo suportados.

Nota

A transcodificação durante o streaming não suporta reprodução anônima.

Fluxo de trabalho

  1. Faça upload do arquivo de vídeo para o Object Storage Service (OSS).

  2. Use a API GenerateVideoPlaylist para gerar rapidamente um arquivo de playlist de mídia. Assine a playlist com os recursos de assinatura do OSS para obter uma URL assinada.

  3. O player busca a playlist assinada e inicia a reprodução. O recurso de transcodificação durante o streaming é acionado automaticamente nesse processo.

Cenários

  • Armazenamento em nuvem: usuários fazem upload de vídeos para drives na nuvem e os clientes selecionam instantaneamente as resoluções adequadas conforme as condições da rede. Isso garante reprodução em tempo real e compatibilidade entre dispositivos. Como a maioria dos vídeos armazenados raramente é acessada ("frios"), a transcodificação durante o streaming evita processar conteúdo não reproduzido, o que reduz drasticamente os custos de transcodificação e armazenamento.

  • Pré-visualização de vídeos em aplicativos de chat: em mensagens instantâneas ou plataformas sociais, assim que o remetente termina o upload e o servidor recebe o arquivo, o destinatário pode iniciar a reprodução imediatamente, melhorando a comunicação em tempo real. Arquivos transcodificados de mensagens antigas não visualizadas podem ser limpos periodicamente para reduzir custos de armazenamento, mantendo a reprodução instantânea ao serem acessados novamente.

  • Fóruns online e blogs: após o upload de vídeos source para compartilhamento, outros usuários podem reproduzir imediatamente as versões transcodificadas, garantindo reprodução fluida, alta definição e ampla compatibilidade de formatos.

Recursos

A tabela a seguir descreve recursos adicionais.

Recurso

Descrição

Padronização

  • Suporte ao protocolo padrão HTTP Live Streaming (HLS).

  • Geração de playlists de mídia e master playlist.

  • Reprodução com múltiplos fluxos de vídeo, áudio e legendas.

  • Compatibilidade com os principais players HLS.

  • Suporte a mais de 300 formatos convencionais de áudio e vídeo.

Baixo custo

  • Vídeos e segmentos não reproduzidos não passam por transcodificação, reduzindo custos.

  • Segmentos de vídeo transcodificados podem ser excluídos para economizar armazenamento. Na nova reprodução, o sistema aciona automaticamente uma nova transcodificação para manter a continuidade.

Alta eficiência

  • Clusters de grande escala oferecem suporte à transcodificação em tempo real.

  • Disponibiliza múltiplos fluxos de vídeo com diferentes resoluções e taxas de bits para adaptação a diversas condições de rede, garantindo reprodução fluida.

  • Início imediato da reprodução após a geração da playlist, sem espera pela transcodificação completa.

  • Tamanho adaptativo de segmento para cabeçalhos de vídeo, permitindo carregamento inicial mais rápido.

  • Pré-transcodificação inteligente.

Formatos de áudio e vídeo suportados

A transcodificação durante o streaming suporta mais de 300 formatos de áudio e vídeo. A tabela a seguir lista alguns formatos comuns.

Formatos de vídeo de entrada

avi, mov, flv, mkv, webm, mpeg, wmv, rm, vob, ts e todos os outros formatos convencionais

Formatos de áudio de entrada

mp3, wav, aac, flac, wma e todos os outros formatos convencionais

Formato de contêiner de saída

ts

Pré-requisitos

  1. Crie e obtenha um AccessKey.

  2. Ative o OSS, crie um bucket e faça upload de arquivos para ele. Para mais detalhes, consulte Início rápido no console.

  3. Ative o Intelligent Media Management (IMM) e crie um projeto. Para mais detalhes, consulte Ativar serviço e Criar projeto.

    Nota

    Você também pode chamar a API CreateProject para criar um projeto.

    É possível chamar a API ListProjects para listar todos os projetos em uma região específica.

  4. Conceda ao usuário do Resource Access Management (RAM) as permissões necessárias para operações do IMM.

  5. Antes de usar a transcodificação durante o streaming, vincule um projeto do IMM. Para instruções sobre como vincular via console ou API, consulte Início rápido e Vincular bucket do OSS.

  6. Se a proteção contra hotlink estiver ativada no bucket que contém seus vídeos source ou de saída, certifique-se de que a política de proteção contra hotlink permita Referer vazio.

  7. Se o player precisar de acesso cross-domain ao OSS, ative o CORS (Cross-Origin Resource Sharing) do OSS para o bucket de destino. Consulte Configurações de CORS.

Uso

Exemplo de Media Playlist

Configuração de transcodificação

  • Informações do vídeo source

    • Formato: AVI

    • URI source: oss://your-oss-bucket-name/test.avi

  • Vídeo de destino

    • Duração do segmento: 10 segundos

    • Duração da pré-transcodificação: 36 segundos

    • Codec de vídeo: H.264

    • Resolução: 1280×720

    • Taxa de quadros: 25 fps

    • Taxa de bits de vídeo: 2 Mbps

    • Codec de áudio: AAC

    • Taxa de bits de áudio: 128 Kbps

    • Prefixo do caminho de saída: oss://your-oss-bucket-name/output/media

Etapa 1: Gerar playlist

Nota

Consulte a documentação da API Gerar playlist de transcodificação durante o streaming.

  • Exemplo de solicitação

    {
      "ProjectName": "test-project",
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Codec": "aac",
              "Bitrate": 128000,
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/media",
          "Video": {
            "TranscodeVideo": {
              "Codec": "h264",
              "Bitrate": 2400000,
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
  • Exemplo de resposta

    {
      "RequestId": "********-3ADC-576A-BD1E-************",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "3d8ca7d6b3**********4b3cb69fe3bf",
          "URI": "oss://your-oss-bucket-name/output/media.m3u8"
        }
      ]
    }
    
  • Código de exemplo

    # -*- coding: utf-8 -*-
    import json
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    class Sample:
        def __init__(self):
            pass
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            Initialize a client using AccessKey ID and AccessKey secret.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # Your AccessKey ID.
                access_key_id=access_key_id,
                # Your AccessKey secret.
                access_key_secret=access_key_secret
            )
            # IMM endpoint.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
        @staticmethod
        def main() -> None:
            # Use IMM AccessKey ID and secret. Read from configuration if possible.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
            # Project name.
            project_name = "test-project"
            # Source video OSS URI.
            source_uri = "oss://your-oss-bucket-name/test.avi"
            # Target URI.
            target_uri = "oss://your-oss-bucket-name/output/media"
            # Initialize client.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
            # Create target.
            target = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=128000,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        bitrate=2400000,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
            # Create API request.
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                targets=[target]
            )
            # Print request.
            print(json.dumps(req.to_map(), indent=4))
            # Send request.
            response = client.generate_video_playlist(req)
            # Print response.
            print(json.dumps(response.body.to_map(), indent=4))
    if __name__ == '__main__':
        Sample.main()
    
    package main
    import (
    	"fmt"
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    func main() {
    	// Initialize IMM client.
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // Region ID of your project.
    		AccessKeyId:     tea.String("your_access_key_id"),     // RAM user AccessKey ID.
    		AccessKeySecret: tea.String("your_access_key_secret"), // RAM user AccessKey secret.
    	})
    	if err != nil {
    		// Handle error.
    		panic(err)
    	}
    	// Project name.
    	projectName := "test-project"
    	// Video OSS URI.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    	// Target URI.
    	targetUri := "oss://your-oss-bucket-name/output/media"
    	target := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(targetUri),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				Bitrate:    tea.Int32(2400000),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	// Create API request.
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target},
    	}
    	// Send request.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    	// Print response.
    	fmt.Println("Response:", *res.Body)
    }
    // This file is auto-generated, don't edit it. Thanks.
    package com.aliyun.sample;
    import com.aliyun.tea.*;
    public class Sample {
        /**
         * description :
         * <p>Initialize client using AK&amp;SK</p>
         * @return Client
         * 
         * @throws Exception
         */
        public static com.aliyun.teaopenapi.Client createClient() throws Exception {
            // Leaking credentials may compromise all resources under your account. This example is for reference only.
            // Use STS for better security. See https://www.alibabacloud.com/help/document_detail/378657.html for more options.
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_ID is set as an environment variable.
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_SECRET is set as an environment variable.
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Endpoint: https://api.aliyun.com/product/imm
            config.endpoint = "imm.cn-beijing.aliyuncs.com";
            return new com.aliyun.teaopenapi.Client(config);
        }
        /**
         * description :
         * <p>API info</p>
         * 
         * @param path string Path parameters
         * @return OpenApi.Params
         */
        public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
            com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
                    // API name
                    .setAction("GenerateVideoPlaylist")
                    // API version
                    .setVersion("2020-09-30")
                    // Protocol
                    .setProtocol("HTTPS")
                    // HTTP method
                    .setMethod("POST")
                    .setAuthType("AK")
                    .setStyle("RPC")
                    // Path
                    .setPathname("/")
                    // Request body format
                    .setReqBodyType("json")
                    // Response body format
                    .setBodyType("json");
            return params;
        }
        public static void main(String[] args_) throws Exception {
            java.util.List<String> args = java.util.Arrays.asList(args_);
            com.aliyun.teaopenapi.Client client = Sample.createClient();
            com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
            // Query parameters
            java.util.Map<String, Object> queries = new java.util.HashMap<>();
            queries.put("ProjectName", "test-project");
            queries.put("SourceURI", "oss://your-oss-bucket-name/test.avi");
            queries.put("Targets", "[{\"Video\":{\"TranscodeVideo\":{\"Codec\":\"h264\",\"Bitrate\":128000,\"FrameRate\":25,\"Resolution\":\"1280x\"}},\"Audio\":{\"TranscodeAudio\":{\"SampleRate\":44100,\"Codec\":\"aac\",\"Bitrate\":2400000}},\"Duration\":10,\"InitialSegments\":[2,2,2],\"InitialTranscode\":36,\"URI\":\"oss://your-oss-bucket-name/output/media\"}]");
            // Runtime options
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest()
                    .setQuery(com.aliyun.openapiutil.Client.query(queries));
            // Run and print API response.
            // Response is a Map containing body, headers, and statusCode.
            client.callApi(params, request, runtime);
        }
    }

Etapa 2: Assinar a playlist

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Get credentials from environment variables. Configure them before running.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Endpoint for your bucket's region.
endpoint = 'yourEndpoint'
# Region ID, e.g., cn-hangzhou.
region = 'cn-hangzhou'
# Bucket name.
bucket_name = 'your-oss-bucket-name'
# Playlist name.
key = 'output/media.m3u8'
# Create bucket instance.
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region) 
# Set x-oss-process to hls/sign,live_1.
params = {}
params.update({oss2.Bucket.PROCESS: 'hls/sign,live_1'})
# Generate signed URL.
url = bucket.sign_url('GET', key, 7200, params=params, slash_safe=True)
# Use this URL directly in an HLS player.
print(url)
# Example URL: http://your-oss-bucket-name.yourendpoint/output/media.m3u8?x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature-version=OSS2&x-oss-expires=1683619052&x-oss-access-key-id=yourAccessKeyId&x-oss-signature=4Lja6Sgb7zXWzY9R9QTRe4FxI240fApDavp%2BSMj3ufg%3D
package main
import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"net/http"
	"net/url"
	"os"
	"strings"
)
func main() {
	// Get credentials from environment variables. Configure them before running.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Create OSS client.
	// yourEndpoint: e.g., https://oss-cn-hangzhou.aliyuncs.com for China (Hangzhou).
	// yourRegion: e.g., cn-hangzhou.
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("yourRegion"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Bucket name.
	bucket, err := client.Bucket("your-oss-bucket-name")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Use oss hls/sign. "hls/sign,live_1" enables transcode while streaming.
	// Full path to m3u8, e.g., output/media.m3u8.
	// Signature validity: 7200 seconds (2 hours).
	signedURL, err := bucket.SignURL("output/media.m3u8", http.MethodGet, 7200, oss.Process("hls/sign,live_1"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Format for player use.
	rawUrl, err := url.Parse(signedURL)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	rawUrl.RawPath = strings.Replace(rawUrl.RawPath, "%2F", "/", -1)
	// Print signed URL.
	fmt.Println(rawUrl.String())
	// Paste this URL into an HLS player.
	//http://your-oss-bucket-name.yourEndpoint/output/media.m3u8?x-oss-access-key-id=yourAccessKeyId&x-oss-expires=1683618084&x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature=%2BqTZ0R04Ft065gdyoP6f9yJdd1UXi%2F8eoxd9c9Stl2g%3D&x-oss-signature-version=OSS2
}
package com.aliyun.sample;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;
public class demo {
    public static void main(String[] args) throws Throwable {
        // Endpoint example: https://oss-cn-beijing.aliyuncs.com. Adjust for your region.
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String region = "cn-beijing";
        // Get credentials from environment variables OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_ID is set.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Bucket name.
        String bucketName = "test-project";
        // Object path (exclude bucket name).
        String objectKey = "output/media.m3u8";
        // Create OSS client.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        // Set URL expiration (2 hours).
        Date expiration = new Date(new Date().getTime() + 7200 * 1000);
        GeneratePresignedUrlRequest request=new GeneratePresignedUrlRequest(bucketName, objectKey, HttpMethod.GET);
        request.setExpiration(expiration);
        request.setProcess("hls/sign,live_1");
        // Generate signed URL.
        URL signedUrl = ossClient.generatePresignedUrl(request);
        // Print URL.
        System.out.println(signedUrl);
        // Close OSS client.
        ossClient.shutdown();         
        try {
            // Example: 1-hour expiration.
            URL url = ossClient.generatePresignedUrl(bucketName, objectKey, expiration);
            System.out.println(url);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException. Request reached OSS but was rejected.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught a ClientException. Client encountered a serious internal issue.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Etapa 3: Reproduzir o vídeo

Cole a URL assinada da Etapa 2: Assinar a playlist diretamente em um player HLS.

  • Reproduzir no Safari no Mac

    O Safari no macOS suporta reprodução HLS. Cole a URL na barra de endereços.

  • Reproduzir com o Aliplayer

    Abra o Alibaba Cloud Aliplayer e cole a URL na barra de endereços.

    Nota

    Você também pode integrar o SDK do ApsaraVideo Player ao seu aplicativo. Consulte Visão geral do player Web.

  • Reproduzir com um player HLS

    Cole a URL assinada em qualquer player compatível com HLS.

Exemplo de Master Playlist

Configuração de transcodificação

  • Vídeo source

    • Formato: AVI

    • URI source: oss://your-oss-bucket-name/test.avi

  • URI da master playlist: oss://your-oss-bucket-name/output/master.m3u8

  • Vídeo de destino 1

    • Duração do segmento: 10 segundos

    • Duração da pré-transcodificação: 36 segundos

    • Codec de vídeo: H.264

    • Resolução: 1920×1080

    • Taxa de quadros: 25 fps

    • Codec de áudio: AAC

    • Taxa de bits de áudio: 128 Kbps

    • Prefixo do caminho de saída: oss://your-oss-bucket-name/output/1080p/1080p

  • Vídeo de destino 2

    • Duração do segmento: 10 segundos

    • Duração da pré-transcodificação: 36 segundos

    • Codec de vídeo: H.264

    • Resolução: 1280×720

    • Taxa de quadros: 25 fps

    • Codec de áudio: AAC

    • Taxa de bits de áudio: 96 Kbps

    • Prefixo do caminho de saída: oss://your-oss-bucket-name/output/720p/720p

  • Vídeo de destino 3

    • Duração do segmento: 10 segundos

    • Duração da pré-transcodificação: 36 segundos

    • Codec de vídeo: H.264

    • Resolução: 720×540

    • Taxa de quadros: 25 fps

    • Codec de áudio: AAC

    • Taxa de bits de áudio: 64 Kbps

    • Prefixo do caminho de saída: oss://your-oss-bucket-name/output/540p/540p

Etapa 1: Gerar playlist

  • Exemplo de solicitação

    {
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "ProjectName": "test-project",
      "SourceSubtitles": [],
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 131072,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1920x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 98304,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/720p/720p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 65536,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/540p/540p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "720x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
    
  • Exemplo de resposta

    {
      "Duration": 60.085,
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "RequestId": "********-3ADC-576A-BD1E-************",
      "Token": "1deb790e****************231a6f9d",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "720x406",
          "Token": "8bcd9bc0****************67a65f48",
          "URI": "oss://your-oss-bucket-name/output/540p/540p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "89ca4337****************cd031957",
          "URI": "oss://your-oss-bucket-name/output/720p/720p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1920x1080",
          "Token": "11fb1afb****************4f3683fc",
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p.m3u8"
        }
      ]
    }
  • Código de exemplo

    # -*- coding: utf-8 -*-
    import json
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    class Sample:
        def __init__(self):
            pass
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            Initialize a client using AccessKey ID and AccessKey secret.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # Your AccessKey ID.
                access_key_id=access_key_id,
                # Your AccessKey secret.
                access_key_secret=access_key_secret
            )
            # IMM endpoint.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
        @staticmethod
        def main() -> None:
            # Use IMM AccessKey ID and secret. Read from configuration if possible.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
            # Project name.
            project_name = "test-project"
            # Source video OSS URI.
            source_uri = "oss://your-oss-bucket-name/test.avi"
            # Target URI prefix.
            target_uri_prefix = "oss://your-oss-bucket-name/output"
            master_uri = f"{target_uri_prefix}/master.m3u8"
            target_1080p_uri = f"{target_uri_prefix}/1080p/1080p"
            target_720p_uri = f"{target_uri_prefix}/720p/720p"
            target_540p_uri = f"{target_uri_prefix}/540p/540p"
            # Initialize client.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
            # Create 1080p target.
            target_1080p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=131072,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_1080p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1920x",
                        scale_type="fit",
                    )
                ),
            )
            # Create 720p target.
            target_720p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=98304,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_720p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
            # Create 540p target.
            target_540p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=65536,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_540p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="720x",
                        scale_type="fit",
                    )
                ),
            )
            # Create API request.
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                master_uri=master_uri,
                targets=[target_1080p, target_720p, target_540p]
            )
            # Print request.
            print(json.dumps(req.to_map(), indent=4))
            # Send request.
            response = client.generate_video_playlist(req)
            # Print response.
            print(json.dumps(response.body.to_map(), indent=4))
    if __name__ == '__main__':
        Sample.main()
    
    package main
    import (
    	"fmt"
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    func main() {
    	// Initialize IMM client.
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // Region ID of your project.
    		AccessKeyId:     tea.String("your_access_key_id"),     // RAM user AccessKey ID.
    		AccessKeySecret: tea.String("your_access_key_secret"), // RAM user AccessKey secret.
    	})
    	if err != nil {
    		// Handle error.
    		panic(err)
    	}
    	// Project name.
    	projectName := "test-project"
    	// Video OSS URI.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    	// Target URI prefix.
    	targetURIPrefix := "oss://your-oss-bucket-name/output"
    	masterURI := targetURIPrefix + "/master.m3u8"
    	target1080pURI := targetURIPrefix + "/1080p/1080p"
    	target720pURI := targetURIPrefix + "/720p/720p"
    	target540pURI := targetURIPrefix + "/540p/540p"
    	target1080p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(131072),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target1080pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1920x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	target720p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target720pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	target540p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(65536),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target540pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("720x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	// Create API request.
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		MasterURI:   tea.String(masterURI),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target1080p, target720p, target540p},
    	}
    	// Send request.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    	// Print response.
    	fmt.Println("Response:", *res.Body)
    }
    

Etapa 2: Assinar a playlist

Assine a URL da master playlist retornada usando a assinatura do OSS. Consulte Etapa 2: Assinar a playlist.

Etapa 3: Reproduzir o vídeo

Para instruções de reprodução, consulte Etapa 3: Reproduzir o vídeo.

Perguntas frequentes

Preciso de um player personalizado?

Não. A transcodificação durante o streaming suporta o protocolo HLS padrão. Use qualquer player compatível com HLS (como o Alibaba Cloud Aliplayer ou o navegador Safari).

Quais arquivos de saída são gerados?

O sistema gera um arquivo m3u8 e arquivos TS com base no prefixo de caminho de entrada especificado. O arquivo m3u8 é gerado imediatamente.

Se você definir uma duração de pré-transcodificação, o sistema gera assincronamente os arquivos TS correspondentes. Segmentos não especificados são transcodificados sob demanda durante a reprodução. Se um vídeo nunca for reproduzido, nenhum arquivo TS será gerado para esses segmentos. Por exemplo, se a reprodução começar na marca de 15 minutos, a transcodificação começará a partir desse ponto. A estrutura de diretórios resultante fica assim:

.
├── outobjprefix.m3u8
├── outobjprefix-c280f054328fcde47c1732a8f2915009-0.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-1.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-2.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-3.ts

Ainda consigo reproduzir o vídeo se excluir manualmente os arquivos ts gerados?

Sim. Desde que o vídeo source e a playlist m3u8 permaneçam, a exclusão parcial ou total dos arquivos ts não afeta a reprodução. Quando a playlist m3u8 for solicitada novamente, os arquivos ts ausentes serão regenerados. Isso permite limpar arquivos ts de vídeos raramente visualizados para reduzir custos de armazenamento sem impactar reproduções futuras.

Posso usar um arquivo m3u8 que não seja de transcodificação durante o streaming para este recurso?

Não. Não é possível usar arquivos m3u8 gerados fora do processo de transcodificação durante o streaming para ativar este recurso.

Posso usar CDN para acelerar a transcodificação durante o streaming?

Sim. Para mais detalhes, consulte Usar CDN para acelerar a transcodificação durante o streaming.