Генерация P-кадра на основе I-кадра

#ffmpeg #image-compression #openh264

#ffmpeg #сжатие изображения #openh264

Вопрос:

Допустим, у меня есть 5 изображений, которые очень похожи. Я хотел бы сжать изображения 2, 3, 4 и 5 на основе первого изображения, что несколько похоже на то, как P-кадры генерируются из I-кадра.

  • В общем, каков наилучший способ / инструмент для этого?
  • Например, с помощью FFMPEG возможно ли генерировать P-фреймы и сохранять их в отдельном файле?

Редактировать: хотя и похоже, я не ищу простого создания разницы между двумя изображениями. Моя цель — каким-то образом использовать информацию в первом изображении, чтобы сделать последовательные изображения намного меньше. Если я просто выполняю diff, сам diff имеет примерно тот же размер (примерно на 10% меньше), что не так много, как я ожидаю. Если я создам видео mp4, включающее эти 5 кадров, размер видео будет намного меньше, чем при размещении 5 кадров в файле, что, вероятно, связано с предикациями кадров на основе I-кадров. Есть ли способ генерировать эти предсказанные кадры один за другим и сохранять их по отдельности?

Комментарии:

1. Вы можете использовать фильтр наложения в ffmpeg в режиме различий и сохранить результат. Это не будет строго P-кадрами, но вы можете сгенерировать оригинал, выполнив смешивание в режиме сложения.

2. Я проверил фильтр наложения. Похоже, он используется для наложения кадров, а не для последовательных кадров. Не могли бы вы привести пример?

3. Наложение кадров является одной из утилит фильтра наложения. Вычисление различий в пикселях — это другое. Здесь уже поздно, так что завтра я приведу пример.

4. Я подожду до завтра. Я ценю это 🙂

Ответ №1:

Вот основной синтаксис:

Допустим I.png , это ваш базовый кадр и P1.png кадр, который вы хотите уменьшить до его отличия от I.png

Затем

 ffmpeg -i P1.png -i I.png -lavfi blend=all_expr='A-B' D1.png
  

создает разностный кадр D1.png .

Чтобы восстановить P1 из I и D1, выполните

 ffmpeg -i D1.png -i I.png -lavfi blend=all_expr='A B' P1-r.png
  

PI-r.png будет идентично P1.png .

Комментарии:

1. Спасибо за код, но, похоже, это простое различие изображений, которое я также мог бы достичь с помощью ImageMagick. Я отредактирую вопрос, чтобы объяснить, что я ищу.

2. ДА. Вы также хотели прогноз intra inter?

3. Вероятно, да, если предсказания intra inter приводят к тому, что видеофайлы становятся намного меньше, чем просто объединение нескольких кадров. Есть ли способ добиться этого с помощью ffmpeg? Я отредактировал вопрос, чтобы лучше объяснить это. Спасибо.

4. Я сохраню первый кадр, который в основном является I-кадром. Затем каждый раз, когда я получаю данные P-кадра, я хотел бы вычислить фактический кадр, используя P-кадр и I-кадр, с которым он был закодирован. Моя проблема в том, что у меня нет всех кадров при их кодировании. Я получал их один за другим с регулярным интервалом времени, и я не хочу ждать, чтобы получить их все, чтобы закодировать весь фильм и передать их дальше. Скорее, я хочу закодировать отдельный кадр и немедленно передать его.

5. Итак, вы будете писать код для декодирования, используя API ffmpeg?