DirectShow и сохранение видео
От: XSega  
Дата: 21.10.08 10:15
Оценка:
Народ, помогите плиз. Мучаюсь уже две недели. Использую DirectShow, который Net(Точнее две библиотеки DirectShowLib и DexterLib).Задача собрать из нескольких роликов видео и сохранить его в avi.
Для это использую IAMTimeline для его загрузки. Сейчас видео сохраняется, но не могу понять, как настроить это сохранение(т.е выбрать разрешение кадра, FPS и т.д).Обяъясните пожалуйста. Если можно то поделитесь пожалуйста немножко кодом.Заранее огромное спасибо

pRenderEngine = gcnew RenderEngineClass();
pRenderEngine->SetTimelineObject(pTimeLine);
pRenderEngine->ConnectFrontEnd();

DexterLib::IGraphBuilder ^dfg;
pRenderEngine->GetFilterGraph(dfg );
graphBuilder = (DirectShowLib::IGraphBuilder^)dfg;

capture = (DirectShowLib::ICaptureGraphBuilder2^)gcnew DirectShowLib::CaptureGraphBuilder2();
capture->SetFiltergraph(graphBuilder);

 DirectShowLib::IBaseFilter ^enc  = CreateFilter(FilterCategory::VideoCompressorCategory, "Xvid MPEG-4 Codec");
//Добавление фильтра в граф
graphBuilder->AddFilter(enc, "Xvid MPEG-4 Codec");
                
                 
//Создание фильтра и получение его интерфейса 
DirectShowLib::IBaseFilter ^audioEncoder = CreateFilter(DirectShowLib::FilterCategory::AudioCompressorCategory, "ACM Wrapper");
//Добавление фильтра в граф
graphBuilder->AddFilter(audioEncoder, "ACM Wrapper");
                
DirectShowLib::IBaseFilter ^pMux;
IFileSinkFilter ^pSink;
capture->SetOutputFileName(MediaSubType::Avi, L"d:\\Output.avi", pMux, pSink);
                
int NumGroups;
pTimeLine->GetGroupCount(NumGroups);

                
// Loop through the groups and get the output pins.
for (int i = 0; i < NumGroups; i++)
{
    DexterLib::IPin ^pPin;
    pRenderEngine->GetGroupOutputPin(i, pPin); 
    {                    
    DirectShowLib::IBaseFilter^ pCompressor;
    capture->RenderStream(nullptr, nullptr, pPin, (DirectShowLib::IBaseFilter^)enc, pMux);
    }
}

Вот код, здесь конечно упущены моменты,которые не имеют отношение к делу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.