我正在尝试通过 VideoToolbox 播放受保护的 h264 流。但是,当我尝试通过
AVContentKey
将 CMSampleBuffer
绑定到 AVSampleBufferAttachContentKey(::)
时,我得到一个错误:
Error Domain=AVFoundationErrorDomain Code=-11836 "Cannot Open" UserInfo={NSLocalizedFailureReason=This app is not authorized to play this file., NSLocalizedDescription=Cannot Open, NSUnderlyingError=0x28303a220 {Error Domain=NSOSStatusErrorDomain Code=-12161 "(null)"}}
首先,我从 hls 流中取出第一个 ts 片段,并通过 ffmpeg 拉出 h264 轨道:
ffmpeg -i test.ts -vbsf h264_mp4toannexb -vcodec copy -an test.h264
我将生成的 h264 文件传输到试图复制它的 iOS 应用程序。格式处理的基本逻辑取自答案这里,简单的用swift写的,加上FairPlay模块的绑定
FairPlay 模块已初始化并正常工作,作为其工作的结果,我得到了
AVContentKey
。如果转成AVPlayer,用原来的hls流运行,就可以播放了。
我对发生的事情有一些想法,但我不知道如何确认或反驳它们:
这在一般情况下是不可能的。没有确切的使用说明
AVSampleBufferAttachContentKey(::)
,但也许它不打算与FairPlay加密一起使用,因为那里还有其他使用格式AVContentKey
同时,在文档中它明确涉及类别FairPlayStreaming
导出 h264 格式时缺少一些重要的东西。尽管 Specification 表明加密仅发生在特定的 Nalu 块中,并且在每个块的开头,加密向量被重置为初始值,但 cbc 暗示当前加密块对前一个加密块的依赖性。如果在解复用阶段遗漏了某些关键段,解密可能会出错。
我需要
VTDecompressionSession
和CMVideoFormatDescription
的一些额外设置。有很多标志和微妙的参数,应该设置哪些并不明显。现在基本配置已经配置好,可以很好地解码未受保护的流。
我错过了什么?为什么它不起作用?