Analysera videoinnehåll för stötande material i C#

Den här artikeln innehåller information och kodexempel som hjälper dig att komma igång med Content Moderator SDK för .NET för att skanna videoinnehåll efter olämpligt innehåll eller olämpligt innehåll.

Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Förutsättningar

Ställa in Azure-resurser

Content Moderators videomodereringsfunktion är tillgänglig som en kostnadsfri medieprocessor för offentlig förhandsversion i Azure Media Services (AMS). Azure Media Services är en specialiserad Azure-tjänst för lagring och direktuppspelning av videoinnehåll.

Skapa ett Azure Media Services-konto

Följ anvisningarna i Skapa ett Azure Media Services-konto för att prenumerera på AMS och skapa ett associerat Azure Storage-konto. I det lagringskontot skapar du en ny Blob Storage-container.

Skapa ett Microsoft Entra-program

Gå till din nya AMS-prenumeration i Azure-portalen och välj API-åtkomst på sidomenyn. Välj Anslut till Azure Media Services med tjänstens huvudnamn. Observera värdet i REST API-slutpunktsfältet . Du behöver det senare.

I avsnittet Microsoft Entra-app väljer du Skapa ny och namnger din nya Microsoft Entra-programregistrering (till exempel "VideoModADApp"). Välj Spara och vänta några minuter medan programmet har konfigurerats. Sedan bör du se din nya appregistrering under avsnittet Microsoft Entra-app på sidan.

Välj din appregistrering och klicka på knappen Hantera program under den. Observera värdet i fältet Program-ID . Du behöver det senare. Välj Inställningar> Nycklar och ange en beskrivning för en ny nyckel (till exempel "VideoModKey"). Välj Spara och lägg sedan märke till det nya nyckelvärdet. Kopiera strängen och spara den på ett säkert sätt.

En mer ingående genomgång av ovanstående process finns i Kom igång med Microsoft Entra-autentisering.

När du har gjort detta kan du använda medieprocessorn för videomoderering på två olika sätt.

Använda Azure Media Services Explorer

Azure Media Services Explorer är en användarvänlig klientdel för AMS. Använd det för att bläddra i ditt AMS-konto, ladda upp videor och skanna innehåll med Content Moderator-medieprocessorn. Ladda ned och installera det från GitHub, eller se blogginlägget i Azure Media Services Explorer om du vill ha mer information.

Azure Media Services explorer with Content Moderator

Skapa Visual Studio-projektet

  1. I Visual Studio skapar du ett nytt konsolappsprojekt (.NET Framework) och ger det namnet VideoModeration.
  2. Om det finns andra projekt i din lösning väljer du den här kopian som det enda startprojektet.
  3. Hämta de NuGet-paket som behövs. Högerklicka på projektet i Solution Explorer och välj Hantera NuGet-paket. Leta sedan upp och installera följande paket:
    • windowsazure.mediaservices
    • windowsazure.mediaservices.extensions

Lägga till kod för videomoderering

Nu ska du kopiera och klistra in koden från den här guiden i ditt projekt för att implementera ett grundläggande innehållsmodereringsscenario.

Uppdatera programmets using-instruktioner

Lägg till följande using-instruktioner överst i Program.cs-filen.

using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.IO;
using System.Threading;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using System.Collections.Generic;

Konfigurera resursreferenser

Lägg till följande statiska fält till klassen Program i Program.cs. De här fälten innehåller den information som krävs för att ansluta till din AMS-prenumeration. Fyll i dem med de värden som du fick i stegen ovan. Observera att CLIENT_ID är program-ID-värdet för din Microsoft Entra-app och CLIENT_SECRET är värdet för "VideoModKey" som du skapade för appen.

// declare constants and globals
private static CloudMediaContext _context = null;
private static CloudStorageAccount _StorageAccount = null;

