Directshow захвата видео в AVI

Я пытаюсь выполнить примеры DirectShow в центре разработки Windows, чтобы создать собственное приложение, которое может захватывать экран и аудио в видео.
https://msdn.microsoft.com/en-us/library/windows/desktop/dd318627(v=vs.85).aspx

Когда я бегу через RenderStream метод терпит неудачу и HRESULT_CODE 16387

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

Я понимаю, что это не будет лучшей практикой и т. Д. Я очень увлечен C ++ и новичком в DirectShow, поэтому, пожалуйста, не будьте слишком критичны и не стесняйтесь объяснять, как будто я немного прост!

Вот код, который у меня есть:

void AudioVideoBuilder::AVBuilder::MakeVideo()
{

IGraphBuilder *pGraph = NULL;
ICaptureGraphBuilder2 *pBuild = NULL;

// Create the Filter Graph Manager.
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

if (SUCCEEDED(hr))
{
// Create the Capture Graph Builder.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
(void **)&pBuild);
if (SUCCEEDED(hr))
{
pBuild->SetFiltergraph(pGraph);
}
};
IBaseFilter *pCap = 0;
if (SUCCEEDED(hr))
{
// Create the Capture Graph Builder.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,
(void**)&pBuild);
IBaseFilter *pMux;
if (SUCCEEDED(hr))
{
hr = pBuild->SetOutputFileName(
&MEDIASUBTYPE_Avi,  // Specifies AVI for the target file.
L"C:\\Example.avi", // File name.
&pMux,              // Receives a pointer to the mux.
NULL);              // (Optional) Receives a pointer to the file sink.

if (SUCCEEDED(hr))
{
hr = pBuild->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Audio,      // Media type.
pCap,                  // Capture filter.
NULL,                  // Intermediate filter (optional).
pMux);                 // Mux or file sink filter.

if (SUCCEEDED(hr))
{
hr = pBuild->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Video,      // Media type.
pCap,                  // Capture filter.
NULL,                  // Intermediate filter (optional).
pMux);                 // Mux or file sink filter.

// Release the mux filter.
pMux->Release();

IConfigAviMux *pConfigMux = NULL;
hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux);
if (SUCCEEDED(hr))
{
pConfigMux->SetMasterStream(0);
pConfigMux->Release();
}

IConfigInterleaving *pInterleave = NULL;
hr = pMux->QueryInterface(IID_IConfigInterleaving, (void**)&pInterleave);
if (SUCCEEDED(hr))
{
pInterleave->put_Mode(INTERLEAVE_CAPTURE);
pInterleave->Release();
}
}
else
{
DWORD error = HRESULT_CODE(hr);
}
}
else
{
DWORD error = HRESULT_CODE(hr);
}
}
}
else
{
DWORD error = HRESULT_CODE(hr);
}
}

2

Решение

Как уже предположил Андрей Комягин в комментарии. Не используйте «c: \ Example.avi» в качестве целевого файла. Это может привести к ненужным проблемам, если у вас нет прав доступа для пользователя root.

Кроме того, в вашем коде вы нигде не определяете устройство захвата (устройство ввода). Переменная pCap в

pBuild->RenderStream

установлен в 0 (NULL) в вашем коде. Это должно быть устройство захвата. RenderStream ожидает устройства захвата или рендерера, никогда не NULL.
Если вы ищете код ошибки, используйте шестнадцатеричный код. 16387 — это 0x4003, что является проблемой с входным контактом. Неудивительно, что это ноль.

Смотри сюда

https://msdn.microsoft.com/en-us/library/windows/desktop/dd377566(v=vs.85).aspx

чтобы узнать, как получить устройство захвата.

2

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

Проблема здесь та же, что и в вашем новом вопросе: Directshow RenderStream "Неверный параметр" и это непреднамеренное второе создание CLSID_CaptureGraphBuilder2 пример (подробности).

Также обратите внимание, что код ошибки HRESULT значение. Это то, что объясняет состояние операции. После того, как вы попытаетесь получить строку и получить указатель на символы, указатель (0x055..., 0x099...) это не код ошибки, это просто случайный адрес без особого значения. Код является ключом.

1

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