iOS: AVPlayerItem seekToTime не ищет точное запрошенное время

Я работаю над приложением, которое передает видео через HTTP. AVPlayer используется для воспроизведения видео. Я использую AVPlayerItem и метод selectMediaOption для переключения между определенными видеопотоками (в источнике три потока).

Моя проблема заключается в том, что когда я переключаюсь между параметрами мультимедиа, я вызываю seekToTime: toleranceBefore: toleranceAfter:, чтобы пропустить новое видео до того же момента времени, что и видео, с которого я переключаюсь. Проблема в том, что это работает ненадежно. Видео обычно переходит к точке за несколько секунд до запрошенного времени, даже несмотря на то, что свойство AVPlayerItem currentTime сообщает запрошенное время. Я передаю kCMTimeZero как дляleranceBefore, так и дляleranceAfter.

Еще кое-что, о чем стоит упомянуть, это то, что это происходит только с одним конкретным медиапотоком. У меня есть другой медиапоток, который не показывает проблему.

Может ли кто-нибудь предложить, что может быть проблемой здесь?


person Ian Newson    schedule 05.02.2016    source источник
comment
какой кодек используется для кодирования потока?   -  person sage444    schedule 05.02.2016
comment
@ sage444 оба потока используют h264 для видео и aac для аудио в контейнере mpeg ts. Однако поток, который работает, использует основной профиль, а тот, который не использует высокий профиль.   -  person Ian Newson    schedule 05.02.2016
comment
Поиск точно с AVPlayer занимает некоторое время, поэтому вы можете указать допуск. Я не использовал AVPlayer какое-то время, но я считаю, что если вы укажете kCMTimeZero в качестве допуска, он будет проигнорирован, потому что переход к этому точному времени займет слишком много времени. Я предлагаю вам поэкспериментировать с несколькими различными допусками, чтобы увидеть, что является лучшим опытом.   -  person EmilioPelaez    schedule 20.04.2016
comment
@EmilioPelaez Я действительно нашел исправление, которое я задокументирую в ответе.   -  person Ian Newson    schedule 21.04.2016


Ответы (1)


Оказывается, эта проблема не имеет ничего общего с API или тем, как они используются. Похоже, что кодировщик, используемый для создания сегментов видео, создавал ошибки в результирующих файлах.

Ошибки, о которых сообщает ffprobe, выглядят следующим образом:

[h264 @ 00000249a4348980] decode_slice_header error
[h264 @ 00000249a4348980] no frame!
[h264 @ 00000249a4348980] non-existing PPS 0 referenced

Я не уверен, какой оригинальный инструмент использовался для создания сегментов видео, которые я использовал, но я убедился, что Apple mediafilesegmenter также вызывает ошибки.

Я решил ошибку, закодировав сегменты с помощью ffmpeg.

person Ian Newson    schedule 21.04.2016