Re: Опять про amcap и directshow. Как добавить кодек?
От: Saruman Россия none
Дата: 26.02.03 04:36
Оценка:
Здравствуйте, JulFar, Вы писали:

JF>Здравствуйте.

JF>1.Как заставить amcap сжимать видео? Желательно иметь возможность выбрать, каким кодеком сжимать. Кто разбирался с амкапом, подскажите, в него заложены возможности сжатия, но они не работают,
JF>(hr = gcap.pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved,
JF> gcap.pVCap, IID_IAMVideoCompression, (void **)&gcap.pVC)) или это не то?


Вот таким образом я перебирал видео компрессоры в поисках нужного мне
ICreateDevEnum *pSysDevEnum = NULL;
IEnumMoniker *pEnumCat = NULL;
ULONG cFetched = 0;
IBaseFilter* filter;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum,(void **)&pSysDevEnum);
if (FAILED(hr))
{
MessageBox("Can't create System Device Enumerator");
return;
}
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0);
if (FAILED(hr))
{
pSysDevEnum->Release();
MessageBox("Can't create Class Enumerator");
return;
}
IMoniker *pMoniker[100];
for ( int j = 0; j < 100; j++)
pMoniker[j] = 0;
pEnumCat->Reset();
pEnumCat->Next(100, pMoniker, &cFetched);
filter = 0;
for ( ULONG i = 0; i < cFetched; i++)
{
hr = pMoniker[i]->BindToObject(0, 0, IID_IBaseFilter, (void **)&filter);
if (SUCCEEDED(hr))
{
//filter->чего надо с ним делать
}
}
for ( i =0; i < cFetched; i++) pMoniker[i]->Release();
if (pEnumCat) pEnumCat->Release();
if (pSysDevEnum) pSysDevEnum->Release();

>Как в тот граф, который там строится, добавить свои фильтры?

С помощью IGraphBuilder'а добавляешь свой фильтр в пустой граф, потом рендеришь файл, и если с фильтром все нормально, то он сам подцепится куда нужно...
>А может, есть пример, лучший, чем amcap?
Кто такой амкап, я не знаю, но проще самому собирать граф с помощью интерфейса IGraphBuilder


JF>2. Еще есть такой интересный вопрос: когда мы на avimux-е смешиваем СЖАТЫЕ видео и звук, как обеспечить синхронизацию? Я пробовала строить такой граф в графедите, синхронизации никакой.

JF>Спасибо.

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