Захват видео данных на экран и в файл - PullRequest
0 голосов
/ 08 сентября 2018

Я пишу простое, насколько это возможно, демонстрационное приложение, которое считывает входящие данные из веб-камеры и отображает их на экране и (необязательно при нажатии кнопки) записывает видеопоток на диск. Для этого я реализовал стандартную конвейерную архитектуру WMF от веб-камеры, которая выступает в качестве источника мультимедиа, к EVR, который действует как приемник мультимедиа. Чтобы реализовать функцию захвата файлов, я изменил простое MFT (FrameCounter MFT), чтобы также записывать входящие сэмплы в Sink Writer, если доступен объект Sink Writer. Таким образом, все данные перемещаются из источника в приемник через MFT, и, если модуль записи приемника доступен для MFT, он также будет записывать данные примера в модуль записи приемника.

MFT выполняет обработку на месте и высвобождает образец непосредственно перед возвратом из своего цикла обработки вывода. Оператор записи в приемник только использует тот же пример ввода в своем вызове WriteSample (), прежде чем произойдет выпуск.

Проблема в том, что этот код работает. Я ожидал сделать копию образца в MFT и передать его Sink Writer, чтобы он мог его выпустить. Это поднимает следующие вопросы ..

  1. Создает ли Sink Writer свою собственную копию образца или добавляет собственную ссылку на образец? Это выпускает образец, данный ему? Насколько я понимаю, Sink Writer может поставить эти образцы в очередь на некоторое время (если пожелает) перед их записью. Какова общая обработка сэмплов в вызове Sink Writers WriteSample ().

  2. Это просто случайность, что это работает сейчас, и я создаю проблемы для более поздних или на более медленных машинах? Является ли метод, описанный выше, действительным? Если нет, то какой будет рекомендуемый подход. Я не испытал никаких странных ошибок во время выполнения с этим.

  3. У меня сложилось впечатление, что при захвате данных с веб-камеры необходимо пометить временную метку на образце перед ее записью. Другими словами, первая записанная выборка должна иметь временную метку 0, а каждая последующая выборочная временная метка корректируется на основе этого. Это не кажется необходимым в этом случае. Требуется ли этот временной сброс (было ли это когда-либо)? Я отмечаю, что пример кода в демонстрационной версии FileCapture позаботится об этом. Microsoft улучшила Sink Writer в последних версиях, чтобы справиться с этим?

Я работаю на Windows 10 в C #, используя WMF.Net. Я понимаю, что это может быть особый случай с CLR и его сборкой мусора - однако я был бы признателен за любые идеи WMF (на любом языке), которые вы могли бы предложить. Выходной формат Sink Writer - H.264 - если это имеет значение.

1 Ответ

0 голосов
/ 09 сентября 2018

1 - Sink Writer на самом деле не задокументировано о том, что он делает с образцами. Для эффективности, я полагаю, это просто «AddRef» в образце. Если вы создаете новый образец после каждого захвата видео, вам просто нужно выпустить его после WriteSample. С Sink Writer проблем не будет.

2 - Для более медленных машин он работает так же. Возможно, вам придется отбросить образцы для эффективности, но это не имеет никакого отношения к выпуску образцов.

3 - Метод WriteSample из документации IMFSinkWriter явно не указывает, нужны ли время / продолжительность выборки. Так что я бы сказал, установите их при необходимости.

EDIT

Мое объяснение выше о C ++. C # COM взаимодействие - это другая история.

Я прочитал статью о interop com. Похоже, что разработчики C # не устанавливают объекты в nullptr после вызова Marshal.ReleaseComObject и повторно используют их. Они получают InvalidComObjectException. Если вы используете AddRef, Release и NULL, как в C ++, я думаю, у вас не возникнет проблем (RCW также выполняет подсчет ссылок).

Для случая, когда объект COM переписан в управляемом коде:

Насколько мне известно, компоненты MediaFoundation являются нативным кодом. Я сомневаюсь, что они меняют их на управляемый код. И даже если это произойдет, вам просто нужно подавить Marshal.ReleaseComObject или теперь использовать IsComObject.

...