Didacticiel : Analyser des vidéos avec Media Services v3Tutorial: Analyze videos with Media Services v3

Notes

Bien que ce tutoriel utilise les exemples du SDK .NET, les étapes générales sont les mêmes pour l’API REST, l’interface CLI et d’autres SDK pris en charge.Even though this tutorial uses the .NET SDK examples, the general steps are the same for REST API, CLI, or other supported SDKs.

Ce didacticiel vous montre comment analyser des vidéos avec Azure Media Services.This tutorial shows you how to analyze videos with Azure Media Services. Il existe plusieurs scénarios dans lesquels vous pouvez souhaiter obtenir des informations détaillées sur vos vidéos enregistrées ou vos contenus audio.There are many scenarios in which you might want to gain deep insights into recorded videos or audio content. Par exemple, pour obtenir une satisfaction plus élevée des clients, les organisations peuvent exécuter un traitement de reconnaissance vocale pour convertir les enregistrements du support client en un catalogue pouvant faire l’objet de recherches, avec des index et des tableaux de bord.For example, to achieve higher customer satisfaction, organizations can run speech-to-text processing to convert customer support recordings into a searchable catalog, with indexes and dashboards. Ensuite, elles peuvent obtenir des insights sur leur activité,Then, they can obtain insights into their business. par exemple, la liste des réclamations courantes avec leurs sources, et d’autres informations utiles.These insights include a list of common complaints, sources of such complaints, and other useful information.

Ce didacticiel vous explique les procédures suivantes :This tutorial shows you how to:

  • Télécharger l’exemple d’application décrit dans la rubrique.Download the sample app described in the topic.
  • Examiner le code qui analyse la vidéo spécifiée.Examine the code that analyzes the specified video.
  • Exécutez l'application.Run the app.
  • Analyser la sortie.Examine the output.
  • Supprimer des ressources.Clean up resources.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.If you don't have an Azure subscription, create a free account before you begin.

PrérequisPrerequisites

Télécharger et configurer l’exempleDownload and configure the sample

Clonez un référentiel GitHub qui contient l’exemple .NET sur votre machine à l’aide de la commande suivante :Clone a GitHub repository that contains the .NET sample to your machine using the following command:

git clone https://github.com/Azure-Samples/media-services-v3-dotnet-tutorials.git

L’exemple se trouve dans le dossier AnalyzeVideos.The sample is located in the AnalyzeVideos folder.

Ouvrez appsettings.json dans votre projet téléchargé.Open appsettings.json in your downloaded project. Remplacez les valeurs par les informations d’identification que vous avez obtenues en accédant aux API.Replace the values with the credentials you got from accessing APIs.

Examiner le code qui analyse la vidéo spécifiéeExamine the code that analyzes the specified video

Cette section examine les fonctions définies dans le fichier Program.cs du projet AnalyzeVideos.This section examines functions defined in the Program.cs file of the AnalyzeVideos project.

L’exemple effectue les actions suivantes :The sample completes the following actions:

  1. Crée une transformation et un travail qui analyse votre vidéo.Creates a Transform and a Job that analyzes your video.
  2. Crée une actif multimédia d’entrée et charge la vidéo dans celui-ci.Creates an input Asset and uploads the video into it. La ressource d’entrée est utilisée en tant qu’entrée du travail.The asset is used as the job's input.
  3. Créer une ressource de sortie qui stocke la sortie du travail.Creates an output asset that stores the job's output.
  4. Soumettre le travail.Submits the job.
  5. Vérifier l’état du travail.Checks the job's status.
  6. Télécharger les fichiers qui résultent de l’exécution du travail.Downloads the files that resulted from running the job.

Notes

Lorsque vous utilisez des présélections pour l’analyseur vidéo ou audio, utilisez le Portail Azure pour paramétrer votre compte de sorte à ce qu’il dispose de 10 unités réservées Multimédia S3.When using a Video or Audio Analyzer presets, use the Azure portal to set your account to have 10 S3 Media Reserved Units. Pour plus d’informations, consultez Vue d’ensemble de la mise à l’échelle du traitement multimédia.For more information, see Scale media processing.

