Carregar e indexar seus vídeos

Depois que o vídeo for carregado, o Analisador de Vídeo do Azure para Mídia (antigo Video Indexer) codificará (opcionalmente) o vídeo (discutido no artigo). Ao criar uma conta do Analisador de Vídeo para Mídia, você pode escolher uma conta de avaliação gratuita (em que você obtém um determinado número de minutos de indexação gratuitos) ou uma opção paga (onde você não está limitado pela cota). Com o teste gratuito, o Analisador de Vídeo para Mídia fornece até 600 minutos de indexação gratuita para usuários do site e até 2400 minutos de indexação gratuita para usuários da API. Com a opção paga, você cria uma conta do Analisador de Vídeo para Mídia que está conectada à sua assinatura do Azure e a uma conta dos Serviços de Mídia do Azure. Você paga pelos minutos indexados. Para obter mais informações, confira Preços dos Serviços de Mídia.

Ao carregar vídeos com a API do Analisador de Vídeo para Mídia, você tem as seguintes opções de upload:

  • Carregue o vídeo de uma URL (preferido),
  • envie o arquivo de vídeo como uma matriz de bytes no corpo da solicitação,
  • Use o ativo de Serviços de Mídia do Azure existente, fornecendo a ID do ativo (suporte somente nas contas pagas).

O artigo mostra como carregar e indexar seus vídeos com estas opções:

  • O site do Analisador de Vídeo para Mídia
  • As APIs do Analisador de Vídeo para Mídia

Formatos de arquivo com suporte para o Analisador de Vídeo para Mídia

Confira o artigo contêiner de entrada/formatos de arquivo para obter uma lista de formatos de arquivo que você pode usar com o Analisador de Vídeo para Mídia.

Armazenamento de arquivos de vídeo

  • Com uma conta paga do Analisador de Vídeo para Mídia, você cria uma conta do Analisador de Vídeo para Mídia que está conectada à sua assinatura do Azure e a uma conta dos Serviços de Mídia do Azure. Para saber mais, confira Criar uma conta do Analisador de Vídeo para Mídia conectada ao Azure.
  • Os arquivos de vídeo são armazenados no armazenamento do Azure pelos Serviços de Mídia do Azure. Não existe limite de tempo.
  • É possível excluir os arquivos de áudio e vídeo a qualquer momento, assim como metadados ou insights extraídos a partir desses arquivos pelo Analisador de Vídeo para Mídia. Quando você exclui um arquivo do Analisador de Vídeo para Mídia, o arquivo e os respectivos metadados e insights são removidos permanentemente do Analisador de Vídeo para Mídia. No entanto, se você implementou sua própria solução de backup no armazenamento do Azure, o arquivo permanece no seu armazenamento do Azure.
  • A persistência de um vídeo é idêntica, independentemente de o carregamento ser feito do site do Analisador de Vídeo para Mídia ou usando a API de carregamento.

Carregar e indexar um vídeo usando o site do Analisador de Vídeo para Mídia

Observação

Um nome do vídeo não deve ter mais de 80 caracteres.

  1. Entre no site do Analisador de Vídeo para Mídia.

  2. Para carregar um vídeo, pressione o botão ou o link Carregar.

    Upload

  3. Depois que o vídeo tiver sido carregado, o Analisador de Vídeo para Mídia iniciará a indexação e a análise do vídeo.

    Progresso do upload

  4. Depois que o Analisador de Vídeo para Mídia terminar de analisar, você receberá um email com um link para seu vídeo e uma breve descrição do que foi encontrado nele. Por exemplo: people (pessoas), topics (tópicos), OCRs.

Carregar e indexar com a API

O artigo mostra como usar a API deupload de vídeo para fazer upload e indexar seus vídeos com base em um URL. O exemplo de código no artigo inclui o código comentado que mostra como carregar a matriz de bytes.

Configurações e parâmetros

