FairPlay Streaming:在 AVPlayerItemVideoOutput returns NULL 上调用 copyPixelBufferForItemTime

FairPlay Streaming: Calling copyPixelBufferForItemTime on AVPlayerItemVideoOutput returns NULL

有没有人有过将 HLS 与 Fairplay 一起使用并成功检索像素缓冲区的经验?

我正在使用 AVURLAsset 及其 resourceLoader 委托集。我的 AVAssetResourceLoaderDelegate 负责处理 Fairplay 流程。

它在 AVPlayerLayer 上显示正常,但是,当我尝试使用附加到 AVPlayerItemAVPlayerItemVideoOutput 并在其上使用 copyPixelBufferForItemTime 时,返回的 pixelBuffer 始终为 NULL。

另一方面,当我使用非加密流而不使用 resourceLoader copyPixelBufferForItemTime returns 预期的像素缓冲区时。

这是按预期工作吗? (即使用 FairPlay 保护的流不会暴露其像素缓冲区以防止滥用。)

如果没有,有没有办法从 iOS 上使用 FairPlay 保护的流中获取像素缓冲区?

在进一步研究这个问题之后,我得出的结论是,Apple 设计他们的 AVPlayer 的方式是,一旦你使用 FairPlay 保护 HLS,解密数据的唯一出口点(见 A:)copyPixelBufferForItemTime总是returns无。

  • 我已经测试了没有加密的完全相同的流和 copyPixelBufferForItemTime returns 对像素缓冲区的引用,如预期的那样。
  • 我已经在 AVPlayerLayer 上使用 加密测试了完全相同的流 并且它显示了例外的视频。

看来,一旦您使用 FairPlay,显示受保护视频内容的唯一方法就是使用 AVPlayerLayer。例如,目前似乎无法从 Apple 的 API 检索 FairPlay 保护的 HLS 媒体,以便在 3D 的 OpenGL 纹理上显示它 space。

答:copyPixelBufferForItemTime 是唯一的退出点,因为在 AVPlayerLayer 上调用 renderInContext 不起作用

我在使用 AVURLAsset 及其 resourceLoader 委托集时遇到了同样的问题。与您的情况不同,有两种实时流媒体解密内容,其中一种可以检索像素缓冲区,另一种不能。不知道是不是和m3u8文件的内容有关

可以检索像素缓冲区的内容,并获取缩略图。

#EXTM3U
#EXT-X-VERSION:2
#EXT-X-KEY:METHOD=AES-128,URI="http://xxx.xxxx.net/key/xxx",IV=0xxxx
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:11601809
#EXTINF:10, no desc
#EXT-X-PROGRAM-DATE-TIME:2019-05-28T11:00:10Z
stream_index_20190331T232744_1_11601809.ts
#EXTINF:10, no desc
#EXT-X-PROGRAM-DATE-TIME:2019-05-28T11:00:20Z
stream_index_20190331T232744_1_11601810.ts

无法检索像素缓冲区的内容

#EXTM3U
#EXT-X-VERSION:8
#EXT-X-INDEPENDENT-SEGMENTS

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audiod",NAME="en",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",URI="Audio3_2.m3u8"

#EXT-X-STREAM-INF:BANDWIDTH=3000000,AVERAGE-BANDWIDTH=3000000,VIDEO-RANGE=PQ,CODECS="dvh1.05.06",RESOLUTION=1920x1080,FRAME-RATE=50.000,AUDIO="audiod",CLOSED-CAPTIONS=NONE,HDCP-LEVEL=TYPE-1
Video1_1.m3u8