1

有没有人有使用 HLS 和 Fairplay 并成功检索像素缓冲区的经验?

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

它在 an 上显示良好AVPlayerLayer,但是,当我尝试使用AVPlayerItemVideoOutput附加到AVPlayerItem并在其上使用copyPixelBufferForItemTime的 an 时,返回的 pixelBuffer 始终为 NULL。

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

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

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

4

2 回答 2

1

我在使用带有 resourceLoader 委托集的 AVURLAsset 时遇到了同样的问题。与您的情况不同,有两种直播解密内容,其中一种可以检索像素缓冲区,另一种则不能。我不确定它是否与 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
于 2019-07-02T08:05:36.183 回答
1

在进一步研究了这个问题之后,我得出的结论是,Apple 以这样一种方式设计了他们的 AVPlayer,即一旦你使用受 FairPlay 保护的 HLS,解密数据的唯一退出点(见 A:)copyPixelBufferForItemTime总是返回 nil。

  • 我已经在没有加密的情况下测试了完全相同的流,copyPixelBufferForItemTime并按预期返回了对像素缓冲区的引用。
  • 我已经在 AVPlayerLayer 上使用加密测试了完全相同的流,并将视频显示为例外。

看来,一旦您使用 FairPlay,显示受保护视频内容的唯一方法就是使用AVPlayerLayer. 到目前为止,似乎无法从 Apple 的 API 中检索受 FairPlay 保护的 HLS 媒体,以便将其显示在 3D 空间中的 OpenGL 纹理上。

A:copyPixelBufferForItemTime作为唯一的退出点,因为调用renderInContextAVPlayerLayer 不起作用

于 2017-03-18T10:43:08.290 回答