2013-04-27 49 views
1

我正在編寫使用Azure媒體服務批量編碼媒體的代碼。該過程正常工作,但是我還需要在過程中跟蹤SQL數據庫中的源和輸出資產,以便我可以引用原始介質(存儲在blob中)和新的輸出資產ID。在作業提交之前從編碼任務獲取Asset.ID

當我接收到blob媒體項並對其進行編碼時,編碼器會將新的IAsset.ID分配給新編碼的資產。但是,在作業提交給編碼器之前,似乎沒有將其分配給輸出資產。

如何在作業提交給編碼器之前獲取輸出asset.id? 或 如何以編程方式安全地獲取編碼資產的asset.id? (我知道如何如何將資產從Azure中獲取,但我需要綁定源和輸出媒體,以確保獲得正確的輸出資源非常重要)

我正在使用WCF,如果它使區別。

下面

/// <summary> 
     /// Encodes the asset from media storge. 
     /// </summary> 
     /// <param name="encodeTaskListSubmit">The encode task list.</param> 
     private List<List<EncodeInputTask>> ListofEncoderTasks; 
     public void EncodeAssetFromMediaStorge(List<EncodeInputTask> encodeTaskListSubmit) 
     { 
      var encodeTaskList = encodeTaskListSubmit; 
      //check list contents    
      int i = 0; 
      foreach (var encodeTask in encodeTaskList) 
      { 
       var assetIdCheckAgainstAzureAssets = _context.Assets.Where(x => x.Id == encodeTask.Asset.Id).FirstOrDefault(); 

       if (assetIdCheckAgainstAzureAssets == null) 
       { 
        encodeTaskList.RemoveAt(i); 
       } 
       i++; 
      } 

      var h264SmoothStreaming1080P = 
       encodeTaskList.Where(
        x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreaming1080P) 
           .ToList(); 

      var h264SmoothStreaming720P = 
       encodeTaskList.Where(
        x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreaming720P) 
           .ToList(); 

      var h264SmoothStreaming720Pfor3Gor4G = 
       encodeTaskList.Where(
        x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreaming720Pfor3Gor4G) 
           .ToList(); 

      var h264SmoothStreamingSd16X9 = 
       encodeTaskList.Where(
        x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreamingSd16X9) 
           .ToList(); 

      var h264SmoothStreamingSd4X3 = 
       encodeTaskList.Where(
        x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreamingSd4X3) 
           .ToList(); 


      //create new encoder job reference 
      IJob encoderJobs = _context.Jobs.Create("Job " + DateTime.Now + " " + Guid.NewGuid().ToString()); 

      var processor = GetLatestMediaProcessorByName("Windows Azure Media Encoder"); 

      ListofEncoderTasks = new List<List<EncodeInputTask>> 
       { 
        h264SmoothStreaming1080P, 
        h264SmoothStreaming720P, 
        h264SmoothStreaming720Pfor3Gor4G, 
        h264SmoothStreamingSd16X9, 
        h264SmoothStreamingSd4X3 
       }; 

      foreach (List<EncodeInputTask> encodeTasks in ListofEncoderTasks) 
      { 
       foreach (EncodeInputTask encodeTask in encodeTasks) 
       { 
        var encodePreset = Global.Common.GetEnumDescription(encodeTask.EncodePreset); 

        ITask task = encoderJobs.Tasks.AddNew("Task " + DateTime.Now + Guid.NewGuid(), processor, encodePreset, TaskOptions.ProtectedConfiguration); 

        task.InputAssets.Add(encodeTask.Asset); 

        string outputAssetName = encodeTask.Asset.Name + " " + encodePreset; 

        task.OutputAssets.AddNew(outputAssetName + " " + encodePreset, AssetCreationOptions.None); 

        encodeTask.Asset.Name = outputAssetName; 

        DatabaseAction.UpdateMediaItemState(encodeTask.Asset.Id, true, MediaServices.InternalAssetState.Encoding); 
       } 
      } 

      DatabaseAction.EncodeJobRegistry(encoderJobs.Name,true,ListofEncoderTasks); 

      DatabaseAction.RegisterSourceAssetInEncodedTable(ListofEncoderTasks); 

      encoderJobs.Submit();   

     } 

回答

1

編碼的資產當前方法保留一個鏈接到它的源,這是「父」屬性。

我可以使用此方法創建新編碼資產與其父母之間的鏈接。