C'de video içeriğini uygun malzemeler için analiz etme

Bu makale, video içeriğini yetişkinlere yönelik veya racy içeriklerini taramak üzere .NET için Content Moderator SDK'sını kullanmaya başlamanıza yardımcı olacak bilgiler ve kod örnekleri sağlar.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Önkoşullar

Azure kaynakları ayarlama

Video Content Moderator özelliği, Azure Media Services 'de (AMS) ücretsiz bir genel önizleme medya işlemcisi olarak kullanılabilir. Azure Media Services video içeriğini depolamaya ve akışa akaryak için özel bir Azure hizmetidir.

Azure Media Services hesabı oluşturma

AMS'ye abone olmak Azure Media Services ilişkili bir Azure depolama hesabı oluşturmak için Hesap oluşturma yönergelerini izleyin. Bu depolama hesabında yeni bir Blob depolama kapsayıcısı oluşturun.

Azure Active Directory oluşturma

Yeni AMS aboneliğinize gidin ve Azure portal API erişimi'ne tıklayın. Hizmet Bağlan ile Azure Media Services'yi seçin. Uç nokta alanında REST API not; Buna daha sonra ihtiyacınız olacak.

Azure AD uygulaması bölümünde Yeni Oluştur'a tıklayın ve yeni Azure AD uygulama kaydınıza ("VideoModADApp" gibi) bir ad girin. Kaydet'e tıklayın ve uygulama yapılandırılırken birkaç dakika bekleyin. Ardından, sayfanın Azure AD uygulaması bölümünde yeni uygulama kaydınızı görüyorsanız.

Uygulama kaydınızı seçin ve altındaki Uygulamayı yönet düğmesine tıklayın. Uygulama Kimliği alanında yer alan değeri not alan; Buna daha sonra ihtiyacınız olacak. Anahtar > Ayarlar'ı seçin ve yeni anahtar için bir açıklama girin ("VideoModKey" gibi). Kaydet'e tıklayın ve yeni anahtar değerine dikkatin. Bu dizeyi kopyalayın ve güvenli bir yere kaydedin.

Yukarıdaki sürecin daha kapsamlı bir yolu için bkz. Azure AD Kullanmaya başlayın ile yapılandırma.

Bunu tamamlanın ardından video moderation medya işlemcisini iki farklı şekilde kullanabilirsiniz.

Azure Media Services Explorer'ı kullanma

Azure Media Services Gezgini, AMS için kolay bir ön uçtır. AMS hesabınıza göz atmak, videoları karşıya yüklemek ve medya işlemcisi ile içeriği taramak Content Moderator kullanın. daha fazla bilgi için GitHubGezgini blog Azure Media Services indirin ve yükleyin.

Azure Media Services ile Content Moderator

Visual Studio projesini oluşturma

  1. Bu Visual Studio yeni bir Konsol uygulaması (.NET Framework) projesi oluşturun ve VideoModeration olarak ad girin.
  2. Çözümünüzde başka projeler de varsa, tek başlangıç projesi olarak bunu seçin.
  3. Gereken NuGet paketlerini alın. Çözüm Gezgini'nde projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin; ardından aşağıdaki projeleri bulun ve yükleyin:
    • windowsazure.mediaservices
    • windowsazure.mediaservices.extensions

Video moderrasyon kodu ekleme

Ardından, temel bir içerik moderasyonu senaryosu uygulamak için kodu bu kılavuzdan kopyalayıp projenize yapıştıracaksınız.

Programı deyimler kullanarak güncelleştirme

Aşağıdaki using deyimlerini Program.cs dosyanızın en üstüne ekleyin.

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;

Kaynak başvurularını ayarlama

Aşağıdaki statik alanları Program.cs'de Program sınıfına ekleyin. Bu alanlar, AMS aboneliğinize bağlanmak için gereken bilgileri içerir. Bunları yukarıdaki adımlarda yer alan değerlerle doldurun. değerinin Azure AD uygulamanıza yönelik Uygulama Kimliği değeri ve bu uygulama için oluşturduğunuz CLIENT_ID CLIENT_SECRET "VideoModKey" değeri olduğunu unutmayın.

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

