Что Instagram называет 9:16
Девять шестнадцатых это 0,5625. Ровно, без остатка. Кадр 1080×1920 даёт ровно 0,5625, и это и есть то самое полноэкранное 9:16. Кадр 1079×1919 даёт 0,56227. На глаз разницы нет никакой: на телефоне эти два видео неотличимы, и ни один человек, которому вы покажете оба, не угадает, какое из них какое.
Но проверка на стороне рекламы это не «похоже на вертикальное», а сравнение чисел. У неё нет допуска, в который помещается ваш один пиксель. Поэтому ролик, который прекрасно опубликовался, прекрасно смотрится и прекрасно собирает просмотры, на кнопке продвижения получает отказ, и в отказе не сказано, какое соотношение у него нашли.
Откуда у вертикального видео берётся 1079×1919
Если видео собиралось в браузерном редакторе, скорее всего, оно записано с холста: страница рисует кадр на canvas, а запись снимает этот canvas как есть. И вот тут появляется пиксель, которого никто не заказывал.
Размер холста на экране это размер монтажной области, умноженный на масштаб просмотра. Перед записью масштаб выставляют в единицу, чтобы писать в полном разрешении: обычно это делается как «текущий масштаб, умноженный на обратный ему». В арифметике это единица, а в двоичной плавающей точке произведение числа на обратное ему не всегда ровно единица. Иногда это 0,9999999999999998. Холст получает ширину 1079,9999999999998, а canvas.width целочисленный: дробная часть отбрасывается, и в файл уходит 1079.
У нечётного числа есть и второе последствие. H.264 с цветовой субдискретизацией 4:2:0 требует чётных сторон, поэтому 1079 придётся куда-то деть: кодировщик либо откажется, либо молча подвинет край. Ни один из двух исходов вам не нужен, и оба случаются уже после того, как файл выглядел готовым.
Как проверить свой файл
Проверка занимает десять секунд и отвечает на вопрос, который в интерфейсе Instagram не задать: какое соотношение у файла на самом деле.
Как починить соотношение сторон
Если файл не 9:16, его придётся пересобрать, и выбор здесь ровно один: что вы готовы потерять. Вписать значит сохранить всю картинку и добавить поля, кадр станет меньше. Заполнить значит занять весь кадр и срезать края, ничего не уменьшая.
Параметр force_original_aspect_ratio в фильтре scale и делает всю работу: decrease гарантирует, что картинка поместится целиком и останется место под поля, increase гарантирует, что обе стороны дотянутся до целевых, и обрезка не прочитает пустоту за краем кадра. Сами требования к публикации Reels описаны в документации Instagram Platform; правило про продвижение живёт не там, а в самом приложении, и видно его только в момент отказа.
Почему лишнее перекодирование само ломает 9:16
Обратная сторона: файл, который уже ровно 1080×1920, не нужно трогать вообще. Конвейеры, прогоняющие всё подряд «на всякий случай», часто отдают разрешение на своё усмотрение, если выходной размер не задан явно. Так корректное 9:16 превращается в почти-9:16 уже после того, как его сделали правильно, и причину потом ищут в редакторе.
Правило простое: нормализовать только то, что действительно не подходит. Если видео уже H.264 и уже точного размера, самое полезное, что может сделать сервис, это отдать файл как есть. Та же мысль, что и в нашей статье про лицо и голос в видео: каждая лишняя обработка что-то меняет, и не всегда то, что вы собирались менять.
Последний шаг здесь первый, на котором правило вообще озвучено. Поэтому проверять размер стоит на первом, а не на четвёртом: это десять секунд против перезаливки ролика, который уже успел собрать охват. Про другие места, где Instagram отвечает отказом без объяснения, у нас есть отдельный разбор.
Короткий чеклист
Как это сделано у нас
Эта статья выросла из нашего собственного бага: редактор отдавал 1079×1919 и клялся, что это 9:16. Теперь размер записи берётся только от монтажной области и не зависит ни от масштаба, ни от размера окна.
5 минКак сделать AI-инфлюенсера: что за этим стоит на самом деле
5 минСколько стоит один вызов модели: 204 реальных вызова из прода
11 минКак создать ИИ-модель для Instagram и TikTok: замена лица в видео, клон голоса, ролик по шагам