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

#c #windows #opencv #directx #directshow

#c #Windows #opencv #directx #directshow

Вопрос:

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

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

Ответ №1:

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

Комментарии:

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

2. @Seb, под буфером, если вы обычно имеете в виду память, я могу сказать, что вы создаете очередь типа IplImage. Как только это станет доступно, вы просто помещаете туда кадры. Я думаю о буфере именно таким образом.

3. @Wajih, похоже, это сработало бы. Смогу ли я в таком случае дважды открыть видеофайл и поставить в очередь каждого потока часть необходимых изображений? Например, поток 1 переходит с 0:00 на 1: 59 видеофайла, а поток 2 переходит с 2: 00 на 3: 59 или это было бы бутылочное горлышко?

4. @Seb Ну, вероятно, вам нужно было бы дважды открыть видеофайл, но я сомневаюсь, что OpenCV разрешит такую вещь (не знаю о DirectShow). Здесь следует отметить, что запуск Q1 занял бы первый набор кадров, в то время как Q2 простаивает, как только Q1 обрабатывается (извлекаются кадры), теперь у Q2 есть шанс быть заполненным, затем переключитесь обратно на Q1, пока обрабатывается Q2. Я не думаю, что здесь было бы значительное бутылочное горлышко. Просто запуск может быть медленным, как только Q заполнятся, он должен быть довольно быстрым.

5. @Wajih, спасибо за помощь. Я начну работать над методом, который вы упомянули, и посмотрю, получу ли я увеличение средней производительности.

Ответ №2:

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

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

Комментарии:

1. Изображения должны были бы быть записаны на диск в какой-то момент. В этом случае я думаю обрабатывать часть видеофайла до тех пор, пока не будет достигнуто максимальное количество буферов. Затем обработайте эти буферы для создания изображений. Из их я бы либо повторил процесс, если бы обнаружил, что потребление памяти приличное, либо начал бы загружать изображения на диск, прежде чем повторять процесс.

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