MPEG обратное декодирование кадров с использованием FFmpeg - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть так называемые "блоки", в которых хранятся некоторые кадры MPEG4 (I, p, p, p, p ...).Для каждого "блока" кадр начинается с кадра "I" и заканчивается до следующего кадра "I".(VOL - «visual_object_sequence_start_code» всегда включен перед кадром «I»)

Мне нужно иметь возможность воспроизводить эти «блочные» кадры в режиме «назад».Толстым является то, что:

  1. Невозможно просто взять последний кадр в моем блоке и выполнить декодирование, потому что это "P" кадр и ему нужен "inter frame (I)"быть правильно декодированным.

  2. Я не могу просто взять мой первый кадр" I ", затем передать его функции" avcodec_decode_video "ffmpeg и только потом передать мой последний" P "кадр к ffmpeg, потому что последний кадр "P" зависит от кадра "P" перед ним, верно?(ну ... насколько я тестировал этот метод, у моего последнего декодированного P-кадра были артефакты)

Теперь я выполняю обратную игру - сначала декодирую все мои«блокировать» кадры в RGB и сохранять их в памяти.(в большинстве случаев это будет ~ 25 кадров на блок максимум.) Но этот метод действительно требует много памяти ... (особенно, если разрешение кадров высокое) И у меня есть ощущение, что это неправильный способ сделать это...

Итак, я хотел бы спросить, есть ли у кого-нибудь предложения о том, как можно выполнить это "обратное" декодирование / воспроизведение кадра с помощью FFmpeg?

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Что вы видите на самом деле исследовательская проблема: чтобы увидеть общий подход, посмотрите на следующую статью:

  1. Обратное воспроизведение сжатых доменов видеопотоков MPEG, Международный симпозиум SPIE по передаче голоса, видео и данных, Бостон, Массачусетс, ноябрь 1998 г.

  2. Алгоритм обратного воспроизведения для потокового видео MPEG

  3. УПРАВЛЕНИЕ ВРЕМЕННЫМИ ЗАВИСИМОСТИ В СЖАТЫХ ВИДЕО ДАННЫХ С ПРИМЕНЕНИЕМ К ОБРАБОТКЕ СЖАТЫХ ДОМЕНОВ ВИДЕО MPEG.

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

Однако, это очень сложно, и я видел редкие программы, делающие это практически.

1 голос
/ 22 февраля 2012

Я не думаю, что есть способ обойтись, начиная с I-кадра и декодируя все P-кадры, поскольку P-кадр зависит от предыдущего кадра.Для обработки декодированных кадров они могут быть сохранены в файл или, при ограниченном объеме памяти и дополнительной мощности ЦП, старые P-кадры могут быть отброшены и позже пересчитаны.

На командном уровне вы можете преобразовать входное видео в серию изображений:

ffmpeg -i input_video output%4d.jpg

, затем каким-то образом изменить их порядок и преобразовать обратно в видео:

ffmpeg -r FRAME_RATE -i reverse_output%4d.jpg output_video

Вы можете рассмотреть возможность предварительной обработки, если это вариант.

...