зареждане на видео файлове в буфер в 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
@Seb, ще се радвам да получиш отговор от теб, ако работи, успех! - person ; 04.05.2011

Тесното място на приложение като това е четенето на файла от диска и конвертирането на всеки кадър в изображение. Не можете да избягате от тези задачи. Освен ако не го правите по грешен начин, няма какво да направите, за да ускорите значително изпълнението на приложението.

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

person karlphillip    schedule 04.05.2011
comment
Изображенията ще трябва да бъдат записани на диска в даден момент. В такъв случай мисля да обработя част от видеофайла, докато се достигне максималното количество буфери. След това обработете тези буфери, за да генерирате изображенията. От тях или бих повторил процеса, ако установя, че потреблението на памет е прилично, или бих започнал да натискам изображенията на диска, преди да повторя процеса. - person Seb; 04.05.2011
comment
Накарайте една нишка да прочете файла и да преобразува кадрите в изображения, докато друга нишка просто извлича тези изображения и ги записва на диска. Понякога количеството работа, свързано с разработването на тези системи, не оправдава краткото увеличение на производителността, което те ще осигурят. - person karlphillip; 04.05.2011