Carregar e indexar vídeos

Uma vez que o seu vídeo tenha sido carregado, o Azure Video Analyzer for Media (ex-Índice de Vídeo) codifica (opcionalmente) o vídeo (discutido no artigo). Ao criar um Analisador de Vídeo para conta Media, pode escolher uma conta de teste gratuita (onde obtém um determinado número de minutos de indexação gratuitos) ou uma opção paga (onde não está limitado pela quota). Com teste gratuito, o Video Analyzer for Media fornece até 600 minutos de indexação gratuita aos utilizadores do site e até 2400 minutos de indexação gratuita aos utilizadores da API. Com opção paga, cria um Analisador de Vídeo para a conta Media que está ligado à sua subscrição Azure e a uma conta Azure Media Services. Você paga por minutos indexados, para mais informações, consulte os preços dos Serviços de Mídia.

Ao carregar vídeos com Video Analyzer para API de Mídia, tem as seguintes opções de upload:

  • carregar o vídeo a partir de um URL (preferencial),
  • enviar o ficheiro de vídeo como um conjunto de byte no corpo de pedido,
  • Utilizar o recurso existente dos Serviços de Multimédia do Azure ao disponibilizar o ID do recurso (suportado apenas em contas pagas).

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

  • O Analisador de Vídeo para O Site media
  • O Analisador de Vídeo para APIs de Media

Formatos de ficheiros suportados para Analisador de Vídeo para Meios

Consulte o artigo de formatos de recipiente/ficheiro de entrada para obter uma lista de formatos de ficheiros que pode utilizar com o Video Analyzer for Media.

Armazenamento de ficheiros de vídeo

  • Com uma conta de Vídeo Analisador de Vídeo pago para Media, cria-se um Analisador de Vídeo para a conta Media que está ligado à sua subscrição Azure e a uma conta Azure Media Services. Para obter mais informações, consulte Criar um Analisador de Vídeo para a conta Media ligado ao Azure.
  • Os ficheiros de vídeo são armazenados no armazém da Azure media Services. Não há limitação de tempo.
  • Pode sempre eliminar os seus ficheiros de vídeo e áudio, bem como quaisquer metadados e insights extraídos dos mesmos pelo Video Analyzer for Media. Uma vez eliminado um ficheiro do Video Analyzer for Media, o ficheiro e os seus metadados e insights são permanentemente removidos do Analisador de Vídeo para Meios. No entanto, se implementou a sua própria solução de backup no armazenamento Azure, o ficheiro permanece no seu armazenamento Azure.
  • A persistência de um vídeo é idêntica, independentemente de o upload for feito formar o Analisador de Vídeo para o website media ou utilizar a API de upload.

Faça upload e indexe um vídeo usando o site video analyzer for Media

Nota

O nome do vídeo não pode ter mais de 80 carateres.

  1. Inscreva-se no site do Video Analyzer for Media.

  2. Para carregar um vídeo, selecione o botão ou ligação Upload (Carregar)

    Carregar

  3. Uma vez que o seu vídeo foi carregado, o Video Analyzer for Media começa a indexar e analisar o vídeo.

    Progresso do upload

  4. Assim que o Video Analyzer for Media for For Media for for done, receberá um e-mail com um link para o seu vídeo e uma breve descrição do que foi encontrado no seu vídeo. Por exemplo: people (pessoas), topics (tópicos), OCRs.

Upload e índice com API

Utilize a API de vídeo upload para carregar e indexar os seus vídeos com base num URL. A amostra de código que se segue inclui o código comentado que mostra como carregar o conjunto byte.

Configurações e parâmetros

Esta secção descreve alguns dos parâmetros opcionais e quando deve defini-los. Para obter informações mais atualizadas sobre params, consulte a API de vídeo upload.

externalID

Este parâmetro permite-lhe especificar um ID que será associado ao vídeo. O ID pode ser aplicado à integração de sistemas externa de "Gestão de Conteúdo de Vídeo" (VCM). Os vídeos localizados no portal Video Analyzer for Media podem ser pesquisados através do ID externo especificado.

callbackUrl

