Videolarınızı karşıya yükleme ve dizinleme
Bu makalede, Medya için Azure Video Çözümleyicisi (eski adı Video Indexer) web sitesini ve Upload Video API'sini kullanarak videoları karşıya yükleme ve dizinleme gösterilir.
Medya hesabı için Video Çözümleyicisi oluştururken aşağıdakiler arasında seçim yapabilirsiniz:
- Ücretsiz deneme hesabı. Medya için Video Analyzer, web sitesi kullanıcılarına 600 dakikaya kadar, API kullanıcılarına ise 2.400 dakikaya kadar ücretsiz dizin oluşturma sağlar.
- Kotayla sınırlı olmadığınız ücretli bir seçenek. Azure aboneliğinize bağlı bir Medya hesabı için Video Analyzer ve bir Azure Media Services oluşturabilirsiniz. Dizinli dakikalar için ödeme siz ödersiniz.
Hesap türleri hakkında daha fazla bilgi için bkz. Media Services fiyatlandırması.
API'yi kullanarak videoları karşıya yüklerken aşağıdaki seçenekleriniz vardır:
- Upload URL'den (tercih edilir) ekleyin.
- Video dosyasını istek gövdesinde bir byte dizisi olarak gönderin.
- Varlık kimliğini Azure Media Services mevcut bir varlık kullanın. Bu seçenek yalnızca ücretli hesaplarda de kullanılabilir.
Desteklenen dosya biçimleri
Medya için Video Analyzer ile kullanabileceğiniz dosya biçimlerinin listesi için bkz. Standart Kodlayıcı biçimleri ve codec bileşenleri.
Depolama dosyaları
Medya için Video Analyzer'ı kullanarak video dosyaları azure Depolama Media Services. Sınırlar 30 GB boyutunda ve 4 saat uzunluğundadır.
Video ve ses dosyalarınızın yanı sıra Medya için Video Çözümleyicisi'nin bu dosyalardan ayıklamış olduğu meta verileri ve içgörüleri istediğiniz zaman silebilirsiniz. Medya için Video Analyzer'dan bir dosyayı sildikten sonra, dosya ve meta verileri ve içgörüleri Medya için Video Çözümleyicisi'ne kalıcı olarak kaldırılır. Ancak Azure Depolama'de kendi yedekleme çözümlerinizi Depolama.
Karşıya yüklediğiniz videonun kalıcılığı, Medya için Video Çözümleyicisi web sitesini veya Video API'sini Upload aynıdır.
Upload kullanarak video oluşturma ve dizin oluşturma
Medya için Video Çözümleyicisi web sitesinde oturum Upload.
Video karşıya yüklendikten sonra Medya için Video Çözümleyicisi videonun dizinini oluşturmaya ve analize başlar.
Medya için Video Çözümleyicisi çözümledikten sonra videonun bağlantısını içeren bir e-posta alırsınız. E-posta, videoda bulunanlara ilişkin kısa bir açıklama da içerir (örneğin: kişiler, konu başlıkları, optik karakter tanıma).
Upload API kullanarak video oluşturma ve dizinleme
Videolarınızı URL'Upload göre karşıya yüklemek ve dizine oluşturmak için Upload Video API'sini kullanabilirsiniz. Aşağıdaki kod örneği, byte dizisini karşıya yüklemeyi gösteren açıklamalı kod içerir.
Yapılandırmalar ve parametreler
Bu bölümde, isteğe bağlı parametrelerin bazıları ve ne zaman ayarlanları açık açıklamalır. Parametreler hakkında en güncel bilgiler için bkz. Medya portalı için Video Çözümleyicisi.
externalID
Videoyla ilişkilendirilecek bir kimlik belirtmek için bu parametreyi kullanın. Kimlik, dış video içerik yönetimi (VCM) sistemiyle tümleştirme için uygulanabilir. Medya portalı için Video Çözümleyicisi'nin içinde yer alan videolar, belirtilen dış kimlik üzerinden aranır.
callbackUrl
Geri çağırma URL'si belirtmek için bu parametreyi kullanın.
Müşteriye (POST isteği aracılığıyla) aşağıdaki olayları bildirmek için bir geri çağırma URL'si kullanılır:
Dizin oluşturma durumu değişikliği:
Özellikler:
Ad Açıklama kimlik Video kimliği state Video durumu Örnek: https: / /test.com/notifyme?projectName=MyProject&id=1234abcd&state=processed
Videoda tanımlanan kişi:
Özellikler
Ad Açıklama kimlik Video kimliği faceId Video dizininde görünen yüz kimliği knownPersonId Yüz modeli içinde benzersiz olan kişi kimliği personName Kişinin adı Örnek: https: / /test.com/notifyme?projectName=MyProject&id=1234abcd&faceid=12&knownPersonId=ARAK84350-89B7-4262-861C-3CAC796542A5&personName=Inigo_Montoya
Medya için Video Analyzer, özgün URL'de sağlanan mevcut parametreleri döndürür. URL kodlanmış olmalıdır.
indexingPreset
Ses veya video dosyanıza uygulamak istediğiniz bir AI paketi tanımlamak için bu parametreyi kullanın. Bu parametre, dizinleme işlemini yapılandırmak için kullanılır. Aşağıdaki değerleri belirtebilirsiniz:
AudioOnly: Yalnızca sesi kullanarak içgörüleri dizinleme ve ayıklama (videoyu yoksayma).VideoOnly: Yalnızca videoyu kullanarak içgörüleri dizinleme ve ayıklama (sesi yoksayma).Default: Hem ses hem de video kullanarak içgörüleri dizinleme ve ayıklama.DefaultWithNoiseReduction: Ses akışında gürültü azaltma algoritmalarını uygularken hem ses hem de video içgörülerini dizine alın ve ayıklar.Değer
DefaultWithNoiseReductionartık varsayılan bir ön ayara eşlenmiş (kullanım dışı).BasicAudio: Yalnızca sesi kullanarak içgörüleri dizinleme ve ayıklama (videoyu yoksayma). Yalnızca temel ses özelliklerini (transkripsiyon, çeviri, çıkış açıklamalı alt yazıların ve alt yazıların biçimlendirmesi) içerir.AdvancedAudio: Yalnızca sesi kullanarak içgörüleri dizinleme ve ayıklama (videoyu yoksayma). Standart ses analizine ek olarak gelişmiş ses özelliklerini (ses olay algılama gibi) dahil etmek.AdvancedVideo: Yalnızca videoyu kullanarak içgörüleri dizinleme ve ayıklama (sesi yoksayma). Standart video analizine ek olarak gelişmiş video özelliklerini (gözlemlenen kişi izleme gibi) dahil etmek.AdvancedVideoAndAudio: Hem gelişmiş ses hem de gelişmiş video analizini kullanarak içgörüleri dizine alın ve ayıklar.
Not
Yukarıdaki gelişmiş ön ayarlar, genel önizlemede olan modelleri içerir. Bu modeller genel kullanılabilirlik durumuna geldiğinde fiyatın etkileri olabilir.
Medya için Video Analyzer en fazla iki ses İzi kapsar. Dosyada daha fazla ses izi varsa bunlar tek parça olarak kabul edilir. Parçaları ayrı olarak dizine almak için ilgili ses dosyasını ayıklamanız ve olarak dizinlemenizi AudioOnly gerekir.
Fiyat, seçilen dizinleme seçeneğine bağlıdır. Daha fazla bilgi için bkz. Media Services fiyatlandırması.
Öncelik
Medya için Video Çözümleyicisi, videoları önceliklerine göre dizinler. Dizin priority önceliğini belirtmek için parametresini kullanın. Aşağıdaki değerler geçerlidir: Low , Normal (varsayılan) ve High .
Bu parametre yalnızca ücretli hesaplar için de destek sağlar.
streamingPreset
Video karşıya yüklendikten sonra, Medya için Video Çözümleyicisi isteğe bağlı olarak videoyu kodlar. Ardından videonun dizinini oluşturma ve analiz etme işlemine devam eder. Medya için Video Çözümleyicisi'nin analizi bittiğinde, video kimliğiyle bir bildirim alırsınız.
Upload Video veya Yeniden Dizin Video API'sini kullanırken isteğe bağlı parametrelerden biri streamingPreset olur. streamingPreset parametresini Default, SingleBitrate veya AdaptiveBitrate olarak ayarlarsanız kodlama işlemi tetiklenir.
Dizin oluşturma ve kodlama işleri tamam olduktan sonra video yayımlanır, böylece videonun akışını da s izleyebilirsiniz. Videonun akışını yapmak istediğiniz akış uç noktası Çalışıyor durumda olmalıdır.
için, SingleBitrate çıkış için standart kodlayıcı maliyeti uygulanır. Videonun yüksekliği 720'den büyük veya buna eşitse, Medya için Video Çözümleyicisi bunu 1280 x 720 olarak kodlar. Aksi takdirde 640 x 468 olarak kodlanmış olur.
Varsayılan ayar, içeriğe sahip kodlamadır.
Videolarınızı yalnızca dizine almak ve kodlamak istemiyorsanız olarak streamingPreset NoStreaming ayarlayın.
videoUrl
Bu parametre, dizine eklenecek videonun veya ses dosyasının URL'sini belirtir. parametresi videoUrl belirtilmezse, Medya için Video Analyzer dosyayı çok parçalı/form gövde içeriği olarak geçmenizi bekler.
Kod örneği
Aşağıdaki C# kod parçacıkları, tüm Medya API'leri için Video Analyzer'ın birlikte kullanımını gösterir.
Aşağıdaki kodu geliştirme platforma kopyalayıp iki parametre sağlamanız gerekir:
API anahtarı (
apiKey): Kişisel API management abonelik anahtarınız. Medya için Video Çözümleyicisi hesabınız üzerinde işlem gerçekleştirmek için erişim belirteci alasınız.API anahtarınızı almak için:
- Medya portalı için Video Çözümleyicisi'ne gidin.
- Oturum açın.
- Ürün Yetkilendirme Yetkilendirme > > aboneliği'ne gidin.
- Birincil anahtar değerini kopyalayın.
Video URL 'SI (
videoUrl): endekslenecek videonun veya ses dosyasının URL 'si. Gereksinimler şunlardır:- URL, bir medya dosyasına işaret etmelidir. (HTML sayfaları desteklenmez.)
- Dosya, URI 'nin bir parçası olarak sağlanmış olan bir erişim belirteciyle korunabilir. Dosyaya hizmet veren uç noktanın TLS 1,2 veya sonraki bir sürümü ile güvenli hale getirilmesi gerekir.
- URL kodlanmalıdır.
Kod örneğini başarıyla çalıştırmanın sonucu bir öngörü pencere öğesi URL 'SI ve oynatıcı pencere öğesi URL 'SI içerir. Bunlar, sırasıyla öngörüleri ve karşıya yüklenen videoyu incelemenizi sağlar.
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; }
}