Kifogásolható anyagok videotartalmainak elemzése C-ben#

Ez a cikk információkat és kódmintákat tartalmaz, amelyek segítenek a .NET-hez készült Content Moderator SDK használatának megkezdésében a felnőtt vagy a racy tartalmak videotartalmainak vizsgálatához.

Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot.

Előfeltételek

Az Azure-erőforrások beállítása

A Content Moderator videómoderálási képessége ingyenes nyilvános előzetes verziójú médiafeldolgozóként érhető el az Azure Media Servicesben (AMS). Az Azure Media Services egy speciális Azure-szolgáltatás videotartalmak tárolására és streamelására.

Azure Media Services-fiók létrehozása

Az AMS-előfizetéshez és egy társított Azure Storage-fiók létrehozásához kövesse az Azure Media Services-fiók létrehozása című témakör utasításait. Ebben a tárfiókban hozzon létre egy új Blob Storage-tárolót.

Microsoft Entra-alkalmazás létrehozása

Lépjen az új AMS-előfizetésére az Azure Portalon, és válassza ki az API-hozzáférést az oldalsó menüből. Válassza az Azure Media Services szolgáltatásnévvel rendelkező Csatlakozás lehetőséget. Jegyezze fel a REST API végpont mezőjében szereplő értéket. Erre később lesz szüksége.

A Microsoft Entra alkalmazás szakaszában válassza az Új létrehozása lehetőséget, és nevezze el az új Microsoft Entra-alkalmazásregisztrációt (például "VideoModADApp"). Válassza a Mentés lehetőséget , és várjon néhány percet, amíg az alkalmazás konfigurálva van. Ezután az új alkalmazásregisztrációnak a lap Microsoft Entra alkalmazás szakaszában kell megjelennie.

Válassza ki az alkalmazásregisztrációt, és kattintson alatta az Alkalmazás kezelése gombra. Jegyezze fel az alkalmazásazonosító mezőben szereplő értéket. Erre később lesz szüksége. Válassza a Gépház> Kulcsok lehetőséget, és adjon meg egy új kulcs leírását (például "VideoModKey"). Válassza a Mentés lehetőséget, és figyelje meg az új kulcs értékét. Másolja ki ezt a sztringet, és mentse biztonságos helyre.

A fenti folyamat részletesebb bemutatása: A Microsoft Entra-hitelesítés használatának első lépései.

Ezt követően kétféleképpen használhatja a videómoderálási médiafeldolgozót.

Az Azure Media Services Explorer használata

Az Azure Media Services Explorer az AMS felhasználóbarát kezelőfelülete. Ezzel tallózhat AMS-fiókjában, videókat tölthet fel, és tartalmakat vizsgálhat a Content Moderator médiafeldolgozóval. Töltse le és telepítse a GitHubról, vagy tekintse meg az Azure Media Services Explorer blogbejegyzését további információért.

Azure Media Services explorer with Content Moderator

A Visual Studio-projekt létrehozása

  1. A Visual Studióban hozzon létre egy új konzolalkalmazást (.NET-keretrendszer) és nevezze el VideoModeration néven.
  2. Ha más projektek is vannak a megoldásban, válassza ki ezt a projektet az egyedüli kezdőprojektként.
  3. Szerezze be a szükséges NuGet-csomagokat. Kattintson a jobb gombbal a projektre a Megoldáskezelő, és válassza a NuGet-csomagok kezelése lehetőséget, majd keresse meg és telepítse a következő csomagokat:
    • windowsazure.mediaservices
    • windowsazure.mediaservices.extensions

Videómoderálási kód hozzáadása

Következő lépésként másolja és illessze be az ebben az útmutatóban található kódot a projektjébe egy alapszintű tartalommoderálási forgatókönyv megvalósításához.

A program „using” utasításainak frissítése

Adja hozzá az alábbi using utasításokat a Program.cs fájl elejéhez.

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;

Erőforráshivatkozások beállítása

Adja hozzá a következő statikus mezőket a Program osztályhoz a Program.cs-ben. Ezek a mezők az AMS-előfizetéshez való csatlakozáshoz szükséges információkat tartalmaznak. Töltse ki őket a fenti lépésekben kapott értékekkel. Vegye figyelembe, hogy CLIENT_ID a Microsoft Entra-alkalmazás alkalmazásazonosító értéke, és CLIENT_SECRET az alkalmazáshoz létrehozott "VideoModKey" értéke.

