Функция DIrectshow блокируется при загрузке системы

У меня есть приложение для медиаплеера на основе Directshow. Он работает очень хорошо без каких-либо проблем во время обычного воспроизведения. Но иногда я сталкиваюсь с одной проблемой, когда Mediaplayer запускается сразу после загрузки системы.

HRESULT CSDirectShow::RenderOutputPins (IBaseFilter* pFilter)
{
const char* funcName = "CSDirectShow::RenderOutputPins()";
HRESULT     hr = S_OK;

// Enumerate all pins on the source filter,
//  looking for the output pins so that I can call Render() on them
//
CComPtr< IEnumPins > pEnumPin;
if (!FAILED (pFilter->EnumPins (&pEnumPin)))
{
while (true)
{
// get the next pin
//

CComPtr< IPin > pPin;
if (pEnumPin->Next (1L, &pPin, NULL) != S_OK) break;
// I'm not interested in connected pins
//  if this pin is an unconnected output pin, then render it.
//
CComPtr< IPin > pConnectedPin;
if (pPin->ConnectedTo (&pConnectedPin) == VFW_E_NOT_CONNECTED)
{
PIN_DIRECTION pinDirection;
PIN_INFO pinInfo;
//Get the information of the pin
if (pPin->QueryDirection (&pinDirection) == S_OK
&& pinDirection == PINDIR_OUTPUT
&& pPin->QueryPinInfo(&pinInfo) == S_OK
&& strstr((char*)pinInfo.achName,"~")==NULL)
{
if (FAILED (hr = m_pGB->Render (pPin)))
{
SafeRelease(&pinInfo.pFilter);
return hr;
}
}
SafeRelease(&pinInfo.pFilter);
}
}
}
TraceMsg ("%s: exit",funcName);
return S_OK;
}

когда m_pGB-> Render (pPin) Эта функция никогда не возвращается, и она заблокирована внутри. Я подтвердил с помощью журналов. Эта проблема возникает, только когда я запускаю свое приложение сразу после загрузки. Когда возникают проблемы, если я закрываю и перезапускаю свое приложение, оно работает как чудо. Так как приложение предназначено для автоматического запуска после загрузки системы, такое поведение стало более серьезной проблемой.

0

Решение

IGraphBuilder.Render call много делает внутри, и, в частности, он перебирает перечисление потенциально подходящего фильтра, который, в свою очередь, пытается загрузить дополнительные библиотеки DLL, зарегистрированные в среде DirectShow. В таком файле могут отсутствовать зависимости или зависимости от удаленных или временно недоступных драйверов (только один пример).

Если у вас возникла тупиковая ситуация, вы можете устранить ее еще раз (отладить) и получить подробную информацию о заблокированном состоянии и об активности во время вызова Render.

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

Если вы хотите улучшить игрока на своей стороне, вам следует избегать вызова Render и строить график фильтра с меньшими приращениями — добавляя определенный фильтр и соединяющие выводы, не оставляя больших задач во власти Intelligent Connect, который в целом работает хорошо, но чувствительны к проблемам совместимости, как указано выше.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]