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