2

我在上传后使用 Windows Azure 媒体服务进行视频处理。我的基本工作流程包括将文件上传到 WAMS 资产、创建作业、创建 2 个任务 - 第一个从视频创建缩略图,第二个将其编码为 HTML5。目前,一切都很好,但是我不得不为各个任务创建 2 个不同的输出资产容器。作业完成后,我将文件(缩略图)复制到视频资产,并删除缩略图资产,以便所有生成的文件都在同一个资产中。

这是可行的,但感觉很笨拙,并且会产生一些复制文件的开销,然后删除不必要的资产。有没有办法告诉编码任务使用缩略图任务的输出资产?

4

3 回答 3

1

简短的回答是否定的。这是设计使然,我很想知道为什么您的用例要求 .jpg 与您的视频在同一个容器中。

于 2014-03-12T15:44:37.747 回答
1

请改用以下内容。

  1. 从您想要的编码预设开始
  2. 您可以通过从http://go.microsoft.com/fwlink/?linkid=253275下载示例代码并浏览到 WAMEPresetFiles 子文件夹来获取该预设的 XML
  3. 编辑预设如下:

    <MediaFile ...
    ThumbnailTime="00:00:00" ThumbnailMode="BestFrame" ThumbnailJpegCompression="95" ThumbnailCodec="Jpeg" ThumbnailSize="100%, 100%" ThumbnailEmbed="False">

  4. 以上指示编码器在视频时间线上选择合适的帧(ThumbnailMode=”BestFrame”),并创建与输入视频分辨率相同的 JPEG 图像。您可以进一步调整上述设置 -完整列表请参见http://msdn.microsoft.com/en-us/library/dn554337.aspx

  5. 将生成的预设 XML 保存到合适的文件中,例如“EncodeWithImage.xml”</li>
  6. 使用以下代码段提交编码任务:

        string inputPresetFile = @"C:\TEMP\EncodeWithImage.xml";
        string presetName = Path.GetFileNameWithoutExtension(inputPresetFile);
        IAsset asset = ???; // This is the input Asset for the Task
    
        IJob job = _context.Jobs.Create("Encode Job for " + asset.Name + ", encoded using " +  presetName);
        Console.WriteLine("Encode Job for " + asset.Name + ", encoded using " + presetName);
        // Get a media processor reference, and pass to it the name of the processor to use for the specific task.
        IMediaProcessor processor = GetLatestMediaProcessorByName("Windows Azure Media Encoder");
        Console.WriteLine("Got MP " + processor.Name + ", ID : " + processor.Id + ", version: " + processor.Version);
    
        // Read the configuration data into a string. 
        string configuration = File.ReadAllText(inputPresetFile);
    
        // Create a task with the encoding details, using a string preset.
        ITask task = job.Tasks.AddNew("Encode Task for " + asset.Name + ", encoded using " + presetName, processor, configuration,
            Microsoft.WindowsAzure.MediaServices.Client.TaskOptions.None);
    
        // Specify the input asset to be encoded.
        task.InputAssets.Add(asset);
    
        // Add an output asset to contain the results of the job.
        task.OutputAssets.AddNew("Output asset for encoding " + asset.Name + " using " + presetName, AssetCreationOptions.None);
    
        // Launch the job. 
        job.Submit();
    
于 2014-03-12T21:52:46.253 回答
-1

如果我理解正确,您想链接两个任务,其中第二个任务的输入是第一个任务的输出。如果是这样,从 github 存储库复制/粘贴相应的测试:https ://github.com/WindowsAzure/azure-sdk-for-media-services/blob/dev/test/net/Scenario/JobTests.cs

[TestMethod]
            [DeploymentItem(@"Media\Thumbnail.xml", "Media")]
            [DeploymentItem(@"Media\SmallWmv.wmv", "Media")]
            [Priority(0)]
            [TestCategory("DailyBvtRun")]
            public void ShouldSubmitAndFinishChainedTasks()
            {
                IAsset asset = AssetTests.CreateAsset(_mediaContext, _smallWmv, AssetCreationOptions.StorageEncrypted);

                IJob job = _mediaContext.Jobs.Create("Test");
                IMediaProcessor mediaProcessor = GetMediaProcessor(_mediaContext, WindowsAzureMediaServicesTestConfiguration.MpEncoderName);
                ITask task = job.Tasks.AddNew("Task1", mediaProcessor, GetWamePreset(mediaProcessor), TaskOptions.None);
                task.InputAssets.Add(asset);
                IAsset asset2 = task.OutputAssets.AddNew("Another asset");

                string xmlPreset = File.ReadAllText(WindowsAzureMediaServicesTestConfiguration.ThumbnailXml);
                ITask task2 = job.Tasks.AddNew("Task2", mediaProcessor, xmlPreset, TaskOptions.None);
                task2.InputAssets.Add(asset2);
                task2.OutputAssets.AddNew("JobOutput", options: AssetCreationOptions.None);
                job.Submit();


                WaitForJob(job.Id, JobState.Finished, VerifyAllTasksFinished);
            }
于 2014-03-11T05:27:03.090 回答