Um URL que é usado para notificar o cliente (usando um pedido POST) sobre os seguintes eventos:

  • Alteração do 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=Processado

  • Pessoa identificada em vídeo:
    • Propriedades

      Nome Descrição
      ID A iD de vídeo
      faceId O ID do rosto que aparece no índice de vídeo
      conhecidoPersonId A pessoa ID que é única dentro de um modelo de rosto
      nome de pessoa O nome da pessoa
      • Exemplo: https: / /test.com/notifyme?projectName=MyProject&id=1234abcd&faceid=12&conhecidoPersonId=CCA84350-89B7-4262-861C-3CAC796542A5&personName=Inigo_Montoya
Outras considerações
  • O Analisador de Vídeo para Meios de Comunicação Retorna quaisquer parâmetros existentes fornecidos no URL original.
  • A URL fornecida deve ser codificada.

indexingPreset

Utilize este parâmetro para definir o pacote de IA que gostaria de aplicar no seu ficheiro de áudio ou vídeo . Este parâmetro é utilizado para configurar o processo de indexação. Pode especificar os seguintes valores:

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

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

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

  • DefaultWithNoiseReduction – Indexar e extrair insights tanto de áudio como de vídeo, ao mesmo tempo que aplica algoritmos de redução de ruído no fluxo de áudio.

    O DefaultWithNoiseReduction valor é agora mapeado para predefinição predefinida (predefinido).

  • BasicAudio - Informações de índice e extração utilizando apenas áudio (ignorando vídeo), incluindo apenas funcionalidades de áudio básicas (transcrição, tradução, legendas de saída de formato e legendas).

  • AdvancedAudio - Informações de índice e extração utilizando apenas áudio (ignorando vídeo), incluindo funcionalidades de áudio avançadas (deteção de eventos áudio) para além da análise áudio padrão.

  • AdvancedVideo - Indexar e extrair insights usando apenas vídeo (ignorando áudio), incluindo funcionalidades de vídeo avançadas (Rastreio de Pessoas Observadas) para além da análise padrão de vídeo.

  • AdvancedVideoAndAudio - Informações de índice e extração utilizando análise sonora avançada e vídeo avançada.

Nota

As predefinições avançadas (listadas acima) incluem modelos que estão em pré-visualização pública. Uma vez que estes modelos vão GA, pode haver implicações no preço.

O Indexer de Vídeo cobre até duas faixas de áudio. Se houver mais faixas de áudio no ficheiro, serão tratadas como uma faixa.
Se pretender indexar as faixas separadamente, terá de extrair o ficheiro áudio relevante e indexá-lo como AudioOnly .

O preço varia consoante a opção de indexação selecionada. Para mais informações consulte os preços dos Serviços de Comunicação Social.

prioridade

Os vídeos são indexados pelo Video Analyzer for Media de acordo com a sua prioridade. Utilize o parâmetro prioritário para especificar a prioridade do índice. Os seguintes valores são válidos: Baixo, Normal (padrão) e Alto.

O parâmetro prioritário só é suportado para contas pagas.

streamingPreset

Uma vez que o seu vídeo tenha sido carregado, o Video Analyzer for Media, codifica opcionalmente o vídeo. Em seguida, indexa e analisa o vídeo. Quando o Video Analyzer for Media for For Media for done, receberá uma notificação com o ID de vídeo.

Ao utilizar a API Carregar vídeo ou Reindexar Vídeo, um dos parâmetros opcionais é streamingPreset. Se definir o parâmetro streamingPreset para Default, SingleBitrate ou AdaptiveBitrate, o processo de codificação é acionado. Assim que as tarefas de indexação e codificação estiverem concluídas, o vídeo é publicado para que também o possa transmitir em fluxo. O Ponto Final de Transmissão em Fluxo a partir do qual quer transmitir o vídeo tem de estar no estado Em execução.

Para o SingleBitrate, o custo padrão do codificador será aplicado por saída. Se a altura do vídeo for maior ou igual a 720, o Video Analyzer for Media codifica-o como 1280x720. Caso contrário, como 640x468. A definição predefinição é codificação de conteúdo consciente.