// Azure Media Services (AMS) associated Storage Account, Key, and the Container that has
// a list of Blobs to be processed.
static string STORAGE_NAME = "YOUR AMS ASSOCIATED BLOB STORAGE NAME";
static string STORAGE_KEY = "YOUR AMS ASSOCIATED BLOB STORAGE KEY";
static string STORAGE_CONTAINER_NAME = "YOUR BLOB CONTAINER FOR VIDEO FILES";

private static StorageCredentials _StorageCredentials = null;

// Azure Media Services authentication.
private const string AZURE_AD_TENANT_NAME = "microsoft.onmicrosoft.com";
private const string CLIENT_ID = "YOUR CLIENT ID";
private const string CLIENT_SECRET = "YOUR CLIENT SECRET";

// REST API endpoint, for example "https://accountname.restv2.westcentralus.media.azure.net/API".
private const string REST_API_ENDPOINT = "YOUR API ENDPOINT";

// Content Moderator Media Processor Nam
private const string MEDIA_PROCESSOR = "Azure Media Content Moderator";

// Input and Output files in the current directory of the executable
private const string INPUT_FILE = "VIDEO FILE NAME";
private const string OUTPUT_FOLDER = "";

// JSON settings file
private static readonly string CONTENT_MODERATOR_PRESET_FILE = "preset.json";

Viktigt!

Kom ihåg att ta bort nycklarna från koden när du är klar och publicera dem aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i säkerhetsartikeln för Azure AI-tjänster.

Om du vill använda en lokal videofil (enklaste fallet) lägger du till den i projektet och anger dess sökväg som INPUT_FILE värde (relativa sökvägar är i förhållande till körningskatalogen).

Du måste också skapa filen preset.json i den aktuella katalogen och använda den för att ange ett versionsnummer. Till exempel:

{
    "version": "2.0"
}

Läs in indatavideor

Metoden Main i klassen Program skapar en Azure Media Context och sedan en Azure Storage-kontext (om dina videor finns i bloblagring). Den återstående koden söker igenom en video från en lokal mapp, blob eller flera blobar i en Azure Storage-container. Du kan prova alla alternativ genom att kommentera ut de andra kodraderna.

// Create Azure Media Context
CreateMediaContext();

// Create Storage Context
CreateStorageContext();

// Use a file as the input.
IAsset asset = CreateAssetfromFile();

// -- OR ---

// Or a blob as the input
// IAsset asset = CreateAssetfromBlob((CloudBlockBlob)GetBlobsList().First());

// Then submit the asset to Content Moderator
RunContentModeratorJob(asset);

//-- OR ----

// Just run the content moderator on all blobs in a list (from a Blob Container)
// RunContentModeratorJobOnBlobs();

Skapa en Azure Media-kontext

Lägg till följande metod i klassen Program. Detta använder dina AMS-autentiseringsuppgifter för att tillåta kommunikation med AMS.

// Creates a media context from azure credentials
static void CreateMediaContext()
{
    // Get Azure AD credentials
    var tokenCredentials = new AzureAdTokenCredentials(AZURE_AD_TENANT_NAME,
        new AzureAdClientSymmetricKey(CLIENT_ID, CLIENT_SECRET),
        AzureEnvironments.AzureCloudEnvironment);

    // Initialize an Azure AD token
    var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

    // Create a media context
    _context = new CloudMediaContext(new Uri(REST_API_ENDPOINT), tokenProvider);
}

Lägg till koden för att skapa en Azure Storage-kontext

Lägg till följande metod i klassen Program. Du använder lagringskontexten, som skapats från dina autentiseringsuppgifter för lagring, för att få åtkomst till bloblagringen.

// Creates a storage context from the AMS associated storage name and key
static void CreateStorageContext()
{
    // Get a reference to the storage account associated with a Media Services account.
    if (_StorageCredentials == null)
    {
        _StorageCredentials = new StorageCredentials(STORAGE_NAME, STORAGE_KEY);
    }
    _StorageAccount = new CloudStorageAccount(_StorageCredentials, false);
}

Lägg till koden för att skapa Azure Media Assets från lokal fil och blob

