Todos os produtos
Search
Central de documentação

ApsaraVideo VOD:Media processing

Última atualização: Jun 27, 2026

Exemplos do SDK para Java para envio de tarefas de transcodificação e snapshot, consulta de dados de snapshot e pré-processamento de vídeos no estúdio de produção.

Pré-requisitos

Antes de começar, verifique se você tem:

  • Uma conta Alibaba Cloud com o ApsaraVideo VOD ativado

  • Um par AccessKey (AccessKey ID e AccessKey secret) configurado como variáveis de ambiente

  • Um usuário do Resource Access Management (RAM) com as permissões necessárias para o ApsaraVideo VOD

  • O SDK do ApsaraVideo VOD para Java adicionado às dependências do seu projeto

Para operações de API não abordadas aqui, acesse o OpenAPI Explorer. Selecione uma operação de API, configure os parâmetros na aba Parameters e clique em Initiate Call. Baixe o código gerado na aba SDK Sample Code.

Inicializar um cliente

Antes de chamar qualquer operação de API, inicialize uma instância de cliente. Para instruções de configuração, consulte Inicialização.

Enviar uma tarefa de transcodificação

Chame a operação SubmitTranscodeJobs para enviar uma tarefa de transcodificação. O exemplo a seguir mostra como:

  • Defina o ID do vídeo e o ID do grupo de modelos de transcodificação

  • Substituir parâmetros de marca d'água (opcional)

  • Configure criptografia HTTP Live Streaming (HLS) (opcional)

  • Extrair o ID da tarefa da resposta

Apenas vídeos nos estados Uploaded , Normal ou Reviewing podem ser transcodificados. Configure as definições de callback para receber notificações dos eventos FileUploadComplete ou ImageUploadComplete e envie as tarefas de transcodificação após a conclusão do upload. Para receber os resultados da transcodificação, inscreva-se no evento StreamTranscodeComplete ou TranscodeComplete . Para mais detalhes, consulte Configurar definições de callback .
import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsRequest;
import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsResponse;

/**
 * Submit a transcoding job with optional watermark overrides and HLS encryption.
 */
public static SubmitTranscodeJobsResponse submitTranscodeJobs(DefaultAcsClient client) throws Exception {
    SubmitTranscodeJobsRequest request = new SubmitTranscodeJobsRequest();

    // TODO: Replace with your video ID
    request.setVideoId("34a6ca54f5c140eece85a289****");

    // TODO: Replace with your transcoding template group ID
    request.setTemplateGroupId("e8aa925a9798c630d30cd****");

    // Override watermark parameters (optional). Required only to change watermark content at submission time.
    JSONObject overrideParams = buildOverrideParams();
    request.setOverrideParams(overrideParams.toJSONString());

    // Configure HLS encryption (optional). Required only for HLS-encrypted outputs.
    JSONObject encryptConfig = buildEncryptConfig(client);
    request.setEncryptConfig(encryptConfig.toJSONString());

    return client.getAcsResponse(request);
}

/**
 * Entry point for the transcoding job example.
 */
public static void main(String[] args) throws ClientException {
    // Initialize the client. See the Initialization topic for details.
    DefaultAcsClient client = initVodClient();
    SubmitTranscodeJobsResponse response = new SubmitTranscodeJobsResponse();
    try {
        response = submitTranscodeJobs(client);
        // Extract the job ID for tracking
        System.out.println("JobId = " + response.getTranscodeJobs().get(0).getJobId());
    } catch (Exception e) {
        System.out.println("ErrorMessage = " + e.getLocalizedMessage());
    }
    // The request ID is useful for troubleshooting with Alibaba Cloud support
    System.out.println("RequestId = " + response.getRequestId());
}

Para obter detalhes completos da API, consulte SubmitTranscodeJobs no OpenAPI Explorer.

Substituir parâmetros de marca d'água

Substitua a URL de uma marca d'água de imagem ou o conteúdo de uma marca d'água de texto no momento do envio da tarefa. Cada marca d'água é identificada por um WatermarkId associado ao modelo de transcodificação especificado por TemplateGroupId.

O arquivo de marca d'água e o vídeo devem estar armazenados no mesmo servidor de origem.
/**
 * Build watermark override parameters.
 *
 * Overridable fields:
 * - Image watermark: FileUrl (the OSS URL of the replacement image)
 * - Text watermark: Content (the replacement text)
 *
 * The WatermarkId must be associated with the transcoding template in use.
 */
public static JSONObject buildOverrideParams() {
    JSONObject overrideParams = new JSONObject();
    JSONArray watermarks = new JSONArray();

    // Override an image watermark URL
    JSONObject watermark1 = new JSONObject();
    // TODO: Replace with your image watermark ID (must be associated with the transcoding template)
    watermark1.put("WatermarkId", "2ea587477c5a1bc8b57****");
    // TODO: Replace with the Object Storage Service (OSS) URL of the new watermark image
    watermark1.put("FileUrl", "http://developer.aliyundoc.com/image/image.png");
    watermarks.add(watermark1);

    // Override a text watermark
    JSONObject watermark2 = new JSONObject();
    // TODO: Replace with your text watermark ID (must be associated with the transcoding template)
    watermark2.put("WatermarkId", "d297ba31ac5242d207****");
    // TODO: Replace with the new text content for the watermark
    watermark2.put("Content", "User ID: 6****");
    watermarks.add(watermark2);

    overrideParams.put("Watermarks", watermarks);
    return overrideParams;
}

Configurar criptografia HLS

Gere uma chave de dados do Key Management Service (KMS) e crie a configuração de criptografia para saída HLS. O campo DecryptKeyUri especifica o endpoint do seu serviço de descriptografia. O ApsaraVideo VOD chama esse endpoint durante a reprodução para recuperar a chave de descriptografia.