Commencer à utiliser les API Media Services avec le Kit de développement logiciel (SDK) .NETStart using Media Services APIs with .NET SDK

Pour commencer à utiliser les API Media Services avec .NET, vous devez créer un objet AzureMediaServicesClient.To start using Media Services APIs with .NET, you need to create an AzureMediaServicesClient object. Pour créer l’objet, vous devez fournir les informations d’identification nécessaires pour que le client puisse se connecter à Azure à l’aide d’Azure AD.To create the object, you need to supply credentials needed for the client to connect to Azure using Azure AD. Dans le code que vous avez cloné au début de l’article, la fonction GetCredentialsAsync crée l’objet ServiceClientCredentials basé sur les informations d’identification fournies dans le fichier de configuration local.In the code you cloned at the beginning of the article, the GetCredentialsAsync function creates the ServiceClientCredentials object based on the credentials supplied in local configuration file.

private static async Task<IAzureMediaServicesClient> CreateMediaServicesClientAsync(ConfigWrapper config)
{
    var credentials = await GetCredentialsAsync(config);

    return new AzureMediaServicesClient(config.ArmEndpoint, credentials)
    {
        SubscriptionId = config.SubscriptionId,
    };
}

Créer une ressource d’entrée et charger un fichier local dans celle-ciCreate an input asset and upload a local file into it

La fonction CreateInputAsset crée une nouvelle ressource d’entrée et charge le fichier vidéo local spécifié dans celle-ci.The CreateInputAsset function creates a new input Asset and uploads the specified local video file into it. Cette ressource est utilisée en tant qu’entrée de votre travail d’encodage.This Asset is used as the input to your encoding Job. Dans Media Services v3, l’entrée d’un travail peut être une ressource ou bien le contenu que vous mettez à la disposition de votre compte Media Services via des URL HTTPS.In Media Services v3, the input to a Job can either be an Asset, or it can be content that you make available to your Media Services account via HTTPS URLs. Pour savoir comment encoder à partir d’une URL HTTPS, consultez cet article.To learn how to encode from an HTTPS URL, see this article.

Dans Media Services v3, vous utilisez des API Stockage Azure pour charger des fichiers.In Media Services v3, you use Azure Storage APIs to upload files. L’extrait de code .NET suivant vous explique comment faire.The following .NET snippet shows how.

La fonction suivante effectue ces actions :The following function completes these actions:

  • Crée une ressource.Creates an Asset.
  • Obtient une URL SAS accessible en écriture vers le conteneur de stockage de la ressource.Gets a writable SAS URL to the Asset’s container in storage.
  • Charge le fichier dans le conteneur de stockage à l’aide de l’URL SAP.Uploads the file into the container in storage using the SAS URL.
private static async Task<Asset> CreateInputAssetAsync(
    IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string assetName,
    string fileToUpload)
{
    // In this example, we are assuming that the asset name is unique.
    //
    // If you already have an asset with the desired name, use the Assets.Get method
    // to get the existing asset. In Media Services v3, the Get method on entities returns null 
    // if the entity doesn't exist (a case-insensitive check on the name).

    // Call Media Services API to create an Asset.
    // This method creates a container in storage for the Asset.
    // The files (blobs) associated with the asset will be stored in this container.
    Asset asset = await client.Assets.CreateOrUpdateAsync(resourceGroupName, accountName, assetName, new Asset());

    // Use Media Services API to get back a response that contains
    // SAS URL for the Asset container into which to upload blobs.
    // That is where you would specify read-write permissions 
    // and the exparation time for the SAS URL.
    var response = await client.Assets.ListContainerSasAsync(
        resourceGroupName,
        accountName,
        assetName,
        permissions: AssetContainerPermission.ReadWrite,
        expiryTime: DateTime.UtcNow.AddHours(4).ToUniversalTime());

    var sasUri = new Uri(response.AssetContainerSasUrls.First());

    // Use Storage API to get a reference to the Asset container
    // that was created by calling Asset's CreateOrUpdate method.  
    CloudBlobContainer container = new CloudBlobContainer(sasUri);
    var blob = container.GetBlockBlobReference(Path.GetFileName(fileToUpload));

    // Use Strorage API to upload the file into the container in storage.
    await blob.UploadFromFileAsync(fileToUpload);

    return asset;
}