Esta seção descreve alguns parâmetros opcionais e quando você deseja defini-los. Para as informações de parâmetros mais atualizados, consulte a API de upload de vídeo.

externalID

Este parâmetro permite que você especifique uma ID que será associada ao vídeo. A ID pode ser aplicada à integração de sistema externa VCM (Gerenciamento de Conteúdo de Vídeo). Os vídeos localizados no portal do Analisador de Vídeo para Mídia podem ser procuraros com a ID externa especificada.

callbackUrl

Uma URL usada para notificar o cliente (usando uma solicitação POST) sobre os eventos a seguir:

  • Alteração de estado de indexação:
    • Propriedades:

      Nome Descrição
      id A ID de vídeo
      state O estado do vídeo
    • Exemplo: https://test.com/notifyme?projectName=MyProject&id=1234abcd&state=Processed

  • Pessoa identificada no vídeo:
    • Propriedades

      Nome Descrição
      id A ID de vídeo
      faceId A identificação de face que aparece no índice de vídeo
      knownPersonId A ID da pessoa que é exclusiva dentro de um modelo de detecção facial
      personName O nome da pessoa
      • Exemplo: https://test.com/notifyme?projectName=MyProject&id=1234abcd&faceid=12&knownPersonId=CCA84350-89B7-4262-861C-3CAC796542A5&personName=Inigo_Montoya
Outras considerações
  • O Analisador de Vídeo para Mídia retorna parâmetros existentes fornecidos na URL original.
  • A URL fornecida deve ser codificada.

indexingPreset

Use esse parâmetro para definir o pacote de IA que você deseja aplicar em seu arquivo de áudio ou de vídeo. Esse parâmetro é usado para configurar o processo de indexação. É possível especificar os seguintes valores:

  • AudioOnly – Indexar e extrair insights usando apenas o áudio (ignorando o vídeo).

  • VideoOnly – Indexar e extrair insights usando apenas o vídeo (ignorando o áudio).

  • Default – Indexar e extrair insights usando áudio e vídeo.

  • DefaultWithNoiseReduction – Indexar e extrair insights de áudio e vídeo durante a aplicação de algoritmos de redução de ruído no fluxo de áudio.

    O DefaultWithNoiseReduction valor agora é mapeado para predefinição padrão (preterido).

  • BasicAudio - Indexe e extraia ideias usando apenas o áudio (ignorando o vídeo), incluindo apenas os recursos básicos de áudio (transcrição, tradução, formatar legendas de saída e legendas).

  • AdvancedAudio - Indexe e extraia informações usando o áudio apenas (ignorando o vídeo), incluindo recursos avançados de áudio (detecção de eventos de áudio), além da análise de áudio padrão.

  • AdvancedVideo -Indexe e extraia insights usando somente vídeo (ignorando áudio), inclusive recursos avançados de vídeo (rastreamento de pessoas observadas) além da análise de vídeo padrão.

  • AdvancedVideoAndAudio -Indexe e extraia insights usando áudio avançado e análise avançada de vídeo.

Observação

As predefinições avançadas (listadas acima) incluem modelos em versão preliminar pública. Depois que esses modelos ficarem em disponibilidade geral, pode haver implicações no preço.

O Video Indexer abrange até duas faixas de áudio. Se houver mais faixas de áudio no arquivo, elas serão tratadas como uma faixa.
Se você quiser indexar as faixas separadamente, será necessário extrair o arquivo de áudio relevante e indexá-lo como AudioOnly.

O preço depende da opção de indexação selecionada. Para mais informações, consulteDetalhes dos preços dos Serviços de Mídia.

priority

Os vídeos são indexados pelo Analisador de Vídeo para Mídia de acordo com a prioridade. Use o parâmetro priority para especificar a prioridade de índice. Os seguintes valores são válidos: Baixo, Normal (padrão) e Alto.

O parâmetro priority tem suporte apenas para contas pagas.

