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
- A Visual Studio 2015 vagy 2017 bármely kiadása.
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.
A Visual Studio-projekt létrehozása
- A Visual Studióban hozzon létre egy új konzolalkalmazást (.NET-keretrendszer) és nevezze el VideoModeration néven.
- Ha más projektek is vannak a megoldásban, válassza ki ezt a projektet az egyedüli kezdőprojektként.
- 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 fő 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 ésracyScore
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.