Créer une ressource de sortie pour stocker le résultat du travailCreate an output asset to store the result of the job

La ressource de sortie stocke le résultat de votre travail.The output Asset stores the result of your job. Le projet définit la fonction DownloadResults qui télécharge les résultats à partir de cette ressource de sortie dans le dossier « output », afin de voir ce que vous avez obtenu.The project defines the DownloadResults function that downloads the results from this output asset into the "output" folder, so you can see what you got.

private static async Task<Asset> CreateOutputAssetAsync(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string assetName)
{
    // Check if an Asset already exists
    Asset outputAsset = await client.Assets.GetAsync(resourceGroupName, accountName, assetName);
    Asset asset = new Asset();
    string outputAssetName = assetName;

    if (outputAsset != null)
    {
        // Name collision! In order to get the sample to work, let's just go ahead and create a unique asset name
        // Note that the returned Asset can have a different name than the one specified as an input parameter.
        // You may want to update this part to throw an Exception instead, and handle name collisions differently.
        string uniqueness = $"-{Guid.NewGuid().ToString("N")}";
        outputAssetName += uniqueness;
        
        Console.WriteLine("Warning – found an existing Asset with name = " + assetName);
        Console.WriteLine("Creating an Asset with this name instead: " + outputAssetName);
    }

    return await client.Assets.CreateOrUpdateAsync(resourceGroupName, accountName, outputAssetName, asset);
}

Créer une transformation et un travail qui analyse les vidéosCreate a transform and a job that analyzes videos

Lors de l’encodage ou du traitement de contenu dans Media Services, il est courant de configurer les paramètres de codage en tant que formule.When encoding or processing content in Media Services, it's a common pattern to set up the encoding settings as a recipe. Vous envoyez ensuite un travail pour appliquer cette formule à une vidéo.You would then submit a Job to apply that recipe to a video. En envoyant de nouveaux travaux pour chaque nouvelle vidéo, vous appliquez cette formule à toutes les vidéos de votre bibliothèque.By submitting new Jobs for each new video, you're applying that recipe to all the videos in your library. Dans Media Services, une formule est appelée transformation.A recipe in Media Services is called a Transform. Pour plus d’informations, consultez Transformations et travaux.For more information, see Transforms and jobs. L’exemple décrit dans ce didacticiel définit une recette qui analyse la vidéo spécifiée.The sample described in this tutorial defines a recipe that analyzes the specified video.

TransformerTransform

Lorsque vous créez une instance de transformation, vous devez spécifier ce qu’elle doit produire comme sortie.When creating a new Transform instance, you need to specify what you want it to produce as an output. TransformOutput est un paramètre obligatoire.TransformOutput is a required parameter. Chaque objet TransformOutput contient un préréglage.Each TransformOutput contains a Preset. Le préréglage décrit les instructions détaillées concernant les opérations de traitement vidéo et/ou audio qui doivent être utilisées pour générer l’objet TransformOutput souhaité.Preset describes step-by-step instructions of video and/or audio processing operations that are to be used to generate the desired TransformOutput. Dans cet exemple, le préréglage VideoAnalyzerPreset est utilisé et la langue (« fr-fr ») est passée à son constructeur (new VideoAnalyzerPreset("en-US")).In this example, the VideoAnalyzerPreset preset is used and the language ("en-US") is passed to its constructor (new VideoAnalyzerPreset("en-US")). Ce préréglage vous permet d’extraire plusieurs insights audio et vidéo à partir d’une vidéo.This preset enables you to extract multiple audio and video insights from a video. Vous pouvez utiliser le préréglage AudioAnalyzerPreset si vous avez besoin d’extraire plusieurs insights audio à partir d’une vidéo.You can use the AudioAnalyzerPreset preset if you need to extract multiple audio insights from a video.

