Шаг на кадр назад — и почему он обычно такой медленный
Шаг вперёд для любого плеера — работа на один кадр. Шаг назад — нет: чтобы показать один кадр, может понадобиться декодировать сотни, а на файле с большими промежутками между ключевыми кадрами это секунда и больше на каждое нажатие. Вот откуда берётся эта цена, что показали замеры и какие две вещи делает Frame Player, чтобы шаг назад занимал примерно столько же, сколько шаг вперёд.
Пройти видео кадр за кадром — так аниматор проверяет тайминг, тренер ищет точный момент, когда стопа отрывается от земли, рецензент отмечает склейку, и так любой находит тот единственный резкий кадр, который стоит сохранить. Вперёд — легко. Назад большинство плееров спотыкается: нажали клавишу — ждёте, нажали снова — снова ждёте. Это не ошибка какого-то одного плеера. Это следствие того, как сжимается видео, — и это можно обойти.
Почему шаг назад дороже шага вперёд
В современном видеофайле почти ни один кадр не хранится целиком. Время от времени встречается ключевой кадр — полная картинка; каждый кадр после него, до следующего ключевого, хранится только как отличие от соседних кадров. Ключевой кадр и зависящие от него кадры называются группой кадров, и группа может длиться от половины секунды до десяти секунд.
Поэтому декодер может идти от ключевого кадра только вперёд. Чтобы показать следующий кадр, он применяет ещё одно отличие. Чтобы показать предыдущий, ему не к чему применить отличие в обратную сторону — приходится вернуться к ключевому кадру и снова декодировать вперёд, до кадра перед тем, что на экране:
| Чтобы показать | Что должен сделать декодер |
|---|---|
| Следующий кадр | Декодировать один кадр |
| Предыдущий кадр сразу после ключевого | Декодировать несколько кадров от этого ключевого |
| Предыдущий кадр в конце 10-секундной группы при 60 кадрах/с | Заново декодировать группу от её ключевого кадра — до 600 кадров, чтобы показать один |
Вот почему цена шага назад зависит от файла, а не от плеера: по фильму с диска с двухсекундными группами шагать дёшево, а по файлам с длинными группами, которые отдают видеосайты, — дорого. А плеер, который ничего с этим не делает, платит полную цену заново при каждом нажатии.
Сколько стоит шаг назад: замеры
mpv — движок внутри Frame Player, IINA, mpv.net и ещё нескольких плееров — шагает назад именно так: каждое нажатие — точная перемотка на предыдущий кадр, то есть декодирование от ключевого кадра. Мы засекли время на пяти тестовых файлах, с программным декодированием и с аппаратным декодером Mac:
| Один шаг назад | Программное декодирование | Аппаратное декодирование |
|---|---|---|
| 1080p, 24 кадра/с, H.264, группы по 2 секунды | 60 мс | 190 мс |
| 1080p, 60 кадров/с, H.264, группы по 10 секунд | 160 мс | 1,9 с |
| 1080p, 60 кадров/с, VP9, группы по 5 секунд | 260 мс | 1,3 с |
| 1080p, 60 кадров/с, AV1, группы по 10 секунд | 1,0 с | 2,3 с |
| 4K HEVC, группы по 10 секунд | 1,6 с | 1,8 с |
Измерено в mpv 0.41 на Mac с Apple Silicon (M3 Max), на сгенерированных 60-секундных файлах, так что абсолютные числа оптимистичны, а переносятся именно соотношения. Шаг вперёд во всех случаях стоит один период кадра: 17 мс при 60 кадрах/с, 42 мс при 24.
Сюрприз — во втором столбце. Аппаратное декодирование делает шаг назад в 2–10 раз медленнее, хотя для просмотра оно быстрее. Аппаратный декодер устроен так, чтобы ровно выдавать кадры потоком, и отдаёт их с задержкой, которую перемотка на один кадр скрыть не может. Большинство плееров и большинство конфигураций mpv играют с включённым аппаратным декодированием — так что самый медленный случай и есть обычный.
Что с этим делает Frame Player
Две вещи, каждая измерена до выпуска и каждая включается только там, где помогает.
1. Программное декодирование, пока вы шагаете
Первый шаг назад за сеанс переводит декодер с видеокарты на программное декодирование. Само переключение занимает около 10 мс, и уже следующий шаг идёт с программной скоростью. На реальном 4K-релизе в HEVC с двухсекундными группами одно это сократило шаг назад с 230–410 мс до 130–220 мс.
Аппаратное декодирование возвращается, когда вы нажимаете воспроизведение, — и только пока видео ещё на паузе; эту часть дольше всего не удавалось сделать правильно. Декодер, переключённый во время воспроизведения, получает данные, которые уже в пути, — из середины группы, без ключевого кадра, от которого они зависят. Аппаратный декодер AV1 или VP9 на этом падает, и mpv затем молча остаётся на программном декодировании до конца файла. Поэтому кнопка воспроизведения, пробел, щелчок по картинке и мультимедийные клавиши ждут, пока вернётся аппаратное декодирование, и только потом видео трогается.
Это ожидание — реальная цена: 0,4–0,6 с на файле VP9, 0,7–0,8 с на фильме в H.264 и 1,4–1,6 с на файле AV1 против 5–50 мс при обычном возобновлении. Мы измерили и альтернативу — просто играть дальше программно, — и на длинной дистанции она хуже:
| Воспроизведение после шагов | Программно | Аппаратно |
|---|---|---|
| Фильм в H.264 | 25 % ядра | 10 % |
| 1080p, 60 кадров/с, VP9 | 33–42 % | 8–12 % |
| 1080p, 60 кадров/с, AV1 | 46 % | 9–11 % |
| 1440p, 60 кадров/с, VP9 | 45 % | 11 % |
Тот же компьютер; пропущенных кадров не было ни в одном случае. Потребляемая мощность, которую сообщает система, следует тем же соотношениям.
В три-четыре раза больше энергии до конца фильма, чтобы один раз сэкономить секунду, — на ноутбуке такой обмен того не стоит.
2. Обратное декодирование — один раз — на файлах, где шаг всё ещё медленный
Программное декодирование спасает фильм с короткими группами, но не файл, где группы длиной в десять секунд и даже программно на нажатие уходит секунда. Для таких файлов Frame Player переключает mpv на обратное декодирование: mpv декодирует всю группу один раз, сохраняет кадры и выдаёт их в обратном порядке. Первое нажатие оплачивает группу; каждое следующее стоит один период кадра, как шаг вперёд.
Включение и выключение этого режима тоже имеет свою цену, поэтому плеер осторожен с тем, когда это делать:
- Только на файле, который уже показал себя медленным. Любой шаг назад дольше 100 мс помечает файл, и никакой последующий быстрый шаг эту метку не снимает — шаг сразу после ключевого кадра всегда быстрый и ничего не говорит о следующем.
- Только со второго шага назад подряд. Одиночный шаг назад или шаги, чередующиеся с шагами вперёд, остаются обычными: разворот стоит дороже одного обычного шага, и если платить за него при каждой смене направления, покачивание туда-обратно стало бы медленнее, а не быстрее.
- Только в пределах бюджета памяти. Хранить декодированную группу дорого: десятисекундная группа 8-битного 4K при 24 кадрах/с — это 3 ГБ, и потребление памяти mpv мы измерили — оно ровно такое, как предсказывает арифметика. Перед разворотом плеер измеряет, насколько длинные группы вокруг вашей позиции (он читает только заголовки пакетов, на это уходят миллисекунды), и сколько памяти у компьютера, и включает режим, только если самая длинная группа помещается в четверть памяти, но не больше 4 ГБ. Иначе он продолжает шагать обычным способом.
- С выключенным звуком. Иначе mpv декодировал бы в обратную сторону и звук. На 4K-релизе со звуком 5.1 это утраивало ожидание перед стартом (2,0 с против 0,7 с) и заставляло один шаг из сорока перескакивать пять кадров. Дорожка возвращается, когда вы нажимаете воспроизведение, — и только после того, как декодер снова развернулся вперёд, потому что дорожка, включённая во время обратного декодирования, попадает на следующий ключевой кадр, а не на текущий кадр.
Результат на 4K-релизе в HEVC со звуком 5.1: 0,69 с на старт, затем 37–48 мс на шаг — примерно как шаг вперёд — и один шаг в 340 мс там, где путь переходит в предыдущую группу. Воспроизведение продолжается с того кадра, на котором вы остановились, со звуком и аппаратным декодированием.
И всё остальное должно об этом знать
Плеер, который декодирует в обратную сторону, должен следить, чтобы в таком состоянии ничего не осталось. Перемотка со шкалы или клавишами сначала разворачивает mpv вперёд и возвращает декодер, потому что mpv позволяет ожидающей перемотке заменить другую и иначе потерялась бы как раз перемотка зрителя; всё прочее, что сдвигает картинку, — переход по главе, комната совместного просмотра — замечается в момент, когда оно сработало, и mpv сразу разворачивается вперёд. А все эти настройки задаются только для текущего файла, так что mpv сам сбрасывает их, когда открывается следующий: следующая серия никогда не начнёт играть задом наперёд со своего последнего кадра.
Торренты
Обратное декодирование работает только на файле, который лежит на диске этого компьютера, поэтому оно распространяется на локальные файлы и торренты — в том числе ещё не докачанные, где нужна дополнительная осторожность. Часть торрента, которая ещё не пришла, при чтении не выдаёт ошибку — она читается как нули. Поэтому на торренте, который ещё качается, плеер перед каждым шагом назад сверяется с картой того, что уже пришло, и использует обратное декодирование, только если она покрывает декодируемые группы. То, что вы только что смотрели, всегда уже пришло; дыры бывают в отрезке перед местом, куда вы прыгнули вперёд, в ещё не скачанное. Там плеер шагает обычным способом, а если шагу приходится ждать данных от источников, он так и говорит, а не делает вид, что завис. По онлайн-потокам плеер всегда шагает обычным способом.
Как пользоваться
- Запятая — шаг на кадр назад, точка — на кадр вперёд, на обеих системах; держите любую, чтобы продолжать. Обе можно переназначить в редакторе клавиш.
- S сохраняет кадр на экране, Shift+S — вместе с субтитрами, а Ctrl+C (⌘C на Mac) копирует его в буфер обмена. Кадр сохраняется так, как его декодировал плеер, включая тонмаппинг HDR.
- Обратное декодирование можно выключить в Параметры › Видео › Быстрый шаг назад по кадрам; у программного декодирования во время шагов выключателя нет, потому что оно не меняет ничего, кроме скорости.
- Во время трансляции на телевизор на компьютере нет ничего, по чему можно шагать, поэтому плеер сообщает, что покадровый шаг недоступен, пока трансляция не закончится.
Числа на этой странице измерены на Mac. На Windows плеер делает то же самое — программное декодирование во время шагов, обратное декодирование в том же бюджете памяти — только с собственным декодером видеокарты вместо декодера Apple, и там мы время не засекали.
Вопросы
Какие клавиши шагают на один кадр?
Запятая — на кадр назад, точка — на кадр вперёд, одинаково на Windows и macOS. Обе можно держать, чтобы шагать дальше, и обе можно перенести на другие клавиши в редакторе клавиш. Шаг ставит видео на паузу, если оно играло.
Почему первый шаг назад медленнее следующих?
Первый шаг назад — обычный: он декодируется от предыдущего ключевого кадра, и плеер засекает время. Если шаг оказался медленным и вы шагаете назад снова, плеер один раз декодирует весь отрезок назад до ключевого кадра и сохраняет его, так что каждое следующее нажатие стоит примерно одного кадра работы. Это разовое декодирование и есть заметное ожидание: 0,7 с на 4K-фильме, который мы измеряли, и дольше на файлах, где ключевые кадры расположены реже.
Почему после покадрового шага воспроизведение начинается не сразу?
Пока вы шагаете, видео декодируется программно, потому что для шага назад это в несколько раз быстрее. При нажатии на воспроизведение декодирование сначала возвращается видеокарте, и на файлах с большими промежутками между ключевыми кадрами это занимает до полутора секунд. Если же остаться на программном декодировании, до конца фильма это стоило бы в три-четыре раза больше энергии.
Сколько памяти занимает быстрый шаг?
Столько, сколько занимает в декодированном виде отрезок видео назад до ключевого кадра, но никогда не больше четверти памяти компьютера или 4 ГБ — смотря что меньше. Если ключевые кадры в файле расположены слишком далеко друг от друга и отрезок не помещается, плеер шагает назад обычным способом. Быстрый способ можно выключить в «Параметры › Видео › Быстрый шаг назад по кадрам».
Почему пропадают субтитры, когда я шагаю назад?
Субтитры, хранящиеся внутри видеофайла, не читаются, пока плеер декодирует в обратную сторону, поэтому на этих шагах их нет. Они возвращаются, как только вы шагнёте вперёд или нажмёте воспроизведение.
Можно ли шагать по кадрам во время трансляции на ТВ?
Нет. Во время трансляции видео декодирует телевизор, и на компьютере нет кадра, по которому можно шагать, поэтому плеер сообщает, что покадровый шаг недоступен, пока трансляция не закончится.