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
Configure notificações de eventos: Defina callbacks para receber eventos de conclusão de tarefas, como TranscodeComplete e SnapshotComplete. Consulte Configurar definições de callback.
Gerencie modelos de transcodificação: Crie e gerencie grupos de modelos de transcodificação. Consulte AddTranscodeTemplateGroup no OpenAPI Explorer.
Gerencie modelos de snapshot: Crie modelos de snapshot com a operação AddVodTemplate.
Explorar outras operações de API: Acesse o OpenAPI Explorer para obter códigos de exemplo de todas as operações da API do ApsaraVideo VOD.