Content Moderator-medieprocessorn kör jobb på Tillgångar på Azure Media Services-plattformen. Dessa metoder skapar tillgångar från en lokal fil eller en associerad blob.

// Creates an Azure Media Services Asset from the video file
static IAsset CreateAssetfromFile()
{
    return _context.Assets.CreateFromFile(INPUT_FILE, AssetCreationOptions.None); ;
}

// Creates an Azure Media Services asset from your blog storage
static IAsset CreateAssetfromBlob(CloudBlockBlob Blob)
{
    // Create asset from the FIRST blob in the list and return it
    return _context.Assets.CreateFromBlob(Blob, _StorageCredentials, AssetCreationOptions.None);
}

Lägg till koden för att skanna en samling videor (som blobar) i en container

// Runs the Content Moderator Job on all Blobs in a given container name
static void RunContentModeratorJobOnBlobs()
{
    // Get the reference to the list of Blobs. See the following method.
    var blobList = GetBlobsList();

    // Iterate over the Blob list items or work on specific ones as needed
    foreach (var sourceBlob in blobList)
    {
        // Create an Asset
        IAsset asset = _context.Assets.CreateFromBlob((CloudBlockBlob)sourceBlob,
                            _StorageCredentials, AssetCreationOptions.None);
        asset.Update();

        // Submit to Content Moderator
        RunContentModeratorJob(asset);
    }
}

// Get all blobs in your container
static IEnumerable<IListBlobItem> GetBlobsList()
{
    // Get a reference to the Container within the Storage Account
    // that has the files (blobs) for moderation
    CloudBlobClient CloudBlobClient = _StorageAccount.CreateCloudBlobClient();
    CloudBlobContainer MediaBlobContainer = CloudBlobClient.GetContainerReference(STORAGE_CONTAINER_NAME);

    // Get the reference to the list of Blobs
    var blobList = MediaBlobContainer.ListBlobs();
    return blobList;
}

Lägg till metoden för att köra Content Moderator-jobbet

// Run the Content Moderator job on the designated Asset from local file or blob storage
static void RunContentModeratorJob(IAsset asset)
{
    // Grab the presets
    string configuration = File.ReadAllText(CONTENT_MODERATOR_PRESET_FILE);

    // grab instance of Azure Media Content Moderator MP
    IMediaProcessor mp = _context.MediaProcessors.GetLatestMediaProcessorByName(MEDIA_PROCESSOR);

    // create Job with Content Moderator task
    IJob job = _context.Jobs.Create(String.Format("Content Moderator {0}",
            asset.AssetFiles.First() + "_" + Guid.NewGuid()));

    ITask contentModeratorTask = job.Tasks.AddNew("Adult and racy classifier task",
            mp, configuration,
            TaskOptions.None);
    contentModeratorTask.InputAssets.Add(asset);
    contentModeratorTask.OutputAssets.AddNew("Adult and racy classifier output",
        AssetCreationOptions.None);

    job.Submit();


    // Create progress printing and querying tasks
    Task progressPrintTask = new Task(() =>
    {
        IJob jobQuery = null;
        do
        {
            var progressContext = _context;
            jobQuery = progressContext.Jobs
            .Where(j => j.Id == job.Id)
                .First();
                Console.WriteLine(string.Format("{0}\t{1}",
                DateTime.Now,
                jobQuery.State));
                Thread.Sleep(10000);
            }
            while (jobQuery.State != JobState.Finished &&
            jobQuery.State != JobState.Error &&
            jobQuery.State != JobState.Canceled);
    });
    progressPrintTask.Start();

    Task progressJobTask = job.GetExecutionProgressTask(
    CancellationToken.None);
    progressJobTask.Wait();

    // If job state is Error, the event handling
    // method for job progress should log errors.  Here we check
    // for error state and exit if needed.
    if (job.State == JobState.Error)
    {
        ErrorDetail error = job.Tasks.First().ErrorDetails.First();
        Console.WriteLine(string.Format("Error: {0}. {1}",
        error.Code,
        error.Message));
    }

    DownloadAsset(job.OutputMediaAssets.First(), OUTPUT_FOLDER);
}

