2014-04-30 3 views
0

Everywhere online Azure Media Services에 업로드 된 비디오 파일과 관련된 몇 가지 설명을 찾을 수 있습니다.Windows Azure Media Services에서 오디오 파일 업로드 및 인코딩

자습서를 토대로 필자는 자신의 코드를 작성했습니다.

StoreAudio 방법을 실행 한 후 내가 가진 :

  • 새로운 물방울
  • 새로운 자산 Media 서비스를 성공적으로 미디어 서비스
  • 완료
  • 새 작업에 저장
  • 에 생성 된 자산은을 게시되지 않음
  • ID 또는 URI와 같은 convertedAsset 속성에서 가져 오려고하면 예외가 발생합니다.

왜 ID와 URI가 null입니까? 왜 "출판되지 않은"내용입니까?

코드 : 오디오 파일의 경우

public string StoreAudio(int ID, byte[] file) 
    { 
     try 
     { 
      var blobContainerName = AudioBookContainer; //+ AudioChapterID % 1000? 
      var fileName = ID + ".mp3"; 

      var mediaBlobContainer = blobClient.GetContainerReference(blobContainerName); 
      mediaBlobContainer.CreateIfNotExists(); 

      using (MemoryStream ms = new MemoryStream(file)) 
      { 
       var reference = mediaBlobContainer.GetBlockBlobReference(fileName); 
       reference.UploadFromStream(ms); 
      } 

      IAsset asset = _context.Assets.Create(fileName, AssetCreationOptions.None); 
      IAccessPolicy writePolicy = _context.AccessPolicies.Create("writePolicy", TimeSpan.FromMinutes(120), AccessPermissions.Write); 
      ILocator destinationLocator = _context.Locators.CreateLocator(LocatorType.Sas, asset, writePolicy); 
      Uri uploadUri = new Uri(destinationLocator.Path); 
      string assetContainerName = uploadUri.Segments[1]; 
      CloudBlobContainer assetContainer = blobClient.GetContainerReference(assetContainerName); 

      var sourceCloudBlob = mediaBlobContainer.GetBlockBlobReference(fileName); 
      sourceCloudBlob.FetchAttributes(); 
      if (sourceCloudBlob.Properties.Length > 0) 
      { 
       IAssetFile assetFile = asset.AssetFiles.Create(fileName); 
       var destinationBlob = assetContainer.GetBlockBlobReference(fileName); 
       destinationBlob.DeleteIfExists(); 
       destinationBlob.StartCopyFromBlob(sourceCloudBlob); 
       destinationBlob.FetchAttributes(); 
       if (sourceCloudBlob.Properties.Length != destinationBlob.Properties.Length) 
        throw new Exception("Error copying"); 
      } 
      destinationLocator.Delete(); 
      writePolicy.Delete(); 

      asset = _context.Assets.Where(a => a.Id == asset.Id).FirstOrDefault(); //At this point, you can create a job using your asset. 
      var encodedAsset = EncodeToWMA(asset); 
      return encodedAsset.Id; 

      //var ismAssetFiles = encodedAsset.AssetFiles.ToList().Where(f => f.Name.EndsWith(".ism", StringComparison.OrdinalIgnoreCase)).ToArray(); 
      //if (ismAssetFiles.Count() != 1)  
      // throw new ArgumentException("The asset should have only one, .ism file"); 

      //ismAssetFiles.First().IsPrimary = true; 
      //ismAssetFiles.First().Update(); 

      asset.Delete(); 

      return encodedAsset.Uri.AbsoluteUri;     
     } 
     catch(Exception exx) 
     { 
      return exx.Message + exx.InnerException; 
     } 
    } 


private static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName) 
    { 
     var processor = _context.MediaProcessors.Where(p => p.Name == mediaProcessorName).ToList().OrderBy(p => new Version(p.Version)).LastOrDefault(); 
     if (processor == null) 
      throw new ArgumentException(string.Format("Unknown media processor", mediaProcessorName)); 
     return processor; 
    } 

    public static IAsset EncodeToWMA(IAsset asset) 
    { 
     IJob job = _context.Jobs.Create("Convert MP3 to WMA"); 
     IMediaProcessor processor = GetLatestMediaProcessorByName("Windows Azure Media Encoder"); 
     ITask task = job.Tasks.AddNew("My encoding task", processor, "WMA High Quality Audio", TaskOptions.None); 
     task.InputAssets.Add(asset); 
     task.OutputAssets.AddNew(asset.Name.Replace(".mp3", ".wma"), AssetCreationOptions.None); 
     job.Submit(); 
     Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None); 
     progressJobTask.Wait(); 
     return task.OutputAssets.First(); 
    } 

답변

1

더 설명을 추가.

자산이 "게시되지 않음"인 이유 : 자산을 게시하지 않기 때문에 SAS 로케이터 또는 Origin 로케이터를 얻는 것이 자산을 게시하는 방법입니다.

+0

위의 코드를 보면 SAS 로케이터를 생성하는 선이있는 것 같습니다. ILocator destinationLocator = _context.Locators.CreateLocator (LocatorType.Sas, asset, writePolicy) ;. 설명대로 SAS 로케이터를 만들려면이 줄에서 어떻게 변경해야합니까? 사과드립니다. 저는 Media Services를 처음 사용합니다. – user1790300

1

, 당신은 파일 SAS 로케이터에 액세스 할 수있는 SAS 로케이터에 대한 질문을 할 수는 점진적 다운로드에 사용됩니다.

_context.Locators.Create (LocatorType.Sas, outputAsset, AccessPermissions.Read, TimeSpan.FromDays (30)); 따라서,

난 당신이 우리가 지금 WMA 파일의 오디오 스트리밍을 지원하지 않기 때문에 SAS 로케이터가 만들 제안 원점 스트리밍 로케이터 당신을 위해 작동하지 않습니다 방법 :

관련 문제