Quand vous créez une transformation, vérifiez d’abord s’il en existe déjà une à l’aide de la méthode Get, comme indiqué dans le code qui suit.When creating a Transform, check first if one already exists using the Get method, as shown in the code that follows. Dans Media Services v3, les méthodes Get appliquées sur les entités renvoient null si l’entité n’existe pas (une vérification du nom respectant la casse).In Media Services v3, Get methods on entities return null if the entity doesn’t exist (a case-insensitive check on the name).

private static async Task<Transform> GetOrCreateTransformAsync(IAzureMediaServicesClient client, 
    string resourceGroupName, 
    string accountName, 
    string transformName, 
    Preset preset)
{
    // Does a Transform already exist with the desired name? Assume that an existing Transform with the desired name
    // also uses the same recipe or Preset for processing content.
    Transform transform = await client.Transforms.GetAsync(resourceGroupName, accountName, transformName);

    if (transform == null)
    {
        // Start by defining the desired outputs.
        TransformOutput[] outputs = new TransformOutput[]
        {
            new TransformOutput(preset),
        };

        // Create the Transform with the output defined above
        transform = await client.Transforms.CreateOrUpdateAsync(resourceGroupName, accountName, transformName, outputs);
    }

    return transform;
}

TravailJob

Comme indiqué ci-dessus, l’objet Transformation est la formule et un travail est la requête réelle envoyée à Media Services pour appliquer cette transformation à un contenu vidéo ou audio d’entrée donné.As mentioned above, the Transform object is the recipe and a Job is the actual request to Media Services to apply that Transform to a given input video or audio content. Le travail spécifie des informations telles que l’emplacement de la vidéo d’entrée et celui de la sortie.The Job specifies information like the location of the input video and the location for the output. Vous pouvez spécifier l’emplacement de votre vidéo en utilisant : URL HTTPS, URL SAS ou ressources situées dans votre compte de service multimédia.You can specify the location of your video using: HTTPS URLs, SAS URLs, or Assets that are in your Media Service account.

Dans cet exemple, l’entrée de la tâche est une vidéo locale.In this example, the job input is a local video.

private static async Task<Job> SubmitJobAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    string jobName,
    JobInput jobInput,
    string outputAssetName)
{
    JobOutput[] jobOutputs =
    {
        new JobOutputAsset(outputAssetName),
    };

    // In this example, we are assuming that the job name is unique.
    //
    // If you already have a job with the desired name, use the Jobs.Get method
    // to get the existing job. In Media Services v3, Get methods on entities returns null 
    // if the entity doesn't exist (a case-insensitive check on the name).
    Job job = await client.Jobs.CreateAsync(
        resourceGroupName,
        accountName,
        transformName,
        jobName,
        new Job
        {
            Input = jobInput,
            Outputs = jobOutputs,
        });

    return job;
}

Attendre la fin du travailWait for the job to complete

