Можно ли обрезать поток h.264 в любом месте без перекодирования?

Можно ли обрезать поток h.264 в любом месте без перекодирования?

Примечание: изначально я ошибочно назвал поток h.264 более распространенным термином — файл MP4, извините.


Я знаю, что обычно необходимо начинать разделение h.264 по ключевому кадру, чтобы итоговое видео начиналось с ключевого кадра, но мне интересно, что именно в структуре/спецификации потока делает это возможным?

Должен ли ключевой кадр появляться каждые X кадров как фиксированный параметр всего файла или может быть переменный интервал между ключевыми кадрами? Если проигрыватель просто берет кадры по мере их появления и рисует все целиком (ключевой кадр) или обновляет его часть (не ключевой кадр), почему важен интервал ключевого кадра?

Если интервал не имеет значения, а мы хотим сделать разрез на кадре 87 потока с ключевыми кадрами каждые 100, разве мы не можем использовать 86 кадров преамбулы для расчета нового ключевого кадра для нового файла, поместить оставшиеся 12 неключевых кадров из исходного файла, чтобы перейти к следующему ключевому кадру, затем к следующему исходному ключевому кадру (кадру 100) и двигаться оттуда?

т.е. файл заканчивается следующим образом: «новый ключ, 12 оригинальных не ключей, оригинальный ключ, 99 оригинальных не ключей, оригинальный ключ ..»

решение1

Ключевые кадры могут возникнуть в любое время, я не могу найти ссылку, но представьте себе фильм со множеством катсцен. Вы хотите, чтобы ключевой кадр был первым кадром после любого резкого изменения сцены, чтобы сохранить качество видео, в противном случае вы получите бурю шума, поскольку видеокомпрессор пытается создать новую сцену, используя множество изменений «дельта» из предыдущей сцены.

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

ОтКлючевые кадры, межкадровое сжатие и сжатие видео

Ключевой кадр (i-кадр) — это полный кадр изображения в видео. Последующие кадры, дельта-кадры, содержат только измененную информацию. Ключевые кадры будут появляться несколько раз в потоке,в зависимости от того, как он был создан или как транслируется.

В самом деленастраивается и зависит от ваших требований к качеству и битрейту.

Theпо умолчанию для mp4 это ключевой кадр каждые 250 кадров(примерно каждые 10 секунд). Это плохо для потоковой передачи, потому что сложнее менять разрешение.Youtube использует интервал между ключевыми кадрами в 2 секунды..

Также есть несколько методов извлечения только iframes (ключевых кадров), как упоминалосьBogoToBogo: МИКРОГРАФИИ (IFRAME / СМЕНА СЦЕНЫ) - 2020

миниатюры i-frame

Следующая команда создаст одно миниатюрное изображение для каждого I-кадра с именами yi01.png, yi02.jpg, yi03.png...yi116.

ffmpeg -i yosemiteA.mp4 -f image2 -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr yi%03d.png
  1. select='eq(pict_type,PICT_TYPE_I)': извлекает изображение I-кадра
  2. vsync: метод синхронизации видео.
  3. vfr: переменная частота кадров.

Связанный контент