Nahrání videí na server a jejich indexování
Tento článek ukazuje, jak nahrávat a indexovat videa pomocí webu Azure Video Analyzer pro média (dříve Video Indexer) a rozhraní API Upload Video.
Při vytváření analyzátoru videa pro účet Media si můžete vybrat mezi:
- Bezplatný zkušební účet. Video Analyzer pro média poskytuje až 600 minut bezplatného indexování pro uživatele webu a až 2 400 minut bezplatného indexování pro uživatele rozhraní API.
- Placená možnost, kdy nejste omezeni kvótou. Vytvoříte analyzátor videa pro účet Media, který je připojený k vašemu předplatnému Azure a Azure Media Services účtu. Platíte za indexované minuty.
Další informace o typech účtů najdete v tématu Media Services ceny.
Při nahrávání videí pomocí rozhraní API máte následující možnosti:
- Upload video z adresy URL (upřednostňované).
- Odešlete videosoubor jako pole bajtů v textu požadavku.
- Použijte existující prostředek Azure Media Services tak, že poskytnete ID prostředku. Tato možnost je podporovaná jenom u placených účtů.
Podporované formáty souborů
Seznam formátů souborů, které můžete použít s Analyzátorem videa pro média, najdete v tématu Formáty a kodeky kodéru standard.
Storage videosouborů
Při použití Analyzátoru videa pro média se videosoubory ukládají v Azure Storage prostřednictvím Media Services. Omezení mají velikost 30 GB a délku 4 hodiny.
Kdykoli můžete odstranit videosoubory a zvukové soubory spolu s metadaty a přehledy, které z nich analyzátor videa pro média extrahooval. Po odstranění souboru z Analyzátoru videa pro média se soubor a jeho metadata a přehledy trvale odstraní z Analyzátoru videa pro média. Pokud jste ale implementovali vlastní řešení zálohování do Azure Storage, soubor zůstane ve Azure Storage.
Trvalost videa je stejná bez ohledu na to, jestli ho nahrajete pomocí analyzátoru videa pro mediální web nebo pomocí rozhraní API Upload Video.
Upload a indexování videa pomocí webu
Přihlaste se k webu Analyzátor videa pro média a pak vyberte Upload.
Po nahrání videa začne Analyzátor videa pro média indexovat a analyzovat video.
Po dokončení analýzy analyzátoru videa pro média dostanete e-mail s odkazem na vaše video. E-mail obsahuje také krátký popis toho, co se ve vašem videu stalo (například lidé, témata, optické rozpoznávání znaků).
Upload a indexování videa pomocí rozhraní API
Pomocí rozhraní API Upload Video můžete nahrávat a indexovat videa na základě adresy URL. Následující ukázka kódu obsahuje zakomentovaný kód, který ukazuje, jak nahrát pole bajtů.
Konfigurace a parametry
Tato část popisuje některé volitelné parametry a kdy je nastavit. Nejnovější informace o parametrech najdete v tématu Video Analyzer for Media Portal.
externalID
Pomocí tohoto parametru můžete zadat ID, které bude k videu přidružené. ID je možné použít pro integraci do externího systému pro správu obsahu videa (VCM). Videa, která jsou na portálu Analyzátor videa pro média, je možné prohledávat prostřednictvím zadaného externího ID.
callbackUrl
Pomocí tohoto parametru můžete zadat adresu URL zpětného volání.
Adresa URL zpětného volání slouží k upozornění zákazníka (prostřednictvím žádosti POST) o následujících událostech:
Změna stavu indexování:
Vlastnosti:
Název Popis id ID videa state Stav videa Příklad: https: / /test.com/notifyme?projectName=MyProject&ID = 1234abcd&State = zpracovaná
Osoba identifikovaná ve videu:
Vlastnosti
Název Popis id ID videa faceId ID obličeje, které se zobrazí v indexu videa knownPersonId Jedinečné ID osoby v rámci modelu obličeje personName Jméno osoby Příklad: https: / /test.com/notifyme?projectName=MyProject&ID = 1234abcd&FaceID = 12&knownPersonId = CCA84350-89B7-4262-861C-3CAC796542A5&person = Inigo_Montoya
Video Analyzer pro média vrátí všechny existující parametry zadané v původní adrese URL. Adresa URL musí být kódovaná.
indexingPreset
Pomocí tohoto parametru můžete definovat sadu AI, kterou chcete použít pro zvukový soubor nebo videosoubor. Tento parametr se používá ke konfiguraci indexovacího procesu. Můžete určit tyto hodnoty:
AudioOnly: Indexování a extrahování přehledů pouze pomocí zvuku (ignorování videa)VideoOnly: Indexování a extrahování přehledů pouze pomocí videa (ignorování zvuku)Default: Indexujte a extrahujte přehledy pomocí zvuku i videa.DefaultWithNoiseReduction: Indexování a extrahování přehledů ze zvuku i videa při použití algoritmů pro redukci šumu ve zvukovém streamuHodnota
DefaultWithNoiseReductionje teď namapovaná na výchozí předvolbu (zastaralá).BasicAudio: Indexování a extrahování přehledů pouze pomocí zvuku (ignorování videa) Zahrnovat jenom základní zvukové funkce (přepis, překlad, formátování výstupních titulků a titulků).AdvancedAudio: Indexování a extrahování přehledů pouze pomocí zvuku (ignorování videa) Kromě standardní analýzy zvuku můžete zahrnout i pokročilé zvukové funkce (například detekci zvukových událostí).AdvancedVideo: Indexování a extrahování přehledů pouze pomocí videa (ignorování zvuku) Kromě standardní analýzy videa můžete zahrnout i pokročilé funkce videa (například trasování pozorovaných osob).AdvancedVideoAndAudio: Indexujte a extrahujte přehledy pomocí pokročilé analýzy zvuku i pokročilé analýzy videa.
Poznámka
Mezi předchozí upřesňující předvolby patří modely, které jsou ve verzi Public Preview. Když tyto modely dosáhnou obecné dostupnosti, může to mít za cenu vliv.
Analyzátor videa pro média pokrývá až dvě stopy zvuku. Pokud má soubor více zvukových stop, jsou považovány za jednu stopu. Pokud chcete indexovat stopy samostatně, musíte extrahovat příslušný zvukový soubor a indexovat ho jako AudioOnly .
Cena závisí na vybrané možnosti indexování. Další informace najdete v tématu Media Services .
Prioritou
Video Analyzer pro média indexuje videa podle jejich priority. K určení priority priority indexu použijte parametr . Platné jsou následující hodnoty: Low , Normal (výchozí) a High .
Tento parametr se podporuje pouze pro placené účty.
streamingPreset
Po nahrání videa video analyzátor videa pro média volitelně zakóduje. Pak pokračuje k indexování a analýze videa. Po provedení analýzy analyzátoru videa pro média obdržíte oznámení s ID videa.
Pokud používáte rozhraní API Upload Video nebo Re-Index Video, jedním z volitelných parametrů je streamingPreset . Pokud nastavíte streamingPreset na Default, SingleBitrate nebo AdaptiveBitrate, aktivuje se proces kódování.
Po dokončení úloh indexování a kódování se video publikuje, abyste mohli video také streamovat. Koncový bod streamování, ze kterého chcete video streamovat, musí být ve stavu Spuštěno.
V případě se pro výstup použijí SingleBitrate standardní náklady na kodér. Pokud je výška videa větší nebo rovna 720, Video Analyzer pro média ho zakóduje jako 1280 × 720. V opačném případě se kóduje jako 640 x 468.
Výchozí nastavení je kódování podporující obsah.
Pokud chcete pouze indexovat video a nekódovat ho, nastavte streamingPreset na NoStreaming .
videoUrl
Tento parametr určuje adresu URL videosouboru nebo zvukového souboru, který se má indexovat. Pokud parametr není zadaný, Analyzátor videa pro média očekává, že soubor předáte jako obsah těla s více částmi videoUrl nebo formulářem.
Ukázka kódu
Následující fragmenty kódu C# ukazují použití všech analyzátoru videa pro rozhraní API médií najednou.
Po zkopírování následujícího kódu do vývojové platformy budete muset zadat dva parametry:
Klíč rozhraní API (
apiKey): Osobní klíč předplatného služby API Management. Umožňuje získat přístupový token, abyste mohli provádět operace s analyzátorem videa pro účet Media.Získání klíče rozhraní API:
- Přejděte na video analyzátor pro portál médií.
- Přihlaste se.
- Přejděte do předplatného > autorizace > produktů.
- Zkopírujte hodnotu Primární klíč.
Adresa URL videa (
videoUrl): adresa URL videosouboru nebo zvukového souboru, který se má indexovat. Tady jsou požadavky:- Adresa URL musí ukazovat na soubor média. (Stránky HTML nejsou podporované.)
- Soubor lze chránit pomocí přístupového tokenu, který je k dispozici jako součást identifikátoru URI. Koncový bod, který obsluhuje soubor, musí být zabezpečený pomocí TLS 1,2 nebo novějšího.
- Adresa URL musí být kódovaná.
Výsledek úspěšného spuštění ukázky kódu zahrnuje adresu URL widgetu Insight a adresu URL widgetu pro hráče. Umožňují vám zkoumat přehledy a nahrané video v uvedeném pořadí.
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; }
}