Uw video's uploaden en indexeren
In dit artikel wordt beschreven hoe u video's uploadt en indexeert met behulp van de azure Video Analyzer for Media-website (voorheen Video Indexer) en de Upload Video-API.
Wanneer u een Video Analyzer voor Media-account maakt, kunt u kiezen uit het volgende:
- Een gratis proefaccount. Video Analyzer voor Media biedt websitegebruikers maximaal 600 minuten gratis indexering en maximaal 2400 minuten gratis indexering voor API-gebruikers.
- Een betaalde optie waarbij u niet wordt beperkt door een quotum. U maakt een Video Analyzer voor Media-account dat is verbonden met uw Azure-abonnement en een Azure Media Services-account. U betaalt voor geïndexeerde minuten.
Zie prijzen voor Media Services voor meer informatie over accounttypen.
Wanneer u video's uploadt met behulp van de API, hebt u de volgende opties:
- Upload video vanuit een URL (aanbevolen).
- Verzend het videobestand als een byte-matrix in de aanvraag body.
- Gebruik bestaande een Azure Media Services asset door de asset-id op te geven. Deze optie wordt alleen ondersteund in betaalde accounts.
Ondersteunde bestandsindelingen
Zie Indelingen en codecs van Standard Encoder voor een lijst met bestandsindelingen die u kunt gebruiken met Video Analyzer voor media.
Storage videobestanden
Wanneer u Video Analyzer voor Media gebruikt, worden videobestanden opgeslagen in Azure Storage via Media Services. De limieten zijn 30 GB groot en 4 uur lang.
U kunt altijd uw video- en audiobestanden verwijderen, samen met alle metagegevens en inzichten die Video Analyzer for Media uit deze bestanden heeft geëxtraheerd. Nadat u een bestand uit Video Analyzer voor Media hebt verwijderd, worden het bestand en de metagegevens en inzichten permanent verwijderd uit Video Analyzer for Media. Als u echter uw eigen back-upoplossing hebt geïmplementeerd in Azure Storage, blijft het bestand in Azure Storage.
De persistentie van een video is identiek, ongeacht of u uploadt met behulp van de website Video Analyzer voor Media of met behulp van de Upload Video-API.
Upload video's maken en indexeren met behulp van de website
Meld u aan op de website van Video Analyzer for Media en selecteer Upload .
Nadat uw video is geüpload, begint Video Analyzer voor Media met het indexeren en analyseren van de video.
Nadat Video Analyzer voor Media klaar is met analyseren, ontvangt u een e-mail met een koppeling naar uw video. Het e-mailbericht bevat ook een korte beschrijving van wat er in uw video is gevonden (bijvoorbeeld: personen, onderwerpen, optische tekenherkenning).
Upload video's maken en indexeren met behulp van de API
U kunt de Upload Video-API gebruiken om uw video's te uploaden en te indexeren op basis van een URL. Het volgende codevoorbeeld bevat de commentaarcode die laat zien hoe u de byte-matrix uploadt.
Configuraties en parameters
In deze sectie worden enkele van de optionele parameters beschreven en wanneer deze moeten worden ingesteld. Zie de Video Analyzer for Media-portalvoor de meest recente informatie over parameters.
externalID
Gebruik deze parameter om een id op te geven die aan de video wordt gekoppeld. De id kan worden toegepast op integratie in een extern VCM-systeem (Video Content Management). De video's in de Video Analyzer for Media-portal kunnen worden doorzocht via de opgegeven externe id.
callbackUrl
Gebruik deze parameter om een callback-URL op te geven.
Een callback-URL wordt gebruikt om de klant (via een POST-aanvraag) op de hoogte te stellen van de volgende gebeurtenissen:
Statuswijziging indexering:
Eigenschappen:
Naam Beschrijving id De video-id staat De videostatus Voorbeeld: https: / /test.com/notifyme?projectName=MyProject&id=1234abcd&state=Processed
Personen geïdentificeerd in de video:
Eigenschappen
Naam Beschrijving id De video-id faceId De gezichts-id die wordt weergegeven in de video-index knownPersonId De persoons-id die uniek is in een gezichtsmodel personName De naam van de persoon Voorbeeld: https: / /test.com/notifyme?projectName=MyProject&id=1234abcd&faceid=12&knownPersonId=ED84350-89B7-4262-861C-3CAC796542A5&personName=Inigo_Montoya
Video Analyzer voor Media retourneert alle bestaande parameters die zijn opgegeven in de oorspronkelijke URL. De URL moet worden gecodeerd.
indexingPreset
Gebruik deze parameter om een AI-bundel te definiëren die u wilt toepassen op uw audio- of videobestand. Deze parameter wordt gebruikt voor het configureren van het indexeringsproces. U kunt de volgende waarden opgeven:
AudioOnly: Indexeren en inzichten extraheren met behulp van alleen audio (video negeren).VideoOnly: Indexeren en inzichten extraheren met behulp van alleen video (audio wordt genegeerd).Default: Indexeren en inzichten extraheren met behulp van zowel audio als video.DefaultWithNoiseReduction: Indexeer en extraheer inzichten uit zowel audio als video, terwijl algoritmen voor ruisvermindering worden toegepast op de audiostroom.De
DefaultWithNoiseReductionwaarde is nu ingesteld op een standaardvoorinstelling (afgeschaft).BasicAudio: Indexeren en inzichten extraheren met behulp van alleen audio (video negeren). Alleen elementaire audiofuncties (transcriptie, vertaling, opmaak van uitvoerbijschriften en ondertiteling) opnemen.AdvancedAudio: Indexeren en inzichten extraheren met behulp van alleen audio (video negeren). Neem naast de standaard audioanalyse geavanceerde audiofuncties (zoals detectie van audiogebeurtenissen) op.AdvancedVideo: Indexeren en inzichten extraheren met behulp van alleen video (audio wordt genegeerd). Neem naast de standaardvideoanalyse geavanceerde videofuncties (zoals tracering van waargenomen personen) op.AdvancedVideoAndAudio: Indexeren en inzichten extraheren met behulp van geavanceerde audio- en geavanceerde videoanalyse.
Notitie
De voorgaande geavanceerde voorinstellingen bevatten modellen die in openbare preview zijn. Wanneer deze modellen algemeen beschikbaar zijn, kunnen dit gevolgen hebben voor de prijs.
Video Analyzer voor Media dekt maximaal twee audionummers. Als het bestand meer audionummers heeft, worden ze behandeld als één nummer. Als u de sporen afzonderlijk wilt indexeren, moet u het relevante audiobestand extraheren en indexeren als AudioOnly .
De prijs is afhankelijk van de geselecteerde optie voor indexering. Zie prijzen voor Media Services meer informatie.
priority
Video Analyzer voor Media indexeert video's op basis van hun prioriteit. Gebruik de priority parameter om de indexprioriteit op te geven. De volgende waarden zijn geldig: Low , Normal (standaard) en High .
Deze parameter wordt alleen ondersteund voor betaalde accounts.
streamingPreset
Nadat uw video is geüpload, codeert Video Analyzer voor Media eventueel de video. Vervolgens wordt verder met het indexeren en analyseren van de video. Wanneer Video Analyzer voor Media klaar is met analyseren, ontvangt u een melding met de video-id.
Wanneer u de api voor Upload video of video opnieuw indexeren gebruikt, is een van de optionele parameters streamingPreset . Als u streamingPreset instelt op Default, SingleBitrate of AdaptiveBitrate, wordt het coderingsproces geactiveerd.
Nadat de indexerings- en coderingstaken zijn uitgevoerd, wordt de video gepubliceerd zodat u uw video ook kunt streamen. Het streaming-eindpunt van waaruit u de video wilt streamen, moet de status Wordt uitgevoerd hebben.
Voor SingleBitrate gelden de standaardkosten voor de encoder voor de uitvoer. Als de videohoogte groter is dan of gelijk is aan 720, codeert Video Analyzer voor media deze als 1280 x 720. Anders wordt deze gecodeerd als 640 x 468.
De standaardinstelling is inhoudsbewuste codering.
Als u alleen uw video wilt indexeren en deze niet wilt coderen, stelt u in streamingPreset op NoStreaming .
videoUrl
Met deze parameter geeft u de URL op van het video- of audiobestand dat moet worden geïndexeerd. Als de parameter niet is opgegeven, verwacht Video Analyzer voor Media dat u het bestand als videoUrl meerdelige/formulierinhoud van de body doorgeeft.
Codevoorbeeld
De volgende C#-codefragmenten demonstreren het gebruik van alle Video Analyzer voor Media-API's samen.
Nadat u de volgende code naar uw ontwikkelplatform hebt kopieert, moet u twee parameters opgeven:
API-sleutel (
apiKey): uw persoonlijke API Management-abonnementssleutel. Hiermee kunt u een toegangs token krijgen om bewerkingen uit te voeren op uw Video Analyzer voor Media-account.Ga als volgende te werk om uw API-sleutel op te halen:
- Ga naar de Video Analyzer for Media-portal.
- Meld u aan.
- Ga naar Autorisatie-abonnement > > voor productenautorisatie.
- Kopieer de waarde van de primaire sleutel.
Video-URL (
videoUrl): een URL van het video- of audiobestand dat moet worden geïndexeerd. Dit zijn de vereisten:- De URL moet naar een mediabestand wijzen. (HTML-pagina's worden niet ondersteund.)
- Het bestand kan worden beveiligd door een toegangs token dat is opgegeven als onderdeel van de URI. Het eindpunt dat het bestand dient, moet worden beveiligd met TLS 1.2 of hoger.
- De URL moet worden gecodeerd.
Het resultaat van het succesvol uitvoeren van het codevoorbeeld bevat een URL van de widget inzicht en de URL van een spelerwidget. U kunt de inzichten en de geüploade video respectievelijk bekijken.
public async Task Sample()
{
var apiUrl = "https://api.videoindexer.ai";
var apiKey = "..."; // Replace with API key taken from https://aka.ms/viapi
System.Net.ServicePointManager.SecurityProtocol =
System.Net.ServicePointManager.SecurityProtocol | System.Net.SecurityProtocolType.Tls12;
// Create the HTTP client
var handler = new HttpClientHandler();
handler.AllowAutoRedirect = false;
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", apiKey);
// Obtain account information and access token
string queryParams = CreateQueryString(
new Dictionary<string, string>()
{
{"generateAccessTokens", "true"},
{"allowEdit", "true"},
});
HttpResponseMessage result = await client.GetAsync($"{apiUrl}/auth/trial/Accounts?{queryParams}");
var json = await result.Content.ReadAsStringAsync();
var accounts = JsonConvert.DeserializeObject<AccountContractSlim[]>(json);
// Take the relevant account. Here we simply take the first.
// You can also get the account via accounts.First(account => account.Id == <GUID>);
var accountInfo = accounts.First();
// We'll use the access token from here on, so there's no need for the APIM key
client.DefaultRequestHeaders.Remove("Ocp-Apim-Subscription-Key");
// Upload a video
var content = new MultipartFormDataContent();
Console.WriteLine("Uploading...");
// Get the video from URL
var videoUrl = "VIDEO_URL"; // Replace with the video URL
// As an alternative to specifying video URL, you can upload a file.
// Remove the videoUrl parameter from the query parameters below and add the following lines:
//FileStream video =File.OpenRead(Globals.VIDEOFILE_PATH);
//byte[] buffer =new byte[video.Length];
//video.Read(buffer, 0, buffer.Length);
//content.Add(new ByteArrayContent(buffer));
queryParams = CreateQueryString(
new Dictionary<string, string>()
{
{"accessToken", accountInfo.AccessToken},
{"name", "video_name"},
{"description", "video_description"},
{"privacy", "private"},
{"partition", "partition"},
{"videoUrl", videoUrl},
});
var uploadRequestResult = await client.PostAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos?{queryParams}", content);
var uploadResult = await uploadRequestResult.Content.ReadAsStringAsync();
// Get the video ID from the upload result
string videoId = JsonConvert.DeserializeObject<dynamic>(uploadResult)["id"];
Console.WriteLine("Uploaded");
Console.WriteLine("Video ID:");
Console.WriteLine(videoId);
// Wait for the video index to finish
while (true)
{
await Task.Delay(10000);
queryParams = CreateQueryString(
new Dictionary<string, string>()
{
{"accessToken", accountInfo.AccessToken},
{"language", "English"},
});
var videoGetIndexRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/Index?{queryParams}");
var videoGetIndexResult = await videoGetIndexRequestResult.Content.ReadAsStringAsync();
string processingState = JsonConvert.DeserializeObject<dynamic>(videoGetIndexResult)["state"];
Console.WriteLine("");
Console.WriteLine("State:");
Console.WriteLine(processingState);
// Job is finished
if (processingState != "Uploaded" && processingState != "Processing")
{
Console.WriteLine("");
Console.WriteLine("Full JSON:");
Console.WriteLine(videoGetIndexResult);
break;
}
}
// Search for the video
queryParams = CreateQueryString(
new Dictionary<string, string>()
{
{"accessToken", accountInfo.AccessToken},
{"id", videoId},
});
var searchRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/Search?{queryParams}");
var searchResult = await searchRequestResult.Content.ReadAsStringAsync();
Console.WriteLine("");
Console.WriteLine("Search:");
Console.WriteLine(searchResult);
// Generate video access token (used for get widget calls)
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", apiKey);
var videoTokenRequestResult = await client.GetAsync($"{apiUrl}/auth/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/AccessToken?allowEdit=true");
var videoAccessToken = (await videoTokenRequestResult.Content.ReadAsStringAsync()).Replace("\"", "");
client.DefaultRequestHeaders.Remove("Ocp-Apim-Subscription-Key");
// Get insights widget URL
queryParams = CreateQueryString(
new Dictionary<string, string>()
{
{"accessToken", videoAccessToken},
{"widgetType", "Keywords"},
{"allowEdit", "true"},
});
var insightsWidgetRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/InsightsWidget?{queryParams}");
var insightsWidgetLink = insightsWidgetRequestResult.Headers.Location;
Console.WriteLine("Insights Widget url:");
Console.WriteLine(insightsWidgetLink);
// Get player widget URL
queryParams = CreateQueryString(
new Dictionary<string, string>()
{
{"accessToken", videoAccessToken},
});
var playerWidgetRequestResult = await client.GetAsync($"{apiUrl}/{accountInfo.Location}/Accounts/{accountInfo.Id}/Videos/{videoId}/PlayerWidget?{queryParams}");
var playerWidgetLink = playerWidgetRequestResult.Headers.Location;
Console.WriteLine("");
Console.WriteLine("Player Widget url:");
Console.WriteLine(playerWidgetLink);
Console.WriteLine("\nPress Enter to exit...");
String line = Console.ReadLine();
if (line == "enter")
{
System.Environment.Exit(0);
}
}
private string CreateQueryString(IDictionary<string, string> parameters)
{
var queryParameters = HttpUtility.ParseQueryString(string.Empty);
foreach (var parameter in parameters)
{
queryParameters[parameter.Key] = parameter.Value;
}
return queryParameters.ToString();
}
public class AccountContractSlim
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Location { get; set; }
public string AccountType { get; set; }
public string Url { get; set; }
public string AccessToken { get; set; }
}