Control de video avi

Tengo que programar un activeX para poder editar un video avi y poder guardar un fragmento suyo. Es decir, a partir de un avi dado que dure 10 segundos, decir que me guarde el fragmento que va del 2 al 5 por ejemplo.
Tengo esta función de prueba, pero no consigo que me lo haga. Me crea el fichero de salida pero nada más. El fichero tiene 0 kb. No me graba nada.
Te mando el código de la función:
void CPlayerDlg::CrearFragmentoVideo()
{
ICaptureGraphBuilder2 *pBuild = NULL;
IGraphBuilder *pGraph = NULL;
IBaseFilter *pSrc = NULL; // Source filter
CoInitialize(NULL);
// Create the filter graph.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **)&pGraph);
// Create the capture graph builder.
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **)&pBuild);
pBuild->SetFiltergraph(pGraph);
pGraph->AddSourceFilter(L"C:\\alberto\\clock.avi", L"Source Filter", &pSrc);
IBaseFilter *ppf = NULL;
IFileSinkFilter *pSink = NULL;
pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,
L"C:\\alberto\\output.avi",
&ppf,
&pSink);
REFERENCE_TIME rtStart = INICIO,
rtStop = 3*INICIO;
pBuild->ControlStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
pSrc, // Source filter
&rtStart, // Start time
&rtStop, // Stop time
0, // Start cookie
0 // Stop cookie
);
// Render the video stream, through the compressor.
pBuild->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category
&MEDIATYPE_Video, // Media type
pSrc, // Source filter
NULL, // Compressor filter
ppf); // Sink filter (the AVI Mux)
// Run the graph.
IMediaControl *pControl = NULL;
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pControl->Run();
pSrc->Release();
ppf->Release();
pControl->Release();
pBuild->Release();
pGraph->Release();
pSink->Release();
CoUninitialize();
}
Muchas gracias

1 respuesta

Respuesta
-1
Antes que todo te comentare que al parecer tu error consiste en que no has seleccionado un dispositivo de captura. Al parecer estas trabajando con DiorectShow y lo que quieres hacer es capturar un pedazo de video.
Los pasos para hacer eso con DirectShow son:
1. Crear el componente requerido.
2. Seleccionar el dispositivo de captura
3. Crear la sección de escritura en fichero
4. Hacer el rendering.
// Crear el componente requerido
IGraphBuilder *pGraph = NULL;
ICaptureGraphBuilder2 *pBuilder = NULL;
// Crear el filtro grafico
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **)&pGraph);
//Crear el creador de la captura
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **)&pBuilder);
pBuilder->SetFiltergraph(pGraph);
// Seleccionar el dispositivo de captura
// Este ejemplo enumera los dispositivos y selecciona el primero en la lista
// Crea el enumerador de dispositivos del sistema
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
// Crea el enumerador para dispositivos de captura de video
IEnumMoniker *pClassEnum = NULL;
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
ULONG cFetched;
IMoniker *pMoniker = NULL;
IBaseFilter *pSrc = NULL;
if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
// Bind the first moniker to a filter object.
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Release();
}
pClassEnum->Release();
pDevEnum->Release();
Ahora agrega el filtro al grafico
pGraph->AddFilter(pSrc, L"Video Capture");
// Crear la seccion de escritura en fichero
IBaseFilter *ppf = NULL;
IFileSinkFilter *pSink = NULL;
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\alberto\\clock.avi", &ppf, &pSink);
//Hacer el rendering.
pBuilder->RenderStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
pSrc,
NULL,
ppf
);
// Si quieres hacer un preview utiliza esto
pBuilder->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
pSrc,
NULL,
NULL
);
//Controlando la captura
IMediaControl *pControl;
REFERENCE_TIME rtStart = 20000000,
rtStop = 50000000;
pBuilder->ControlStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
pSrc, // Source filter
&rtStart, // Start time
&rtStop, // Stop time
0, // Start cookie
0 // Stop cookie
);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pControl->Run();
Espero que te sirva de algo.
Si resuelves el problema házmelo saber.
Suerte
Hala venga! Para hacer un copy paste de la ayuda de las direct POR ya lo hice yo el primer día!. Te has limitado a cambiar los comentarios de ingles a español... ¿y tu te llamas experto?!?!?! No te jode... así me hago yo experto hasta de la NASA! No me intentes timar joder! Que bastante quemado estoy ya con esta mierda!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas