Ladda upp och indexera dina videor

Den här artikeln visar hur du laddar upp och indexerar videor med hjälp av webbplatsen Azure Video Analyzer for Media (tidigare Video Indexer) och Upload Video API.

När du skapar ett Video Analyzer for Media-konto väljer du mellan:

  • Ett kostnadsfritt utvärderingskonto. Video Analyzer for Media ger upp till 600 minuter kostnadsfri indexering till webbplatsanvändare och upp till 2 400 minuter kostnadsfri indexering för API-användare.
  • Ett betalalternativ där du inte begränsas av en kvot. Du skapar ett Video Analyzer for Media-konto som är anslutet till din Azure-prenumeration och ett Azure Media Services konto. Du betalar för indexerade minuter.

Mer information om kontotyper finns i Media Services priser.

När du laddar upp videor med hjälp av API:et har du följande alternativ:

  • Upload videon från en URL (rekommenderas).
  • Skicka videofilen som en bytematris i begärandetexten.
  • Använd en befintlig Azure Media Services tillgång genom att ange tillgångs-ID:t. Det här alternativet stöds endast i betalda konton.

Filformat som stöds

En lista över filformat som du kan använda med Video Analyzer för media finns i Standard Encoder formats and codecs.

Storage med videofiler

När du använder Video Analyzer för media lagras videofiler i Azure Storage via Media Services. Gränserna är 30 GB och 4 timmar långa.

Du kan alltid ta bort video- och ljudfiler, tillsammans med eventuella metadata och insikter som Video Analyzer för media har extraherat från dem. När du har tagit bort en fil från Video Analyzer för media tas filen och dess metadata och insikter bort permanent från Video Analyzer för media. Men om du har implementerat en egen säkerhetskopieringslösning i Azure Storage finns filen kvar i Azure Storage.

Persistensen för en video är identisk oavsett om du laddar upp med hjälp av webbplatsen Video Analyzer for Media eller med hjälp av Upload Video API.

Upload och indexera en video med hjälp av webbplatsen

Logga in på webbplatsen Video Analyzer for Media och välj sedan Upload.

Skärmbild som visar Upload knappen.

När videon har laddats upp börjar Video Analyzer för media indexera och analysera videon.

Skärmbild som visar förloppet för en uppladdning.

När Video Analyzer för media är klar med analysen får du ett e-postmeddelande med en länk till videon. E-postmeddelandet innehåller också en kort beskrivning av vad som hittades i videon (till exempel personer, ämnen, optisk teckenläsning).

Upload och indexera en video med hjälp av API:et

Du kan använda Upload Video API för att ladda upp och indexera dina videor baserat på en URL. Följande kodexempel innehåller den kommenterade koden som visar hur du laddar upp bytematrisen.

Konfigurationer och parametrar

I det här avsnittet beskrivs några av de valfria parametrarna och när de ska anges. Den senaste informationen om parametrar finns i Video Analyzer for Media-portalen.

externalID

Använd den här parametern för att ange ett ID som ska associeras med videon. ID:t kan tillämpas på integrering i ett externt VCM-system (videoinnehållshantering). De videor som finns i Video Analyzer for Media-portalen kan sökas igenom via det angivna externa ID:t.

callbackUrl

Använd den här parametern för att ange en motringnings-URL.

En motringning-URL används för att meddela kunden (via en POST-begäran) om följande händelser:

  • Indexering av tillståndsändring:

    • Egenskaper:

      Name Beskrivning
      id Video-ID:t
      state Videotillståndet
    • Exempel: https: / /test.com/notifyme?projectName=MyProject&id=1234abcd&state=Processed

  • Person som identifierades i videon:

    • Egenskaper

      Name Beskrivning
      id Video-ID:t
      faceId Ansikts-ID som visas i videoindexet
      knownPersonId Person-ID som är unikt inom en ansikts-modell
      personName Namnet på personen
    • Exempel: https: / /test.com/notifyme?projectName=MyProject&id=1234abcd&faceid=12&knownPersonId=UU84350-89B7-4262-861C-3CAC796542A5&personName=Inigo_Montoya

Video Analyzer for Media returnerar alla befintliga parametrar som anges i den ursprungliga URL:en. URL:en måste vara kodad.

indexingPreset