streamingPreset

Depois que o vídeo tiver sido carregado, o Analisador de Vídeo para Mídia codificará (opcionalmente) o vídeo. Em seguida, passe para a indexação e análise do vídeo. Quando o Analisador de Vídeo para Mídia terminar a análise, você receberá uma notificação com a ID do vídeo.

Ao usar a API Carregar vídeo ou Reindexar vídeo, um dos parâmetros opcionais é streamingPreset. Se você definir streamingPreset como Default, SingleBitrate ou AdaptiveBitrate, o processo de codificação será disparado. Depois que os trabalhos de indexação e codificação forem concluídos, o vídeo será publicado para que você também possa transmiti-lo. O Ponto de extremidade de streaming do qual você deseja transmitir o vídeo deve estar no estado Executando.

Para o SingleBitrate, o custo padrão do codificador será aplicado de acordo com a saída. Se a altura do vídeo for maior ou igual a 720, o Analisador de Vídeo para Mídia o codificará como 1280x720. Caso contrário, como 640x468. A configuração padrão é codificação com reconhecimento de conteúdo.

Para executar trabalhos de indexação e de codificação, a conta dos Serviços de Mídia do Azure conectada à sua conta do Analisador de Vídeo para Mídia, requer unidades reservadas. Para obter mais informações, consulte Scaling Media Processing (Colocação em escala do processamento de mídia). Como esses são trabalhos com uso intensivo de computação, o tipo de unidade S3 é altamente recomendável. O número de RUs define o número máximo de trabalhos que podem ser executados em paralelo. A recomendação de linha de base é de 10 RUs de S3.

Se você apenas deseja indexar seu vídeo, mas não o codificar, defina streamingPreset como NoStreaming.

VideoUrl

Uma URL do arquivo de áudio/vídeo a serem indexados. O URL deve apontar para um arquivo de mídia (as páginas HTML não são suportadas). O arquivo pode ser protegido por um token de acesso fornecido como parte do URI e o terminal que atende ao arquivo deve ser protegido com o TLS 1.2 ou superior. A URL deve ser codificado.

Se o videoUrl não for especificado, o Analisador de Vídeo para Mídia espera que você passe o arquivo como um conteúdo de corpo de várias partes/formulário.

Exemplo de código

O seguinte snippet de código em C# demonstra o uso de todas as APIs do Analisador de Vídeo para Mídia juntos.

Instruções para executar o exemplo de código a seguir

Depois de copiar esse código em sua plataforma de desenvolvimento, você precisará fornecer dois parâmetros: chave de autenticação do gerenciamento de API e URL de vídeo.

  • Chave de API – a chave de API é a sua chave de assinatura de gerenciamento de API pessoal, que permitirá que você obtenha um token de acesso para executar operações em sua conta do Analisador de Vídeo para Mídia.

    Para obter a sua chave de API, siga este fluxo:

  • URL do vídeo – uma URL do arquivo de áudio/vídeo a serem indexados. O URL deve apontar para um arquivo de mídia (as páginas HTML não são suportadas). O arquivo pode ser protegido por um token de acesso fornecido como parte do URI e o terminal que atende ao arquivo deve ser protegido com o TLS 1.2 ou superior. A URL deve ser codificado.

O resultado da execução bem-sucedida do exemplo de código incluirá uma URL do widget de insight e uma URL do widget do player que permitirá que você examine as informações e o vídeo carregados, respectivamente.