Ce travail prend un certain temps.The job takes some time to complete. Dans ce cas, vous voulez en être averti.When it does, you want to be notified. Il existe différentes options pour être prévenu de l’achèvement du travail.There are different options to get notified about the Job completion. L’option la plus simple (indiquée ici) est d’utiliser l’interrogation.The simplest option (that's shown here) is to use polling.

L’interrogation ne relève pas d'une pratique recommandée pour les applications de production en raison de la latence potentielle.Polling isn't a recommended best practice for production apps because of potential latency. L’interrogation peut être limitée si elle est utilisée de façon excessive sur un compte.Polling can be throttled if overused on an account. À la place, les développeurs doivent utiliser Event Grid.Developers should instead use Event Grid.

Event Grid est conçu pour une haute disponibilité, des performances cohérentes et une mise à l’échelle dynamique.Event Grid is designed for high availability, consistent performance, and dynamic scale. Avec Event Grid, vos applications peuvent écouter les événements de presque tous les services Azure ou de toute source personnalisée, et y réagir.With Event Grid, your apps can listen for and react to events from virtually all Azure services, as well as custom sources. La gestion simple et réactive des événements basée sur HTTP vous aide à générer des solutions efficaces grâce au filtrage et au routage intelligents des événements.Simple, HTTP-based reactive event handling helps you build efficient solutions through intelligent filtering and routing of events. Pour plus d’informations, consultez Router des événements vers un point de terminaison web personnalisé.For more information, see Route events to a custom web endpoint.

Le travail passe généralement par les états suivants : Planifié, En attente, Traitement en cours, Terminé (l’état final).The Job usually goes through the following states: Scheduled, Queued, Processing, Finished (the final state). Si le travail a rencontré une erreur, vous obtenez l’état Erreur.If the job has come across an error, you get the Error state. Si le travail est en cours d’annulation, vous obtenez Annulation, puis Annulé une fois l’opération terminée.If the job is in the process of being canceled, you get Canceling and then Canceled when it's done.

private static async Task<Job> WaitForJobToFinishAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    string jobName)
{
    const int SleepIntervalMs = 60 * 1000;

    Job job = null;

    do
    {
        job = await client.Jobs.GetAsync(resourceGroupName, accountName, transformName, jobName);

        Console.WriteLine($"Job is '{job.State}'.");
        for (int i = 0; i < job.Outputs.Count; i++)
        {
            JobOutput output = job.Outputs[i];
            Console.Write($"\tJobOutput[{i}] is '{output.State}'.");
            if (output.State == JobState.Processing)
            {
                Console.Write($"  Progress: '{output.Progress}'.");
            }

            Console.WriteLine();
        }

        if (job.State != JobState.Finished && job.State != JobState.Error && job.State != JobState.Canceled)
        {
            await Task.Delay(SleepIntervalMs);
        }
    }
    while (job.State != JobState.Finished && job.State != JobState.Error && job.State != JobState.Canceled);

    return job;
}

Codes d’erreur des tâchesJob error codes

Consultez Codes d’erreur.See Error codes.

Télécharger le résultat du travailDownload the result of the job

La fonction suivante télécharge les résultats de la ressource de sortie dans le dossier « sortie », afin que vous puissiez examiner les résultats du travail.The following function downloads the results from the output Asset into the "output" folder so you can examine the results of the job.

private static async Task DownloadOutputAssetAsync(
    IAzureMediaServicesClient client,
    string resourceGroup,
    string accountName,
    string assetName,
    string outputFolderName)
{
    if (!Directory.Exists(outputFolderName))
    {
        Directory.CreateDirectory(outputFolderName);
    }

    AssetContainerSas assetContainerSas = await client.Assets.ListContainerSasAsync(
        resourceGroup,
        accountName,
        assetName,
        permissions: AssetContainerPermission.Read,
        expiryTime: DateTime.UtcNow.AddHours(1).ToUniversalTime());

    Uri containerSasUrl = new Uri(assetContainerSas.AssetContainerSasUrls.FirstOrDefault());
    CloudBlobContainer container = new CloudBlobContainer(containerSasUrl);

    string directory = Path.Combine(outputFolderName, assetName);
    Directory.CreateDirectory(directory);

    Console.WriteLine($"Downloading output results to '{directory}'...");

    BlobContinuationToken continuationToken = null;
    IList<Task> downloadTasks = new List<Task>();

    do
    {
        // A non-negative integer value that indicates the maximum number of results to be returned at a time,
        // up to the per-operation limit of 5000. If this value is null, the maximum possible number of results
        // will be returned, up to 5000.
        int? ListBlobsSegmentMaxResult = null;                
        
        BlobResultSegment segment = await container.ListBlobsSegmentedAsync(null, true, BlobListingDetails.None, ListBlobsSegmentMaxResult, continuationToken, null, null);

        foreach (IListBlobItem blobItem in segment.Results)
        {
            CloudBlockBlob blob = blobItem as CloudBlockBlob;
            if (blob != null)
            {
                string path = Path.Combine(directory, blob.Name);

                downloadTasks.Add(blob.DownloadToFileAsync(path, FileMode.Create));
            }
        }

        continuationToken = segment.ContinuationToken;
    }
    while (continuationToken != null);

    await Task.WhenAll(downloadTasks);

    Console.WriteLine("Download complete.");
}

