Analysera videoinnehåll och se om det finns stötande material i C
Den här artikeln innehåller information och kodexempel som hjälper dig att komma igång med att använda Content Moderator SDK för .NET för att söka igenom videoinnehåll efter vuxet eller racy-innehåll.
Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
Förutsättningar
- Alla versioner av Visual Studio 2015 eller 2017
Ställa in Azure-resurser
Funktionen Content Moderator videomoderering ä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 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 Azure Active Directory program
Gå till din nya AMS-prenumeration i Azure Portal och välj API-åtkomst på sidomenyn. Välj Anslut att Azure Media Services med tjänstens huvudnamn. Observera värdet i fältet REST API slutpunkt. du behöver detta senare.
I avsnittet Azure AD-app väljer du Skapa ny och ger den nya Azure AD-programregistreringen namnet (till exempel "VideoModADApp"). Klicka på Spara och vänta några minuter medan programmet är konfigurerat. Sedan bör du se din nya appregistrering under avsnittet Azure AD-app på sidan.
Välj din appregistrering och klicka på knappen Hantera program under den. Notera värdet i fältet Program-ID. du behöver detta senare. Välj Inställningar > och ange en beskrivning för en ny nyckel (till exempel "VideoModKey"). Klicka på Spara och lägg sedan märke till det nya nyckelvärdet. Kopiera den här strängen och spara den på en säker plats.
En mer omfattande genomgång av ovanstående process finns i Kom igång med Azure AD-autentisering.
När du har gjort det kan du använda medieprocessorn för videomoderering på två olika sätt.
Använda Azure Media Services Explorer
Den Azure Media Services Explorer är en användarvänlig frontend för AMS. Använd den för att bläddra i ams-kontot, ladda upp videor och skanna innehåll med Content Moderator medieprocessorn. Ladda ned och installera det GitHub, eller se blogginlägget Azure Media Services Explorer för mer information.

Skapa Visual Studio-projektet
- I Visual Studio du ett nytt projekt för Konsolapp (.NET Framework) och ger det namnet VideoModeration.
- Om det finns andra projekt i din lösning väljer du den här kopian som det enda startprojektet.
- Hämta de NuGet-paket som behövs. Högerklicka på projektet i Solution Explorer och välj Hantera NuGet-paket. Sök efter och installera följande paket:
- windowsazure.mediaservices
- windowsazure.mediaservices.extensions
Lägga till videomodereringskod
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 i klassen Program i Program.cs. De här fälten innehåller den information som krävs för att ansluta till ams-prenumerationen. 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 Azure AD-app och är värdet för CLIENT_SECRET "VideoModKey" som du skapade för den 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";
Om du vill använda en lokal videofil (enklast fall) lägger du till den i projektet och anger dess sökväg som värde (relativa sökvägar är relativa till INPUT_FILE körningskatalogen).
Du måste också skapa filen preset.json i den aktuella katalogen och använda den för att ange ett versionsnummer. Exempel:
{
"version": "2.0"
}
Läs in indatavideor
Main-metoden i klassen Program skapar en Azure Media Context och sedan en Azure Storage Context (om dina videor finns i Blob Storage). 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-mediekontext
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 den Storage kontext 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
Den Content Moderator medieprocessorn kör jobb på tillgångar inom 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 status 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"
- Nyckelbildrutor som flaggan "events" with a reviewRecommended" (= true or false)" baserat på poängen för vuxna och racy
- start, duration, totalDuration och timestamp är i "tick". Dividera med tidsskala för att hämta talet i sekunder.
Anteckning
adultScorerepresenterar den potentiella förekomsten och förutsägelsepoängen för innehåll som kan betraktas som sexuellt explicit eller vuxet i vissa situationer.racyScorerepresenterar den potentiella förekomsten och förutsägelsepoängen för innehåll som kan betraktas som sexuellt suggestivt eller mogna i vissa situationer.adultScoreochracyScoreär mellan 0 och 1. Ju högre poäng, desto högre förutsäger modellen 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å interna poängtrösklar. Kunderna bör bedöma om de ska använda det här värdet eller välja 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
Lär dig hur du genererar videorecensioner från modereringsutdata.
Ladda ned Visual Studio för den här och andra Content Moderator snabbstarter för .NET.