Använd den här parametern för att definiera ett AI-paket som du vill tillämpa på din ljud- eller videofil. Den här parametern används för att konfigurera indexeringsprocessen. Du kan ange följande värden:

  • AudioOnly: Indexera och extrahera insikter med endast ljud (ignorera video).

  • VideoOnly: Indexera och extrahera insikter med endast video (ignorera ljud).

  • Default: Indexera och extrahera insikter med hjälp av både ljud och video.

  • DefaultWithNoiseReduction: Indexera och extrahera insikter från både ljud och video, samtidigt som algoritmer för brusreducering tillämpas på ljudströmmen.

    Värdet DefaultWithNoiseReduction mappas nu till en förinställd standardinställning (inaktuell).

  • BasicAudio: Indexera och extrahera insikter med endast ljud (ignorera video). Inkludera endast grundläggande ljudfunktioner (transkription, översättning, formatering av utdatatexter och undertexter).

  • AdvancedAudio: Indexera och extrahera insikter med endast ljud (ignorera video). Inkludera avancerade ljudfunktioner (till exempel identifiering av ljudhändelse) utöver standardljudanalysen.

  • AdvancedVideo: Indexera och extrahera insikter med endast video (ignorera ljud). Inkludera avancerade videofunktioner (till exempel spårning av observerade personer) utöver standardvideoanalysen.

  • AdvancedVideoAndAudio: Indexera och extrahera insikter med hjälp av både avancerad ljud- och avancerad videoanalys.

Anteckning

Föregående avancerade förinställningar innehåller modeller som är i offentlig förhandsversion. När de här modellerna blir allmänt tillgängliga kan priset påverkas.

Video Analyzer for Media omfattar upp till två ljudspår. Om filen har fler ljudspår behandlas de som ett spår. Om du vill indexera spåren separat måste du extrahera den relevanta ljudfilen och indexera den som AudioOnly .

Priset beror på det valda indexeringsalternativet. Mer information finns i Media Services priser.

prioritet

Video Analyzer för media indexerar videor enligt deras prioritet. Använd priority parametern för att ange indexprioritet. Följande värden är giltiga: Low , Normal (standard) och High .

Den här parametern stöds endast för betalda konton.

streamingPreset

När videon har laddats upp kodar Video Analyzer för media om du vill. Sedan fortsätter det med indexering och analys av videon. När Video Analyzer för media är klar med analysen får du ett meddelande med video-ID:t.

När du använder api:et Upload Video eller Re-Index Video är en av de valfria parametrarna streamingPreset . Om du ställer in streamingPresetDefault, SingleBitrate eller AdaptiveBitrate utlöses kodningsprocessen.

När indexerings- och kodningsjobben är klara publiceras videon så att du även kan strömma videon. Slutpunkten för direktuppspelning som du vill spela upp videon från måste ha tillståndet Körs.

För SingleBitrate gäller standardkodarkostnaden för utdata. Om videohöjden är större än eller lika med 720 kodar Video Analyzer för media den som 1280 x 720. Annars kodas den som 640 x 468. Standardinställningen är innehållsmedveten kodning.

Om du bara vill indexera videon och inte koda den anger du streamingPreset till NoStreaming .

videoUrl

Den här parametern anger URL:en för video- eller ljudfilen som ska indexeras. Om parametern inte anges förväntar sig Video Analyzer for Media att du skickar filen videoUrl som multipart-/formulärinnehåll.

Kodexempel

Följande C#-kodfragment visar hur alla API:er för Video Analyzer for Media används tillsammans.

När du har kopierat följande kod till utvecklingsplattformen måste du ange två parametrar:

  • API-nyckel ( apiKey ): Din personliga prenumerationsnyckel för API Management. Det gör att du kan hämta en åtkomsttoken för att utföra åtgärder på ditt Video Analyzer for Media-konto.

    Så här hämtar du din API-nyckel:

    1. Gå till Video Analyzer för media-portalen.
    2. Logga in.
    3. Gå till Prenumeration på auktorisering > av > produkter.
    4. Kopiera värdet för Primärnyckel.
  • Video-URL ( videoUrl ): En URL till video- eller ljudfilen som ska indexeras. Här är kraven:

    • URL:en måste peka på en mediefil. (HTML-sidor stöds inte.)
    • Filen kan skyddas av en åtkomsttoken som tillhandahålls som en del av URI:en. Den slutpunkt som fungerar som fil måste skyddas med TLS 1.2 eller senare.
    • URL:en måste vara kodad.

Resultatet av att köra kodexe exemplet innehåller en URL för insiktswidgeten och en url för spelarwidgeten. De gör att du kan undersöka insikterna respektive den uppladdade videon.

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'll use the access token from here on, so there's 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 parameters 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; }
}