0

我将视频上传到 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();

4

3 回答 3

1

您可能无法播放视频的一个原因是,您尚未在媒体服务帐户上添加流式传输端点。分配至少一个单元,以便能够在线流式传输您的视频。这对我有用。在这里找到它。

在此处输入图像描述

另外,关注严明飞的博客。在开始使用 Azure 媒体服务时非常有用。

于 2015-01-07T10:40:40.537 回答
0

如果您的资产可通过该 URL 公开 - 尝试将 type='video/mp4' 添加到视频标签。

旁注-您还需要“发布”视频,以便可以通过共享的“编码单元”进行流式传输-您的 .ism 文件表明您已经创建了某种流媒体公共资产(我猜是平滑的)。

请记住,并非所有浏览器都完全支持流式传输(MPEG DASH 是 HTML5 流式传输格式),对于其他流式传输格式(Smooth 或 Apple HLS),您需要使用 Silverlight \ Flash 实现。

于 2014-12-23T23:58:51.327 回答
0

Azure 媒体服务有几件事。

首先,虽然 Azure 媒体服务直接与 Azure 存储一起工作,但我强烈建议您不要直接与底层存储一起工作(尽管您在技术上可以)。原因是 - 您将很快放松对公众可用和不可用的控制。甚至更多 - 您可能会破坏资产 - Blob 链接并导致媒体服务不一致。

其次,将 MP4 结果播放到 Video 元素中的正确方法是使用Shared Access Signature Locator提供 MP4 资产的完整路径。媒体服务正在使用的容器和 blob 被标记为私有,不允许公共访问。所以,你需要一个定位器。当您只想在视频元素中查看结果时,您需要一个指向 MP4 的共享访问签名定位器。这将是渐进式下载视频播放,但它会播放。

最后但并非最不重要的一点是,永远不要忘记(来自文档):

从创建定位器到可用时,可能会有 30-40 秒的延迟。此问题适用于 SAS URL 和 OnDemandOrigin 定位器。

所以你需要一个逻辑来管理你的定位器。据我记得,如果仍然如此,您可以为每个资产创建的定位器(或访问策略)的数量是有限的。

于 2014-12-29T07:01:33.823 回答