public async Task Sample()
{
    var apiUrl = "https://api.videoindexer.ai";
    var apiKey = "..."; // replace with API key taken from https://aka.ms/viapi

    System.Net.ServicePointManager.SecurityProtocol =
        System.Net.ServicePointManager.SecurityProtocol | System.Net.SecurityProtocolType.Tls12;

    // create the http client
    var handler = new HttpClientHandler();
    handler.AllowAutoRedirect = false;
    var client = new HttpClient(handler);
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", apiKey);

    // obtain account information and access token
    string queryParams = CreateQueryString(
        new Dictionary<string, string>()
        {
            {"generateAccessTokens", "true"},
            {"allowEdit", "true"},
        });
    HttpResponseMessage result = await client.GetAsync($"{apiUrl}/auth/trial/Accounts?{queryParams}");
    var json = await result.Content.ReadAsStringAsync();
    var accounts = JsonConvert.DeserializeObject<AccountContractSlim[]>(json);
    
    // take the relevant account, here we simply take the first, 
    // you can also get the account via accounts.First(account => account.Id == <GUID>);
    var accountInfo = accounts.First();

    // we will use the access token from here on, no need for the apim key
    client.DefaultRequestHeaders.Remove("Ocp-Apim-Subscription-Key");

    // upload a video
    var content = new MultipartFormDataContent();
    Console.WriteLine("Uploading...");
    // get the video from URL
    var videoUrl = "VIDEO_URL"; // replace with the video URL

    // as an alternative to specifying video URL, you can upload a file.
    // remove the videoUrl parameter from the query params below and add the following lines:
    //FileStream video =File.OpenRead(Globals.VIDEOFILE_PATH);
    //byte[] buffer =new byte[video.Length];
    //video.Read(buffer, 0, buffer.Length);
    //content.Add(new ByteArrayContent(buffer));

    queryParams = CreateQueryString(
        new Dictionary<string, string>()
        {
            {"accessToken", accountInfo.AccessToken},
            {"name", "video_name"},
            {"description", "video_description"},
            {"privacy", "private"},
            {"partition", "partition"},
            {"videoUrl", videoUrl},
        });
    var uploadRequestResult = await client.PostAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos?{queryParams}", content);
    var uploadResult = await uploadRequestResult.Content.ReadAsStringAsync();

    // get the video ID from the upload result
    string videoId = JsonConvert.DeserializeObject<dynamic>(uploadResult)["id"];
    Console.WriteLine("Uploaded");
    Console.WriteLine("Video ID:");
    Console.WriteLine(videoId);

    // wait for the video index to finish
    while (true)
    {
        await Task.Delay(10000);

        queryParams = CreateQueryString(
            new Dictionary<string, string>()
            {
                {"accessToken", accountInfo.AccessToken},
                {"language", "English"},
            });

        var videoGetIndexRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/Index?{queryParams}");
        var videoGetIndexResult = await videoGetIndexRequestResult.Content.ReadAsStringAsync();

        string processingState = JsonConvert.DeserializeObject<dynamic>(videoGetIndexResult)["state"];

        Console.WriteLine("");
        Console.WriteLine("State:");
        Console.WriteLine(processingState);

        // job is finished
        if (processingState != "Uploaded" && processingState != "Processing")
        {
            Console.WriteLine("");
            Console.WriteLine("Full JSON:");
            Console.WriteLine(videoGetIndexResult);
            break;
        }
    }

    // search for the video
    queryParams = CreateQueryString(
        new Dictionary<string, string>()
        {
            {"accessToken", accountInfo.AccessToken},
            {"id", videoId},
        });

    var searchRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/Search?{queryParams}");
    var searchResult = await searchRequestResult.Content.ReadAsStringAsync();
    Console.WriteLine("");
    Console.WriteLine("Search:");
    Console.WriteLine(searchResult);

    // Generate video access token (used for get widget calls)
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", apiKey);
    var videoTokenRequestResult = await client.GetAsync($"{apiUrl}/auth/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/AccessToken?allowEdit=true");
    var videoAccessToken = (await videoTokenRequestResult.Content.ReadAsStringAsync()).Replace("\"", "");
    client.DefaultRequestHeaders.Remove("Ocp-Apim-Subscription-Key");

    // get insights widget url
    queryParams = CreateQueryString(
        new Dictionary<string, string>()
        {
            {"accessToken", videoAccessToken},
            {"widgetType", "Keywords"},
            {"allowEdit", "true"},
        });
    var insightsWidgetRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/InsightsWidget?{queryParams}");
    var insightsWidgetLink = insightsWidgetRequestResult.Headers.Location;
    Console.WriteLine("Insights Widget url:");
    Console.WriteLine(insightsWidgetLink);

    // get player widget url
    queryParams = CreateQueryString(
        new Dictionary<string, string>()
        {
            {"accessToken", videoAccessToken},
        });
    var playerWidgetRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/PlayerWidget?{queryParams}");
    var playerWidgetLink = playerWidgetRequestResult.Headers.Location;
     Console.WriteLine("");
     Console.WriteLine("Player Widget url:");
     Console.WriteLine(playerWidgetLink);
     Console.WriteLine("\nPress Enter to exit...");
     String line = Console.ReadLine();
     if (line == "enter")
     {
         System.Environment.Exit(0);
     }

}

