2012-02-22 3 views
4

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

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

  1. Это невозможно просто взять последний кадр в моем блоке и выполнять декодирование, потому что это «P» кадр и нуждается в «Интере кадр (I)», чтобы быть правильно декодируется.

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

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

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

Благодаря

+0

Я сейчас храню все декодированные «блок-рамки» в формате JPEG, что значительно экономит память, но все же ... в конце концов, мой выходной формат должен быть RGB (при выполнении воспроизведения), поэтому теперь мне дополнительно нужно выполнить JPEG to RGB ... По-прежнему ... ощущение, что это неправильный выбор (сохранение всех изображений в памяти) – Gediminas

ответ

1

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

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

ffmpeg -i input_video output%4d.jpg 

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

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

Вы можете рассмотреть предварительно -processing, если это опция.

3

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

  1. Compressed-Domain Reverse Play of MPEG Video Streams, SPIE International Symposium on Voice, Video, and Data Communications, Boston, MA, November, 1998.

  2. Reverse-play algorithm for MPEG video streaming

  3. MANIPULATING TEMPORAL DEPENDENCIES IN COMPRESSED VIDEO DATA WITH APPLICATIONS TO COMPRESSED-DOMAIN PROCESSING OF MPEG VIDEO.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^