Yerel bir video dosyası (en basit durum) kullanmak isterseniz, bunu projeye ekleyin ve değerini (göreli yollar yürütme dizinine göredir) INPUT_FILE olarak girin.

Ayrıca, geçerli dizinde preset.json dosyasını oluşturmanız ve bunu kullanarak bir sürüm numarası belirtmeniz gerekir. Örnek:

{
    "version": "2.0"
}

Giriş videolarını yükleme

Program sınıfının Main yöntemi bir Azure Medya Bağlamı ve ardından bir Azure Depolama Bağlamı (videolarınız blob depolamada olabilir) oluştur. Kalan kod yerel klasör, blob veya Azure depolama kapsayıcısı içindeki birden çok blobdan bir videoyu tarar. Diğer kod satırlarını açıklama satırı olarak kullanarak tüm seçenekleri denemeniz gerekir.

// 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 Medya Bağlamı oluşturma

Program sınıfına aşağıdaki yöntemi ekleyin. Bu, AMS ile iletişime izin vermek için AMS kimlik bilgilerinizi kullanır.

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

Azure Uygulama Bağlamı oluşturmak için Depolama ekleme

Program sınıfına aşağıdaki yöntemi ekleyin. Blob depolamanıza erişmek Depolama kimlik bilgilerinizle oluşturulan Depolama Context'i kullanırsiniz.

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

Yerel dosyadan ve blobdan Azure Media Assets oluşturmak için kodu ekleyin

Medya Content Moderator işlemcisi, işleri Azure Media Services platform içindeki Varlıklar üzerinde çalıştırır. Bu yöntemler, Varlıkları yerel bir dosyadan veya ilişkili bir blobdan oluşturabilir.

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

Kapsayıcı içindeki bir video koleksiyonunu (blob olarak) taramak için kodu ekleyin

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

Content Moderator İş'i çalıştırmak için yöntemini ekleyin

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

Yardımcı işlevler ekleme

Bu yöntemler Content Moderator çıktı dosyasını (JSON) Azure Media Services varlığından indirir ve programın konsola çalışan bir durumu günlüğe yükleyebizim için moderation işinin durumunu izlemeye yardımcı olur.

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

Programı çalıştırma ve çıktıyı gözden geçirme

İçerik Moderasyon işi tamamlandıktan sonra JSON yanıtını analiz edin. Şu öğelerden oluşur:

  • Video bilgileri özeti
  • "parçalar" olarak çekim
  • Yetişkinlere Yönelik ve Racy puanlarına göre "events " with a reviewRecommended" (= true veya false)" bayrağı olarak anahtar kareler
  • start, duration, totalDuration ve timestamp "ticks" içindedir. Saniye sayısını almak için zaman ölçeğine göre bölün.

Not

  • adultScore , belirli durumlarda cinsel içerikli veya yetişkinlere yönelik olarak değerlendirilecek içeriğin olası varlığını ve tahmin puanını temsil eder.
  • racyScore , bazı durumlarda cinsel içerik önerisinde bulunma veya olgunluk durumu olarak değerlendirilen içeriğin olası varlığını ve tahmin puanını temsil eder.
  • adultScore ve racyScore 0 ile 1 arasında. Puan ne kadar yüksek ise model, kategorinin uygulanabilir olacağını tahmin etmek için o kadar yüksek olur. Bu önizleme, el ile kodlu sonuçlar yerine istatistiksel bir modelden kaynaklandı. Her kategorinin gereksinimlerinize nasıl uygun olduğunu belirlemek için kendi içeriğinizi test etmenizi öneririz.
  • reviewRecommended , iç puan eşiklerine bağlı olarak true veya false olur. Müşterilerin bu değeri kullanıp kullanmama veya içerik ilkelerine göre özel eşiklere karar vermeleri gerekir.
{
"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
        }
    ]
    ]
}
]
}

Sonraki adımlar

Moderrasyon çıkışından video incelemeleri oluşturma hakkında bilgi edinebilirsiniz.

Bunun ve Visual Studio .NET hızlı başlangıçları Content Moderator çözümlerini indirin.