Analýza problematických materiálů ve videu v jazyce C
Tento článek obsahuje informace a ukázky kódu, které vám pomůžou začít používat sadu Content Moderator SDK pro .NET ke skenování obsahu videa z obsahu pro dospělé nebo nečistých obsahů.
Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.
Požadavky
- Libovolná edice sady Visual Studio 2015 nebo 2017
Nastavení prostředků Azure
Funkce Content Moderator moderování videa je k dispozici jako bezplatný procesor médií ve verzi Public Preview v Azure Media Services (AMS). Azure Media Services je specializovaná služba Azure pro ukládání a streamování video obsahu.
Vytvoření účtu Azure Media Services
Postupujte podle pokynů v tématu Vytvoření účtu Azure Media Services a přihlaste se k odběru AMS a vytvořte přidružený účet úložiště Azure. V tomto účtu úložiště vytvořte nový kontejner úložiště objektů blob.
Vytvoření Azure Active Directory aplikace
Přejděte do nového předplatného AMS v Azure Portal a v postranní nabídce vyberte Přístup přes rozhraní API. Výběrem Připojení se Azure Media Services s objektem služby. Poznamenejte si hodnotu v REST API koncového bodu. Budete ho potřebovat později.
V části Aplikace Azure AD vyberte Vytvořit nový a pojmnostete novou registraci aplikace Azure AD (například VideoModADApp). Klikněte na Uložit a počkejte několik minut, než bude aplikace nakonfigurovaná. Pak by se nová registrace aplikace měla zobrazit v části stránky Aplikace Azure AD.
Vyberte registraci aplikace a klikněte na tlačítko Spravovat aplikaci pod ní. Poznamenejte si hodnotu v poli ID aplikace. Budete ho potřebovat později. Vyberte Nastavení Klíče a zadejte popis nového klíče > (například VideoModKey). Klikněte na Uložit a všimněte si nové hodnoty klíče. Zkopírujte tento řetězec a uložte ho někam bezpečně.
Podrobnější postup najdete v tématu Začínáme s ověřováním Azure AD.
Jakmile to budete mít, můžete procesor médií pro moderování videa použít dvěma různými způsoby.
Použití Azure Media Services Exploreru
Průzkumník Azure Media Services je uživatelsky přívětivý front-end pro AMS. Můžete ho použít k procházení účtu AMS, nahrávání videí a skenování obsahu pomocí Content Moderator médií. Stáhněte si ho a nainstalujte GitHubnebo se podívejte na blogový příspěvek Azure Media Services Exploreru, který obsahuje další informace.

Vytvoření projektu sady Visual Studio
- V Visual Studio vytvořte nový projekt Konzolová aplikace (.NET Framework) a pojmnováte ho VideoModeration.
- Pokud vaše řešení obsahuje i jiné projekty, vyberte tento projekt jako jediný spouštěný projekt.
- Získejte požadované balíčky NuGet. Klikněte pravým tlačítkem na svůj projekt v Průzkumníku řešení a vyberte Spravovat balíčky NuGet. Potom vyhledejte a nainstalujte následující balíčky:
- windowsazure.mediaservices
- windowsazure.mediaservices.extensions
Přidání kódu moderování videa
Dále zkopírováním kódu z této příručky a jeho vložením do svého projektu implementujete základní scénář moderování obsahu.
Aktualizace příkazů using programu
Na začátek souboru Program.cs přidejte následující příkazy using.
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;
Nastavení odkazů na prostředky
Do třídy Program v souboru Program.cs přidejte následující statická pole. V těchto polích jsou informace potřebné pro připojení k vašemu předplatnému AMS. Vyplňte je hodnotami, které jste získali v krocích výše. Všimněte si, že je hodnota ID aplikace azure AD a hodnota CLIENT_ID CLIENT_SECRET "VideoModKey", kterou jste pro aplikaci vytvořili.
// 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";
Pokud chcete použít místní videosoubor (nejjednodušší případ), přidejte ho do projektu a zadejte jeho cestu jako hodnotu (relativní cesty jsou relativní vzhledem k INPUT_FILE adresáři spuštění).
Budete také muset v aktuálním adresáři vytvořit soubor preset.json a použít ho k zadání čísla verze. Například:
{
"version": "2.0"
}
Načtení vstupních videí
Metoda Main třídy Program vytvoří kontext služby Azure Media a pak Azure Storage kontextu (v případě, že jsou vaše videa v úložišti objektů blob). Zbývající kód prohledá video z místní složky, objektu blob nebo několika objektů blob v kontejneru úložiště Azure. Všechny možnosti můžete vyzkoušet komentováním ostatních řádků kódu.
// 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();
Vytvoření kontextu médií Azure
Do třídy Program přidejte následující metodu. To používá vaše přihlašovací údaje AMS k umožnění komunikace s 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);
}
Přidání kódu pro vytvoření Azure Storage kontextu
Do třídy Program přidejte následující metodu. Pro přístup k Storage objektů blob použijete kontext úložiště vytvořený z vašich přihlašovacích údajů k úložišti.
// 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);
}
Přidání kódu pro vytvoření mediálních prostředků Azure z místního souboru a objektu blob
Procesor Content Moderator médií spouští úlohy na prostředcích v rámci Azure Media Services platformy. Tyto metody vytvářejí prostředky z místního souboru nebo přidruženého objektu 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);
}
Přidání kódu pro kontrolu kolekce videí (jako objektů blob) v kontejneru
// 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;
}
Přidejte metodu pro spuštění úlohy Content Moderator.
// 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);
}
Přidání pomocých funkcí
Tyto metody stáhnou výstupní soubor Content Moderator (JSON) z assetu Azure Media Services a pomůžou sledovat stav úlohy moderování, aby program mohl protokolovat stav spuštění do konzoly.
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;
}
}
Spuštění programu a kontrola výstupu
Po dokončení úlohy Content Moderation analyzujte odpověď JSON. Skládá se z těchto prvků:
- Souhrn informací o videu
- Snímky jako fragmenty
- Klíčové snímky jako "události" s příznakem reviewRecommended (= true nebo false)" na základě skóre pro dospělé a racy
- start, duration, totalDuration a timestamp jsou v "ticks". Pokud chcete získat počet v sekundách, vydělte časovým měřítkem.
Poznámka
adultScorepředstavuje potenciální přítomnost obsahu a skóre predikce, které lze v určitých situacích považovat za sexuálně explicitní nebo pro dospělé.racyScorepředstavuje potenciální přítomnost a skóre predikce obsahu, který lze v určitých situacích považovat za sexuálně supresivní nebo vyspělý.adultScorearacyScorejsou v rozmezí 0 až 1. Čím vyšší je skóre, tím vyšší model předpovídá, že kategorie může být použitelná. Tato verze Preview spoléhá na statistický model, nikoli na ručně kódované výsledky. Doporučujeme testovat s vlastním obsahem, abyste zjistili, jak jednotlivé kategorie splňují vaše požadavky.reviewRecommendedhodnota je true nebo false v závislosti na prahových hodnotách interního skóre. Zákazníci by měli posoudit, jestli tuto hodnotu použít, nebo rozhodnout o vlastních prahových hodnotách na základě zásad jejich obsahu.
{
"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
}
]
]
}
]
}
Další kroky
Naučte se generovat recenze videa z výstupu moderování.
Stáhněte si Visual Studio tohoto a dalších rychlých Content Moderator pro .NET.