FairPlay Streaming: вызов copyPixelBufferForItemTime для AVPlayerItemVideoOutput возвращает значение NULL

Кто-нибудь имел опыт использования HLS с Fairplay и преуспел в получении буфера пикселей?

Я использую AVURLAsset с этими resourceLoader набор делегатов. мой AVAssetResourceLoaderDelegate заботится о работе с процессом Fairplay.

Он хорошо отображается на AVPlayerLayerОднако, когда я пытаюсь использовать AVPlayerItemVideoOutput который прикреплен к AVPlayerItem и использовать copyPixelBufferForItemTime для него возвращаемый pixelBuffer всегда равен NULL.

С другой стороны, когда я использую незашифрованный поток и не использую resourceLoader, copyPixelBufferForItemTime возвращает ожидаемый пиксельный буфер.

Это работает как задумано? (т.е. потоки, которые защищены с помощью FairPlay, не предоставляют свой буфер пикселей для предотвращения неправильного использования.)

А если нет, есть ли способ получить пиксельный буфер из потока, защищенного с помощью FairPlay на iOS?

1 ответ

Я столкнулся с той же проблемой при использовании 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

После дальнейшего изучения этой проблемы я пришел к выводу, что Apple разработала свой AVPlayer таким образом, что после того, как вы используете HLS, защищенный FairPlay, единственная точка выхода (см. A:) для расшифрованных данных copyPixelBufferForItemTime всегда возвращает ноль.

  • Я проверил точно такой же поток без шифрования и copyPixelBufferForItemTime возвращает ссылку на пиксельный буфер, как и ожидалось.
  • Я протестировал точно такой же поток с шифрованием на AVPlayerLayer, и он отображает видео как исключение.

Похоже, что после того, как вы используете FairPlay, единственный способ отобразить защищенный видеоконтент - это использовать AVPlayerLayer, Похоже, что на сегодняшний день нет способа извлечь защищенный FairPlay носитель HLS из API Apple, чтобы, например, отобразить его на текстуре OpenGL в трехмерном пространстве.

A: copyPixelBufferForItemTime быть единственной точкой выхода с момента звонка renderInContext на AVPlayerLayer не работает

Другие вопросы по тегам