2012-05-30 2 views
1

Я использую DirectShow в своем приложении для захвата видео с веб-камер. У меня есть проблемы при использовании камер для предварительного просмотра и захвата видео 1080P. Например: камера HD Pro Webcam C910 Logitech. Предварительный просмотр видео 1080P был очень рывким, и четкости HD не наблюдалось. Я мог видеть, что имя перечислимого устройства было «USB Video Device»Предварительный просмотр для видео 1080P с использованием DirectShow

Сегодня мы установили программное обеспечение веб-камеры Logitech на этих компьютерах XP. В этом приложении мы могли видеть видео 1080P без каких-либо подергиваний. Также мы записали видео 1080P в приложении Logitech и увидели их в высоком качестве.

Но когда я проверить мое приложение,

  1. Я могу видеть, что имя перечисляемого устройство было изменено на «Logitech Pro Webcam C910» вместо «USB Video Device», как и в предыдущем случае.

  2. ЦП съеден мое приложение на 20%, но процесс «СИСТЕМА» съедает 60% + и общий процессор вращается около 100%

    1. Несмотря на то, что качество видео было значительно улучшены, рывки все еще существуют, возможно, из-за 100% -ного процессора.

    2. Когда я закрыл свое приложение, высокий процессор utlizaton с помощью процесса «Система» уходит.

Что касается моего заявления - Он использует ICaptureGraphBuilder2 :: RenderStream создать Preview и Capture потоков.

В Capture Stream я подключаю фильтр камеры к визуализатору NULL с захватом образца в качестве промежуточного фильтра.

В предпросмотра потоке, у меня есть

g_pBuild->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,cam,NULL,NULL); 

изображение отображается на окна, как указано с помощью интерфейса IVideoWindow. Я использую следующий

g_vidWin->put_Owner((OAHWND)(HWND)hWnd); 
g_vidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS); 
g_vidWin->put_MessageDrain((OAHWND)hWnd); 

Я попытался установить частоту кадров для различных значений (AvgTimePerFrame = 500000 (20 кадров в секунду) и 666667 (15 кадров в секунду) и т.д.

Но все испытания, все еще дают тот же результат. Ясность стала больше, но некоторые рывки все еще остаются, а процессор почти 100% из-за 60% -ной утилизации «Системой». Когда я закрываю свое видео приложение, использование «Системой» возвращается к 1-2%.

Любая помощь по этому поводу очень приветствуется.

Заранее спасибо,

+0

Возможно, дополнительная информация поможет. Каково ваше потребление процессора системой SYSTEM при запуске приложения Logitech? Возможно, это всего лишь драйвер устройства, использующий ваши циклы. Я не уверен, что изменение AvgTimePerFrame повлияет на фактическую частоту кадров камеры. Где вы это устанавливаете? У меня нет C910, но у меня есть пара других камер Logitech, и их частота кадров, похоже, зависит от разрешения и настроек экспозиции. –

+0

Когда приложение Logitech запускается, SYSTEM не использует CPU более 2% У меня создалось впечатление, что изменение AvgTimePerFrame изменит частоту кадров. Не могли бы вы рассказать мне точную процедуру с точки зрения настроек/методов интерфейса DirectShow, с помощью которых можно установить частоту кадров? –

+0

С помощью моих Logitechs единственный способ повлиять на частоту кадров - изменить настройки разрешения и экспозиции. Камера принимает собственное решение о том, какой курс он будет использовать. Я не уверен, но я думаю, что средняя скорость в структуре VIDEOINFO - это то, что ваш исходный фильтр устанавливает, чтобы советовать другим фильтрам о скорости, которую они должны ожидать. Он не изменяет собственную скорость исходного фильтра; это помогает другим фильтрам знать, чего ожидать. Ваша камера собирается откачивать образцы по любой желаемой цене. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/dd407325(v=vs.85).aspx –

ответ

0

Используйте IAMStreamConfig.SetFormat(), чтобы выбрать частоту кадров, размеры, цветовое пространство и сжатие выходных потоков (захват и предварительный просмотр) с устройства захвата.

Помимо этого: комментарий выше «Он не меняет собственный фильтр исходного кода» совершенно неправ. Вся цель этого интерфейса заключается в определении формата вывода и частоты кадров захваченного видео.

Используйте IAMStreamConfig.GetStreamCaps(), чтобы определить, какие частоты кадров, размеры, цветовые пространства и форматы сжатия доступны. Большинство камер предоставляют несколько разных форматов.

Похоже, что основной проблемой, с которой вы сталкиваетесь, является то, что пропускная способность USB (по крайней мере до USB3) не может поддерживать 30fps 1080P без сжатия. Я больше всего знаком с семейством USB-камер Microsoft LifeCam Studio, и эти устройства выполняют аппаратное сжатие для отправки видео по кабелю, а затем съедают значительную часть вашего процессора на принимающей стороне, преобразуя сжатое видео из Motion JPEG в формате YUV. Предположительно, камеры Logitech работают аналогичным образом.

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

Модель синхронизации DirectShow для захвата продолжает работать, даже если камера не может создавать кадры по требуемой скорости, пока камера указывает, что кадры отсутствуют. Он делает это, используя поле отсчета «сброшенного кадра», которое перемещается вместе с каждым захваченным кадром. Сумма сброшенных кадров плюс «реальные» кадры должна равна требуемой частоте кадров, установленной через IAMStreamConfig.SetFormat().

Использование LifeCam Studio на I7 Я захватил с частотой 30 кадров в секунду 720p с предварительным просмотром, сжатым до H.264 и записал файл .mp4 на диск, используя около 30% процессора, но только если все автофокусировка/настройки цвета/экспозиции на камере отключены.

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