Lägga till hjälpfunktioner

Dessa metoder laddar ned Content Moderator-utdatafilen (JSON) från Azure Media Services-tillgången och hjälper till att spåra statusen för modereringsjobbet så att programmet kan logga en körningsstatus till konsolen.

static void DownloadAsset(IAsset asset, string outputDirectory)
{
    foreach (IAssetFile file in asset.AssetFiles)
    {
        file.Download(Path.Combine(outputDirectory, file.Name));
    }
}

// event handler for Job State
static void StateChanged(object sender, JobStateChangedEventArgs e)
{
    Console.WriteLine("Job state changed event:");
    Console.WriteLine("  Previous state: " + e.PreviousState);
    Console.WriteLine("  Current state: " + e.CurrentState);
    switch (e.CurrentState)
    {
        case JobState.Finished:
            Console.WriteLine();
            Console.WriteLine("Job finished.");
            break;
        case JobState.Canceling:
        case JobState.Queued:
        case JobState.Scheduled:
        case JobState.Processing:
            Console.WriteLine("Please wait...\n");
            break;
        case JobState.Canceled:
            Console.WriteLine("Job is canceled.\n");
            break;
        case JobState.Error:
            Console.WriteLine("Job failed.\n");
            break;
        default:
            break;
    }
}

Kör programmet och granska resultatet

När innehållsmodereringsjobbet har slutförts analyserar du JSON-svaret. Den består av följande element:

  • Sammanfattning av videoinformation
  • Bilder som "fragment"
  • Nyckelramar som "händelser" med en reviewRecommended-flagga (= sant eller falskt)" baserat på adulta och racy-poäng
  • start, varaktighet, totalDuration och tidsstämpel finns i "ticks". Dividera efter tidsskala för att hämta talet i sekunder.

Kommentar

  • adultScore representerar den potentiella förekomsten och förutsägelsepoängen för innehåll som kan betraktas som sexuellt explicit eller vuxet i vissa situationer.
  • racyScore representerar den potentiella förekomsten och förutsägelsepoängen för innehåll som kan betraktas som sexuellt suggestivt eller moget i vissa situationer.
  • adultScore och racyScore är mellan 0 och 1. Ju högre poäng, desto högre är modellen som förutsäger att kategorin kan vara tillämplig. Den här förhandsversionen förlitar sig på en statistisk modell i stället för manuellt kodade resultat. Vi rekommenderar att du testar med ditt eget innehåll för att avgöra hur varje kategori överensstämmer med dina krav.
  • reviewRecommended är antingen sant eller falskt beroende på tröskelvärdena för interna poäng. Kunder bör utvärdera om de vill använda det här värdet eller besluta om anpassade tröskelvärden baserat på deras innehållsprinciper.
{
"version": 2,
"timescale": 90000,
"offset": 0,
"framerate": 50,
"width": 1280,
"height": 720,
"totalDuration": 18696321,
"fragments": [
{
    "start": 0,
    "duration": 18000
},
{
    "start": 18000,
    "duration": 3600,
    "interval": 3600,
    "events": [
    [
        {
        "reviewRecommended": false,
        "adultScore": 0.00001,
        "racyScore": 0.03077,
        "index": 5,
        "timestamp": 18000,
        "shotIndex": 0
        }
    ]
    ]
},
{
    "start": 18386372,
    "duration": 119149,
    "interval": 119149,
    "events": [
    [
        {
        "reviewRecommended": true,
        "adultScore": 0.00000,
        "racyScore": 0.91902,
        "index": 5085,
        "timestamp": 18386372,
        "shotIndex": 62
        }
    ]
    ]
}
]
}

Nästa steg

Ladda ned Visual Studio-lösningen för den här och andra Content Moderator-snabbstarter för .NET.