// 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";

Fontos

Ne felejtse el eltávolítani a kulcsokat a kódból, amikor elkészült, és soha ne tegye közzé őket nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

Ha helyi videofájlt (legegyszerűbb esetet) szeretne használni, adja hozzá a projekthez, és adja meg az INPUT_FILE elérési útját értékként (a relatív elérési utak a végrehajtási könyvtárhoz képest vannak).

Emellett létre kell hoznia a preset.json fájlt az aktuális könyvtárban, és meg kell adnia egy verziószámot. Például:

{
    "version": "2.0"
}

A bemeneti videó(k) betöltése

A programosztály metódusa létrehoz egy Azure Media-környezetet, majd egy Azure Storage-környezetet (abban az esetben, ha a videók blobtárolóban vannak). A fennmaradó kód beolvassa a videót egy helyi mappából, blobból vagy több blobból egy Azure Storage-tárolóban. Az összes lehetőséget kipróbálhatja a többi kódsor megjegyzésével.

// 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();

Azure Media-környezet létrehozása

Adja hozzá a Program osztályhoz a következő metódust. Ez az AMS hitelesítő adataival teszi lehetővé az AMS-sel való kommunikációt.

// 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);
}

Kód hozzáadása Azure Storage-környezet létrehozásához

Adja hozzá a Program osztályhoz a következő metódust. A tárolási hitelesítő adatokból létrehozott Storage-környezet használatával érheti el a blobtárolót.

// 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);
}

Adja hozzá a kódot az Azure Media Assets helyi fájlból és blobból való létrehozásához

A Content Moderator médiafeldolgozója feladatokat futtat az Azure Media Services platform eszközein. Ezek a metódusok egy helyi fájlból vagy egy társított blobból hozzák létre az eszközöket.

// 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);
}

Adja hozzá a kódot a tárolóban található videók gyűjteményének (blobokként) vizsgálatához

// 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;
}

Adja hozzá a Content Moderator-feladat futtatásához használható metódust

// 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);
}

Segédfüggvények hozzáadása

Ezek a metódusok letöltik a Content Moderator kimeneti fájlját (JSON) az Azure Media Services-objektumból, és segítenek nyomon követni a moderálási feladat állapotát, hogy a program naplózhassa a futó állapotot a konzolon.

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;
    }
}

A program futtatása és a kimenet áttekintése

A tartalommoderálási feladat befejezése után elemezze a JSON-választ. A következő elemekből áll:

  • Videóinformációk összegzése
  • Lövések mint "töredékek"
  • Kulcskeretek "eseményekként" felülvizsgálattalRecommended" (= igaz vagy hamis)" jelző felnőtt és Racy pontszámok alapján
  • az indítás, az időtartam, a totalDuration és az időbélyeg a "ticks" (kullancsok) értékre van állítva. Oszd el az időskálával , hogy másodpercek alatt megkapd a számot.

Megjegyzés:

  • adultScore olyan tartalmak lehetséges jelenlétét és előrejelzési pontszámát jelöli, amelyek bizonyos helyzetekben szexuálisan explicitnek vagy felnőttnek tekinthetők.
  • racyScore olyan tartalom lehetséges jelenlétét és előrejelzési pontszámát jelöli, amely bizonyos helyzetekben szexuálisan szuggesztívnak vagy érettnek tekinthető.
  • adultScore és 0 és racyScore 1 között vannak. Minél magasabb a pontszám, annál magasabb a modell előrejelzése, hogy a kategória alkalmazható lehet. Ez az előzetes verzió nem manuálisan kódolt eredményekre, hanem statisztikai modellre támaszkodik. Javasoljuk, hogy saját tartalommal tesztelje, hogy az egyes kategóriák hogyan igazodjanak a követelményekhez.
  • reviewRecommended a belső pontszám küszöbértékétől függően igaz vagy hamis. Az ügyfeleknek fel kell mérniük, hogy ezt az értéket használják-e, vagy a tartalomszabályzataik alapján egyéni küszöbértékek mellett döntenek.
{
"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
        }
    ]
    ]
}
]
}

Következő lépések

Töltse le ehhez a Visual Studio-megoldást és a .NET-hez készült egyéb Content Moderator-rövid útmutatókat.