我将视频上传到azure,创建资源并对视频进行编码。编码完成后,我在资产文件夹(.ism,.mp4,.xml,.xml)中获得四个文件以及每个源的链接。当我尝试在视频播放器中播放.mp4文件时,没有任何反应。但是,当我下载.mp4文件时,它工作正常。
<video id="video1" src="https://123media.blob.core.windows.net/asset-bf389cc4-8454-410a-9492-7acab59b2d25/Wildlife_H264_4500kbps_AAC_und_ch2_128kbps.mp4" autoplay="autoplay" height="400" width="600" />
CloudStorageAccount storageAccount1 = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
CloudBlobClient cloudBlobClient1 = storageAccount1.CreateCloudBlobClient();
var context = new CloudMediaContext("123media", "###############################");
var CreateAsset = context.Assets.Create(Path.GetFileNameWithoutExtension(fileName), AssetCreationOptions.None);
var assetFile = CreateAsset.AssetFiles.Create(fileName);
IAccessPolicy writePolicy = context.AccessPolicies.Create("Policy For Copying", TimeSpan.FromMinutes(30), AccessPermissions.Write | AccessPermissions.List);
ILocator assetLocator = context.Locators.CreateSasLocator(CreateAsset, writePolicy, DateTime.UtcNow.AddMinutes(-5));
string assetContainerName = (new Uri(assetLocator.Path)).Segments[1];
CloudBlobContainer assetContainer = cloudBlobClient1.GetContainerReference(assetContainerName);
CloudBlockBlob assetBlob = assetContainer.GetBlockBlobReference(blobName);
assetBlob.StartCopyFromBlob(blob);
var inputAsset = context.Assets.Where(a => a.Id == CreateAsset.Id).FirstOrDefault();
if (inputAsset == null)
throw new ArgumentException("Could not find assetId: " + CreateAsset.Id);
var encodingPreset = "H264 Broadband 720p"; // <a href="http://msdn.microsoft.com/en-us/library/windowsazure/jj129582.aspx#H264Encoding">http://msdn.microsoft.com/en-us/library/windowsazure/jj129582.aspx#H264Encoding</a>
IJob job = context.Jobs.Create("Encoding " + inputAsset.Name + " to " + encodingPreset);
IMediaProcessor latestWameMediaProcessor = (from p in context.MediaProcessors where p.Name == "Windows Azure Media Encoder" select p).ToList().OrderBy(wame => new Version(wame.Version)).LastOrDefault();
ITask encodeTask = job.Tasks.AddNew("Encoding", latestWameMediaProcessor, encodingPreset, TaskOptions.None);
encodeTask.InputAssets.Add(inputAsset);
encodeTask.OutputAssets.AddNew(inputAsset.Name + " as " + encodingPreset, AssetCreationOptions.None);
job.Submit();
job.GetExecutionProgressTask(CancellationToken.None).Wait();
CloudStorageAccount storageAccount1 = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
CloudBlobClient cloudBlobClient1 = storageAccount1.CreateCloudBlobClient();
var context = new CloudMediaContext("123media", "###############################");
var CreateAsset = context.Assets.Create(Path.GetFileNameWithoutExtension(fileName), AssetCreationOptions.None);
var assetFile = CreateAsset.AssetFiles.Create(fileName);
IAccessPolicy writePolicy = context.AccessPolicies.Create("Policy For Copying", TimeSpan.FromMinutes(30), AccessPermissions.Write | AccessPermissions.List);
ILocator assetLocator = context.Locators.CreateSasLocator(CreateAsset, writePolicy, DateTime.UtcNow.AddMinutes(-5));
string assetContainerName = (new Uri(assetLocator.Path)).Segments[1];
CloudBlobContainer assetContainer = cloudBlobClient1.GetContainerReference(assetContainerName);
CloudBlockBlob assetBlob = assetContainer.GetBlockBlobReference(blobName);
assetBlob.StartCopyFromBlob(blob);
var inputAsset = context.Assets.Where(a => a.Id == CreateAsset.Id).FirstOrDefault();
if (inputAsset == null)
throw new ArgumentException("Could not find assetId: " + CreateAsset.Id);
var encodingPreset = "H264 Broadband 720p"; // <a href="http://msdn.microsoft.com/en-us/library/windowsazure/jj129582.aspx#H264Encoding">http://msdn.microsoft.com/en-us/library/windowsazure/jj129582.aspx#H264Encoding</a>
IJob job = context.Jobs.Create("Encoding " + inputAsset.Name + " to " + encodingPreset);
IMediaProcessor latestWameMediaProcessor = (from p in context.MediaProcessors where p.Name == "Windows Azure Media Encoder" select p).ToList().OrderBy(wame => new Version(wame.Version)).LastOrDefault();
ITask encodeTask = job.Tasks.AddNew("Encoding", latestWameMediaProcessor, encodingPreset, TaskOptions.None);
encodeTask.InputAssets.Add(inputAsset);
encodeTask.OutputAssets.AddNew(inputAsset.Name + " as " + encodingPreset, AssetCreationOptions.None);
job.Submit();
job.GetExecutionProgressTask(CancellationToken.None).Wait();
答案 0 :(得分:1)
您可能无法播放视频的一个原因是,您尚未在媒体服务帐户中添加流式端点。 分配至少一个单元,以便能够在线流式传输视频。这对我有用。 在这里找到它。
另外,请按照MingFei Yan的博客进行操作。从Azure Media Services开始时非常有用。
答案 1 :(得分:0)
如果您的资源通过该网址公开 - 请尝试将type ='video / mp4'添加到视频代码中。
旁注 - 您还需要'发布'视频,以便通过共享的“编码单元”进行流式传输 - 您的.ism文件表明您已经创建了某种流式公共资源(我猜是平滑的)
请记住,并非所有浏览器都支持流媒体(MPEG DASH是HTML5流格式),而对于其他流媒体格式(Smooth或Apple HLS),您需要使用Silverlight \ Flash实现。
答案 2 :(得分:0)
Azure Media Services有很多功能。
首先,尽管Azure Media Services直接与Azure存储配合使用,但我强烈建议您不要直接使用底层存储(尽管技术上可以)。原因是 - 你将非常快速地控制公众可用的东西,什么不可以。甚至更多 - 您可能会破坏资产 - Blob链接并导致您的媒体服务不一致。
其次,在视频元素中播放MP4结果的正确方法是通过Shared Access Signature Locator提供MP4声明的完整路径。 Media Services正在使用的容器和blob标记为私有,不允许公共访问。所以,你需要一个定位器。当您只想在Video元素中看到结果时,您需要一个指向MP4的共享访问签名定位器。这将是渐进式下载视频播放,但它将播放。
最后但并非最不重要的是,永远不要忘记(from docu):
创建定位器后可能会有30-40秒的延迟 它可以使用。此问题适用于SAS URL和 OnDemandOrigin定位器。
所以你需要一个逻辑来管理你的定位器。据我所知,如果仍然如此,每个资产可以创建的定位器(或访问策略)数量有限。