Обратное декодирование кадров MPEG с использованием FFmpeg

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

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

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

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

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

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

Спасибо


person Gediminas    schedule 22.02.2012    source источник
comment
Теперь я сохраняю все декодированные блочные кадры в формате JPEG, что значительно экономит память, но все же... в конце концов, мой выходной формат должен быть RGB (при воспроизведении), поэтому теперь мне дополнительно нужно выполнить преобразование JPEG в RGB. .. Еще... ощущение, что это не правильный выбор (хранение всех образов в памяти)   -  person Gediminas    schedule 22.02.2012


Ответы (2)


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

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

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

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

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

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

person Dipan Mehta    schedule 23.03.2012

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

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

ffmpeg -i input_video output%4d.jpg

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

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

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

person Dmitry Shkuropatsky    schedule 22.02.2012