import com.aliyuncs.vod.model.v20170321.GenerateKMSDataKeyRequest;
import com.aliyuncs.vod.model.v20170321.GenerateKMSDataKeyResponse;

/**
 * Build HLS encryption configuration using a KMS data key.
 */
public static JSONObject buildEncryptConfig(DefaultAcsClient client) throws ClientException {
    // Generate a KMS data key. The response contains both plaintext and ciphertext.
    // Only the ciphertext is passed to ApsaraVideo VOD.
    GenerateKMSDataKeyResponse response = generateDataKey(client);

    JSONObject encryptConfig = new JSONObject();

    // The URI of your decryption service. Concatenate the service URL with the ciphertext key.
    // The ciphertext is unique per video. The "Ciphertext" query parameter name is customizable.
    // TODO: Replace the base URL with your decryption service endpoint
    encryptConfig.put("DecryptKeyUri", "http://example.aliyundoc.com/decrypt?" +
            "Ciphertext=" + response.getCiphertextBlob());

    // Key service type. Only KMS is supported.
    encryptConfig.put("KeyServiceType", "KMS");

    // The ciphertext blob from the KMS GenerateDataKey response
    encryptConfig.put("CipherText", response.getCiphertextBlob());

    return encryptConfig;
}

/**
 * Generate a KMS data key for encryption.
 * The response contains the plaintext key (for internal use) and the ciphertext key
 * (passed to ApsaraVideo VOD for storage).
 */
public static GenerateKMSDataKeyResponse generateDataKey(DefaultAcsClient client) throws ClientException {
    GenerateKMSDataKeyRequest request = new GenerateKMSDataKeyRequest();
    return client.getAcsResponse(request);
}

Enviar uma tarefa de snapshot

Chame a operação SubmitSnapshotJob para capturar snapshots de quadros de vídeo e gerar um sprite (imagem composta).

Para criar um modelo de snapshot, consulte AddVodTemplate .
import com.aliyuncs.vod.model.v20170321.SubmitSnapshotJobRequest;
import com.aliyuncs.vod.model.v20170321.SubmitSnapshotJobResponse;

/**
 * Submit a snapshot job with optional sprite configuration.
 */
public static SubmitSnapshotJobResponse submitSnapshotJob(DefaultAcsClient client) throws Exception {
    SubmitSnapshotJobRequest request = new SubmitSnapshotJobRequest();

    // TODO: Replace with the video ID to capture snapshots from
    request.setVideoId("4d237a8270084849bf4207876181****");

    // TODO: Replace with your snapshot template ID.
    // When SnapshotTemplateId is specified, the individual parameters below are ignored.
    request.setSnapshotTemplateId("5d745e6b8baadf589e0702426cfc6****");

    // The following parameters apply only when SnapshotTemplateId is not specified.
    request.setCount(50L);               // Total number of snapshots to capture
    request.setSpecifiedOffsetTime(0L);   // Start time in milliseconds
    request.setInterval(1L);              // Interval between snapshots in seconds
    request.setWidth("200");              // Snapshot width in pixels
    request.setHeight("200");             // Snapshot height in pixels

    // Configure sprite generation (optional)
    JSONObject spriteSnapshotConfig = buildSnapshotTemplateConfig();
    request.setSpriteSnapshotConfig(spriteSnapshotConfig.toJSONString());

    return client.getAcsResponse(request);
}

/**
 * Entry point for the snapshot job example.
 */
public static void main(String[] args) throws ClientException {
    DefaultAcsClient client = initVodClient();
    SubmitSnapshotJobResponse response = new SubmitSnapshotJobResponse();
    try {
        response = submitSnapshotJob(client);
        // Extract the snapshot job ID for tracking
        System.out.println("JobId = " + response.getSnapshotJob().getJobId());
    } catch (Exception e) {
        System.out.println("ErrorMessage = " + e.getLocalizedMessage());
    }
    System.out.println("RequestId = " + response.getRequestId());
}

Para obter detalhes completos da API, consulte SubmitSnapshotJob no OpenAPI Explorer.

Configurar um sprite

Crie os parâmetros de configuração do sprite para montar snapshots individuais em uma imagem em grade.

/**
 * Build sprite configuration.
 * A sprite arranges individual snapshots in a grid layout for efficient previewing.
 */
public static JSONObject buildSnapshotTemplateConfig() {
    JSONObject spriteSnapshotConfig = new JSONObject();
    spriteSnapshotConfig.put("CellWidth", "120");    // Width of each cell in pixels
    spriteSnapshotConfig.put("CellHeight", "68");     // Height of each cell in pixels
    spriteSnapshotConfig.put("Columns", "3");         // Number of columns in the grid
    spriteSnapshotConfig.put("Lines", "10");           // Number of rows in the grid
    spriteSnapshotConfig.put("Padding", "20");         // Padding between cells in pixels
    spriteSnapshotConfig.put("Margin", "50");          // Outer margin in pixels
    // Retain individual snapshot images after sprite generation.
    // Set to "keep" to preserve source images, or omit to discard them.
    spriteSnapshotConfig.put("KeepCellPic", "keep");
    spriteSnapshotConfig.put("Color", "tomato");       // Background color of the sprite
    return spriteSnapshotConfig;
}

Consultar dados de snapshot

Chame a operação ListSnapshots para consultar dados de snapshot.

Para obter detalhes completos da API e código de exemplo, consulte ListSnapshots no OpenAPI Explorer.

Pré-processar vídeos no estúdio de produção

Chame a operação SubmitPreprocessJobs para pré-processar vídeos destinados ao estúdio de produção.

Para obter detalhes completos da API e código de exemplo, consulte SubmitPreprocessJobs no OpenAPI Explorer.

Próximos passos