private string CreateQueryString(IDictionary<string, string> parameters)
{
    var queryParameters = HttpUtility.ParseQueryString(string.Empty);
    foreach (var parameter in parameters)
    {
        queryParameters[parameter.Key] = parameter.Value;
    }

    return queryParameters.ToString();
}

public class AccountContractSlim
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }
    public string AccountType { get; set; }
    public string Url { get; set; }
    public string AccessToken { get; set; }
}

Erros comuns

Os códigos de status listados na tabela a seguir podem ser retornados pela operação de Upload.

Código de status ErrorType (no corpo da resposta) Descrição
409 VIDEO_INDEXING_IN_PROGRESS O mesmo vídeo já está em curso de ser processado na conta especificada.
400 VIDEO_ALREADY_FAILED O mesmo vídeo falhou ao processar na conta informada há menos de duas horas. Os clientes da API devem aguardar pelo menos duas horas antes de carregar novamente um vídeo.
429 São permitidos 5 uploads por minuto para as contas de avaliação. São permitidos 50 uploads por minuto para as contas pagas.

Considerações e limitações do upload

  • Um nome do vídeo não deve ter mais de 80 caracteres.

  • Ao fazer o upload do seu vídeo com base no URL (preferencial), o ponto de extremidade deve ser protegido com o TLS 1.2 (ou superior).

  • O tamanho de upload com a opção de URL está limitado a 30 GB.

  • O comprimento da URL de solicitação é limitado a 6.144 caracteres e o comprimento da URL da cadeia de caracteres de consulta é limitado a 4.096 caracteres.

  • O tamanho de upload com a opção de matriz de bytes é limitado a 2 GB.

  • A opção de matriz de bytes atinge o tempo limite após 30 min.

  • A URL fornecida no videoURL parâmetro precisa ser codificada.

  • A indexação de ativos dos Serviços de Mídia tem a mesma limitação de indexação de URL.

  • O Analisador de Vídeo para Mídia tem um limite de duração máximo de 4 horas para um único arquivo.

  • A URL precisa estar acessível (por exemplo, uma URL pública).

    Se for uma URL privada, o token de acesso precisará ser fornecido na solicitação.

  • A URL deve apontar para um arquivo de mídia válido e não para uma página da web, como um link para a www.youtube.compágina.

  • Em uma conta paga, você pode carregar até 50 filmes por minuto e, em uma conta de avaliação gratuita, até 5 filmes por minuto.

Dica

É recomendável usar o .NET Framework versão 4.6.2. ou superior porque versões mais antigas do .NET Framework não usam TLS 1.2 por padrão.

Se você precisar usar versões mais antigas do .NET Framework, adicione uma linha em seu código antes de fazer a chamada à API REST:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Firewall

Confira Conta de armazenamento que está atrás de um firewall.

Próximas etapas

Examinar a saída do Analisador de Vídeo do Azure para Mídia produzida pela API