Azure Media Services的MPEG-DASH播放异常问题求助
排查AES加密MPEG-DASH流无法播放的关键要点
结合你描述的情况——HLS流正常、播放器能识别时长但无法播放,且未配置令牌/DRM,大概率是密钥交付或Manifest配置的问题,以下是具体排查步骤:
1. 确认AES密钥的无授权交付是否正确配置
你提到没有添加令牌授权,那必须确保Azure Media Services的密钥交付策略设置为允许匿名访问:
- 登录Azure门户,找到对应的媒体资产,进入「加密」选项卡
- 检查内容密钥的交付策略:应该设置为
Open(无授权),而不是Token - 手动测试密钥能否被访问:构造密钥请求URL(格式为
http://<你的流式终结点>/<资产ID>/<资产名称>.ism/Key(hdl:ContentKey=<你的内容密钥ID>)/),用浏览器或curl访问。如果能返回二进制密钥数据(可能显示乱码,这是正常的),说明密钥交付没问题;如果返回403/404,那就是交付策略或密钥ID配置错误。
2. 检查DASH Manifest的加密元数据是否正确
下载你的DASH Manifest(直接访问你提供的MPD地址),查看<ContentProtection>节点是否包含正确的加密信息:
- 确认存在
schemeIdUri="urn:mpeg:dash:mp4protection:2011"的节点(对应CENC加密,AES-128属于这个范畴) - 检查
cenc:default_KID属性是否和你配置的内容密钥ID一致 - 确认
<ContentProtection>里包含正确的密钥获取URI(指向AMS的密钥交付端点),比如:<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="xxxx-xxxx-xxxx-xxxx-xxxxxxxx"> <dash:mpd:URIEssentialProperty schemeIdUri="urn:mpeg:dash:utc:http-xsdate:2014" value="http://prepladder-inct.streaming.media.azure.net/xxxx-xxxx-xxxx-xxxx-xxxxxxxx/sample-video.ism/Key(hdl:ContentKey=xxxxxx)/"/> </ContentProtection>
如果这些信息缺失或错误,播放器无法找到密钥进行解密,自然无法播放。
3. 排查Web端的CORS配置问题
你提到Web端播放器也无法播放,这很可能是**跨域资源共享(CORS)**的问题:
- 在Azure门户的「流式终结点」设置里,找到对应的终结点,进入「CORS」选项卡
- 添加播放器所在的域名(比如
*用于测试,但生产环境要指定具体域名),允许GET、OPTIONS方法 - 同时确保密钥交付端点的CORS也配置正确(AMS的密钥交付服务会继承流式终结点的CORS设置,但有时候需要单独确认)
4. 验证ExoPlayer的DASH加密支持配置
虽然你说ExoPlayer能播放测试DASH流,但针对AES加密的流,需要确保:
- 项目中正确引入了ExoPlayer的DASH模块:
implementation 'com.google.android.exoplayer:exoplayer-dash:2.X.X' - 对于ClearKey(AES-128属于此类),ExoPlayer默认应该支持,但可以显式配置
ClearKeyDrmSessionManager来确保解密逻辑正确:DefaultDrmSessionManager drmSessionManager = new DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider(C.CLEARKEY_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER) .build();
5. 检查转码输出的DASH流完整性
最后,确认转码过程是否生成了完整的DASH自适应流:
- 使用Azure Media Explorer工具查看媒体资产的内容,确认ISM文件包含了所有需要的轨道和DASH manifest信息
- 检查转码任务是否使用了AMS的标准预设(比如
AdaptiveStreaming),自定义预设可能会导致DASH流结构不兼容
内容的提问来源于stack exchange,提问作者Vitul Goyal
相关产品推荐
相关产品推荐

