Это мой первый вопрос здесь, так что не будьте серьезными.
Я воспроизвожу видео из сети с помощью AVPlayer. Я вывожу текущий кадр, используя AVPlayerItemVideoOutput, прикрепленный к AVPlayerItem, который воспроизводится AVPlayer. Чтобы проверить, готов ли новый кадр, я вызываю [AVPlayerItemVideoOutput hasNewPixelBufferForItemTime], затем выводит его с помощью OpenGL ES. Все работает отлично, если я читаю mp4, но если я пытаюсь читать m3u8, он работает около 1 секунды (~ 30 кадров), но после этого периода [AVPlayerItemVideoOutput hasNewPixelBufferForItemTime] начинает возвращать только FALSE, поэтому текущий кадр не обновляется.
В случае, если я ищу текущий кадр, используя [AVPlayer seekToTime], прежде чем эта проблема начнется, все будет нормально.
Тест m3u8 video Я использую здесь жизни:
http://195.16.112.71/adaptive/3006a26a-9154-4b38-a327-4fa2a2381ae6.video/3006a26a-9154-4b38-a327-4fa2a2381ae6.m3u8
Чтобы воспроизвести эту проблему, я модифицировал образец Apple AVPlayerDemo, вот он: https://yadi.sk/d/T2aVGoKnWmf5Z
Основное изменение заключается в том, что я вызываю [AVPlayerDemoPlaybackViewController update], который вызывает упомянутый [AVPlayerItemVideoOutput hasNewPixelBufferForItemTime]. Эта функция имеет статическую переменную счетчик, которая хранит количество успешных вызовов [AVPlayerItemVideoOutput copyPixelBufferForItemTime].
URL-адрес видеоролика установлен в [AVPlayerDemoPlaybackViewController setURL], он жестко запрограммирован в начале функции. По умолчанию его значение указывает на видео m3u8, которое воспроизводит проблему, в этом случае среднее значение счетчика составляет около 30, после кадра с этим индексом [AVPlayerItemVideoOutput имеетNewPixelBufferForItemTime] возвращает только FALSE.
В случае, когда используется другой URL-адрес видео (см. начало [AVPlayerDemoPlaybackViewController setURL] - есть альтернативный Url, который вы можете раскомментировать), все кадры успешно прочитаны.
Любая помощь будет оценена!