Я использую службы мультимедиа Azure и функции Azure для создания элемента VOD для веб-сайта.Обычно при загрузке исходного видео триггер BLOB-объектов запускает DurableOrchestration, чтобы создать ресурс, а затем кодировать видео.Он также генерирует 3 миниатюры разных размеров, используя рамку по умолчанию {Best}.Пока все хорошо.
Теперь я хочу позволить пользователю выбрать кадр из закодированного видео и выбрать его в качестве эскиза плаката.
У меня есть HttpTrigger, который принимаетидентификатор ресурса и метка времени кадра и запускает другую долговременную функцию, которая должна воссоздать миниатюры в указанном кадре.
Но это не работает.
Изначально я получил 3 пустых изображения вновый актив, и когда я попытался заставить его вернуть изображения в исходный ресурс, я ничего не получил.
Это код, который я использую, чтобы попытаться достичь этого.Это почти то же самое, что и код для создания исходного ресурса.Единственное реальное отличие состоит в том, что в пресете json есть только инструкция для создания миниатюр, в активе уже есть 6 закодированных видео, 3 миниатюры и связанные метафайлы, и я не передаю исходный видеофайл в него (потому что я удаляюэто как часть очистки, как только оригинальная кодировка будет завершена).
PostData data = inputs.GetInput<PostData>();
IJob job = null;
ITask taskEncoding = null;
IAsset outputEncoding = null;
int OutputMES = -1;
int taskindex = 0;
bool useEncoderOutputForAnalytics = false;
MediaServicesCredentials amsCredentials = new MediaServicesCredentials();
try
{
AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(amsCredentials.AmsAadTenantDomain,
new AzureAdClientSymmetricKey(amsCredentials.AmsClientId, amsCredentials.AmsClientSecret),
AzureEnvironments.AzureCloudEnvironment);
AzureAdTokenProvider tokenProvider = new AzureAdTokenProvider(tokenCredentials);
_context = new CloudMediaContext(amsCredentials.AmsRestApiEndpoint, tokenProvider);
IAsset asset = _context.Assets.Where(a => a.Id == data.assetId).FirstOrDefault();
// Declare a new encoding job with the Standard encoder
int priority = 10;
job = _context.Jobs.Create("CMS encoding job", priority);
foreach (var af in asset.AssetFiles)
{
if (af.Name.Contains(".mp4)"))
af.IsPrimary = true;
else
af.IsPrimary = false;
}
// Get a media processor reference, and pass to it the name of the
// processor to use for the specific task.
IMediaProcessor processorMES = MediaServicesHelper.GetLatestMediaProcessorByName(_context, "Media Encoder Standard");
string preset = null;
preset = "MesThumbnails.json"; // the default preset
string start = data.frame;
if (preset.ToUpper().EndsWith(".JSON"))
{
// Build the folder path to the preset
string presetPath = Path.Combine(System.IO.Directory.GetParent(data.execContext.FunctionDirectory).FullName, "presets", preset);
log.Info("presetPath= " + presetPath);
preset = File.ReadAllText(presetPath).Replace("{Best}", start);
}
taskEncoding = job.Tasks.AddNew("rebuild thumbnails task",
processorMES,
preset,
TaskOptions.None);
// Specify the input asset to be encoded.
taskEncoding.InputAssets.Add(asset);
OutputMES = taskindex++;
string _storageAccountName = amsCredentials.StorageAccountName;
outputEncoding = taskEncoding.OutputAssets.AddNew(asset.Name + " MES encoded", _storageAccountName, AssetCreationOptions.None);
asset = useEncoderOutputForAnalytics ? outputEncoding : asset;
job.Submit();
await job.GetExecutionProgressTask(CancellationToken.None);
Мой вопрос заключается в том, возможно ли то, что я пытаюсь сделать, и если да, то что не так с подходом, который я использую?m take.
Я довольно много искал по этой теме, но всегда могу найти только ссылку на создание миниатюр во время кодирования видео, но никогда не генерировать миниатюры из кодированных видео после события.