загрузка видеофайлов в буфер в C++

В настоящее время я пытаюсь создать программу, которая берет видеофайл, обычно AVI, и пытается преобразовать его в изображения. До сих пор у меня процесс работал отлично, и при необходимости его можно было оставить в покое. Тем не менее, я хотел бы посмотреть, можно ли оптимизировать его для скорости. Итак, мой вопрос заключается в том, можно ли загружать часть видеофайла в память по частям вместо потоковой передачи. Может быть, загрузить 2–3-минутный клип в буфер, обработать его и повторно использовать для следующих 2–3 минут видео. Я изучил Direct Show и OpenCV для загрузки и воспроизведения видеофайлов, но до сих пор не смог найти ничего относительно загрузки видео в буфер. Любые ссылки на учебники или концепции приветствуются.

Это будет разработано на машине с Windows XP/7, если это поможет.


person Seb    schedule 04.05.2011    source источник


Ответы (2)


Что вы можете сделать, так это загрузить несколько кадров, назовем это фрагментом из N кадров, в очередь с диска. Как только вы установите ограничение для буфера, вы затем извлекаете кадры и обрабатываете их. Вы можете сделать это параллельно, используя две очереди (Q1 и Q2) и два потока (T1 и T2). При обработке кадров из Q1 с помощью T2 вы можете загрузить Q2 с помощью T1. Вы будете выполнять контекстное переключение одной очереди, когда она заполнена, вытаскивать кадры и обрабатывать их, в то время как другая очередь загружается кадрами с диска. Конечно, вам нужно будет справиться со сложностями потоковой/параллельной обработки, связанными с таким подходом, и в этом случае может оказаться полезным многопоточность BOOST.

person Community    schedule 04.05.2011
comment
Я это понимаю, но вопрос, который я задаю, заключается в том, как загрузить кадры в буфер. - person Seb; 04.05.2011
comment
@Seb, под буфером, если вы имеете в виду память в целом, я могу сказать, что вы создаете очередь типа IPLImage. Как только это будет доступно, вы просто поместите кадры туда. Я думаю о буфере таким образом. - person ; 04.05.2011
comment
@Wajih, похоже, это сработает. В этом случае смогу ли я дважды открыть видеофайл и поставить в очередь каждого потока часть необходимых изображений? Например, поток 1 проходит с 0:00 до 1:59 видеофайла, а поток 2 — с 2:00 до 3:59, или это будет узким местом? - person Seb; 04.05.2011
comment
@Seb Ну, вероятно, вам нужно будет открыть видеофайл дважды, но я сомневаюсь, что OpenCV позволит такое (не знаю о directShow). Здесь следует отметить, что запуск Q1 будет занимать первый набор кадров, в то время как Q2 будет простаивать, когда Q1 обрабатывается (кадры вытягиваются), теперь у Q2 есть шанс быть заполненным, а затем переключиться обратно в Q1, пока Q2 обрабатывается. Я не думаю, что здесь будет существенное узкое место. Просто запуск может быть медленным, как только Q заполнены, он должен быть довольно быстрым. - person ; 04.05.2011
comment
@Wajih, спасибо за помощь. Я начну работать над методом, который вы упомянули, и посмотрю, получу ли я увеличение средней производительности. - person Seb; 04.05.2011
comment
@Себ, я бы хотел услышать от тебя ответ, если это сработает, удачи! - person ; 04.05.2011

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

Надеюсь, вам не придется записывать эти образы обратно на диск.

person karlphillip    schedule 04.05.2011
comment
В какой-то момент изображения должны быть записаны на диск. В этом случае я думаю обработать часть видеофайла до тех пор, пока не будет достигнуто максимальное количество буферов. Затем обработайте эти буферы для создания изображений. Исходя из них, я бы либо повторил процесс, если бы обнаружил, что потребление памяти прилично, либо начал бы загружать изображения на диск перед повторением процесса. - person Seb; 04.05.2011
comment
Заставьте один поток читать файл и преобразовывать кадры в изображения, а другой поток просто извлекает эти изображения и записывает их на диск. Иногда объем работы, связанный с разработкой этих систем, не оправдывает кратковременного повышения производительности, которое они обеспечивают. - person karlphillip; 04.05.2011