Para executar os trabalhos de indexação e codificação, a conta Azure Media Services ligada à sua conta de Video Analyzer for Mediarequer Unidades Reservadas. Para obter mais informações, veja Scaling Media Processing (Dimensionar o Processamento de Multimédia). Como estas são tarefas de computação intensiva, o tipo de unidade S3 é altamente recomendado. O número de RUs define o número máximo de tarefas que podem ser executadas em paralelo. A recomendação de linha de base é de 10 RUs S3.

Se quiser indexar o seu vídeo mas não quiser codificá-lo, defina o parâmetro streamingPreset para NoStreaming.

videoUrl

Um URL do ficheiro de vídeo/áudio a ser indexado. O URL tem de apontar para um ficheiro de multimédia (não são suportadas páginas HTML). O ficheiro pode ser protegido por um token de acesso fornecido como parte do URI e o ponto final que entrega o ficheiro tem de estar protegido pelo TLS 1.2 ou superior. O URL tem de ser codificado.

Se o videoUrl não for especificado, o Analisador de Vídeo para Meios de Comunicação Espera que passe o ficheiro como um conteúdo corporal multiparte/formulário.

Exemplo de código

O seguinte corte de código C# demonstra a utilização de todos os Analisadores de Vídeo para APIs de Mídia em conjunto.

Instruções para executar a seguinte amostra de código

Depois de copiar este código na sua plataforma de desenvolvimento, terá de fornecer dois parâmetros: chave de autenticação de API Management e URL de vídeo.

  • Chave API – Api é a sua chave de subscrição de gestão de API pessoal, que lhe permitirá obter um token de acesso para realizar operações na sua conta de Vídeo Analyzer for Media.

    Para obter a sua chave API, passe por este fluxo:

  • URL de vídeo – UM URL do ficheiro vídeo/áudio a ser indexado. O URL tem de apontar para um ficheiro de multimédia (não são suportadas páginas HTML). O ficheiro pode ser protegido por um token de acesso fornecido como parte do URI e o ponto final que entrega o ficheiro tem de estar protegido pelo TLS 1.2 ou superior. O URL tem de ser codificado.

O resultado de uma execução com sucesso da amostra de código incluirá um URL widget de insight e um URL widget do jogador que lhe permitirá examinar as insights 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 estado indicados na tabela seguinte podem ser devolvidos pela operação de Carregamento.

Código de estado ErrorType (no corpo da resposta) Description
409 VIDEO_INDEXING_IN_PROGRESS O mesmo vídeo já está a ser processado na conta específica.
400 VIDEO_ALREADY_FAILED Falha ao processar o mesmo vídeo na conta específica há menos de 2 horas. Os clientes da API devem aguardar pelo menos 2 horas antes de voltarem a carregar um vídeo.
429 As contas de julgamento são permitidas 5 uploads por minuto. As contas pagas são permitidas 50 uploads por minuto.

Considerações e limitações de carregamento

  • O nome do vídeo não pode ter mais de 80 carateres.

  • Ao carregar o vídeo com base no URL (preferencial), o ponto final tem de estar protegido pelo TLS 1.2 (ou posterior).

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

  • O comprimento do URL do pedido está limitado a 6144 carateres, ao passo que o comprimento do URL da cadeia de consulta está limitado a 4096 caracteres.

  • O tamanho do carregamento com a opção de matriz de bytes está limitado a 2 GB.

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

  • A URL fornecida no videoURL param precisa de ser codificada.

  • Indexar os recursos dos Serviços de Multimédia tem a mesma limitação que a indexação do URL.

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

  • O URL tem de estar acessível (por exemplo, um URL público).

    Se for um URL privado, o token de acesso terá ser disponibilizado no pedido.

  • O URL tem de apontar para um ficheiro de mídia válido e não para uma página web, como um link para a www.youtube.com página.

  • Numa conta paga, pode carregar até 50 filmes por minuto e, numa conta de avaliação, até 5 filmes por minuto.

Dica

Recomenda-se a utilização da versão 4.6.2 do .NET Framework ou superior porque as versões .NET Framework mais antigas não têm como predefinição o TLS 1.2.

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

Firewall

Consulte a conta de armazenamento que está por detrás de uma firewall.

Passos seguintes

Examine o Azure Video Analyzer for Media output produzido pela API