2010-04-15 2 views
0

Я обрабатываю некоторые очень большие видеофайлы (часто до 16MP), и мне нужен способ хранения этих видео в формате, который позволяет искать определенные кадры (скорее чем во времена, например ffmpeg). Я планировал только катить собственный формат, который объединяет все сжатые вместе сжатые кадры zlib вместе, а затем добавляет индекс в конец, который связывает номера кадров с файловыми байтовыми индексами. Прежде чем перейти к этому, я просто хотел проверить, чтобы убедиться, что я не дублирую функциональность другого формата/библиотеки. Кто-нибудь слышал о формате/библиотеке, который позволяет без потерь сжатия и произвольного доступа к видео?Библиотека C/C++ для формата видео для поиска

+0

Возможно, я ошибаюсь, но вы не можете рассчитать желаемое время для перехода на число кадров в секунду и кадр, на который хотите перейти? – Ioan

+0

Я делаю это для науки, поэтому я не могу позволить себе потерять любую информацию об изображении через кошелек с потерями, и я не могу рисковать прыгать к неправильному фрейму (даже +1 или -1 кадр из целевого кадра). - Как насколько я видел, большинство видео-библиотек, таких как ffmpeg, будут прилагать максимум усилий, чтобы доставить вас к вашему желаемому фрейму и не нуждаться в твердой точности, в которой я нуждаюсь. – rcv

+1

Это * очень * нестандартный способ хранения видео. Все существующие форматы используют межкадровое сжатие, чтобы поддерживать требования к скорости передачи данных. Вы не найдете ничего, что поможет вам. –

ответ

0

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

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

Если пространство не имеет большого значения, я бы предложил сделать это, как вы говорите, но используйте сжатие JPEG вместо zlib, так как оно даст вам намного более высокую степень сжатия, поскольку оно использует тот факт, что вы имеете дело с данными изображения.

Если пространство является проблемой, P-кадры (в зависимости от предыдущего кадра/кадров) могут значительно уменьшить размер файла. Я бы не возился с кадрами B (зависит от предыдущего и будущего кадров/кадров), поскольку они значительно усложняют работу.

Я решил проблему поиска определенного фрейма в присутствии кадров B и P в прошлом, используя ffmpeg (libavformat), чтобы demux видео в пакеты (1 кадр данных данных на пакет) и объединить их в один файл. Важно сохранить и индексировать этот файл, чтобы вы могли найти границы пакетов для данного фрейма. Если кадр является I-кадром, вы можете просто передать данные этого кадра в ffmpeg-декодер и его можно декодировать. Если кадр представляет собой кадр B или P, вы должны вернуться к последнему I-кадру и декодировать вперед. Это может быть довольно сложно получить, особенно для B-кадров, поскольку они часто отправляются в другом порядке, чем то, как они отображаются.

0

В некоторых форматах вы можете изменить количество ключевых кадров в секунду.

Например, я использовал ffmpeg для кодирования в flv со скоростью 25 кадров в секунду с 25 ключевыми кадрами в секунду, а затем использовал плеер, который был в порядке при переходе к ключевым кадрам. В основном это позволяло мне делать кадр за кадром.

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

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

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