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 не работает