Supprimer les ressources de votre compte Media ServicesClean up resource in your Media Services account

En règle générale, vous devez supprimer tous les éléments à l’exception des objets que vous envisagez de réutiliser (habituellement, vous réutilisez les transformations et conservez les éléments StreamingLocators).Generally, you should clean up everything except objects that you're planning to reuse (typically, you'll reuse Transforms and persist StreamingLocators). Si vous voulez que votre compte soit propre après les expériences, supprimez les ressources que vous n’avez pas l’intention de réutiliser.If you want for your account to be clean after experimenting, delete the resources that you don't plan to reuse. Par exemple, le code suivant supprime les travaux :For example, the following code deletes Jobs:

private static async Task CleanUpAsync(
    IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName)
{

    var jobs = await client.Jobs.ListAsync(resourceGroupName, accountName, transformName);
    foreach (var job in jobs)
    {
        await client.Jobs.DeleteAsync(resourceGroupName, accountName, transformName, job.Name);
    }

    var assets = await client.Assets.ListAsync(resourceGroupName, accountName);
    foreach (var asset in assets)
    {
        await client.Assets.DeleteAsync(resourceGroupName, accountName, asset.Name);
    }
}

Exécution de l'exemple d'applicationRun the sample app

Appuyez sur Ctrl+F5 pour exécuter l’application AnalyzeVideos.Press Ctrl+F5 to run the AnalyzeVideos app.

Lorsque nous exécutons le programme, le travail génère des miniatures pour chaque visage trouvé dans la vidéo.When we run the program, the job produces thumbnails for each face that it finds in the video. Il génère également le fichier insights.json.It also produces the insights.json file.

Analyser la sortieExamine the output

Le fichier de sortie de l’analyse de vidéos est nommé insights.json.The output file of analyzing videos is called insights.json. Ce fichier contient des insights sur votre vidéo.This file contains insights about your video. Vous trouverez une description des éléments trouvés au sein du fichier json dans l’article Intelligence multimédia.You can find description of elements found in the json file in the Media intelligence article.

Supprimer des ressourcesClean up resources

Si vous n’avez plus besoin des ressources de votre groupe de ressources, notamment les comptes de stockage et Media Services que vous avez créés pour ce didacticiel, supprimez le groupe de ressources créé précédemment.If you no longer need any of the resources in your resource group, including the Media Services and storage accounts you created for this tutorial, delete the resource group you created earlier.

Exécutez la commande CLI suivante :Execute the following CLI command:

az group delete --name amsResourceGroup

MultithreadingMultithreading

Les kits de développement logiciel (SDK) Azure Media Services v3 ne sont pas thread-safe.The Azure Media Services v3 SDKs aren't thread-safe. Quand vous utilisez une application multithread, vous devez générer un nouvel objet AzureMediaServicesClient par thread.When working with a multi-threaded app, you should generate a new AzureMediaServicesClient object per thread.

Poser des questions, envoyer des commentaires, obtenir des mises à jourAsk questions, give feedback, get updates

Découvrez l’article Communauté Azure Media Services pour découvrir les différentes façons dont vous pouvez poser des questions, faire des commentaires et obtenir des mises à jour sur Media Services.Check out the Azure Media Services community article to see different ways you can ask questions, give feedback, and get updates about Media Services.

Étapes suivantesNext steps