Je voudrais être en mesure de chercher une image arbitraire dans un fichier MPEG-2 (à partir de DVD, je suppose que cela s'appelle MPEG-2 Program Stream). Jusqu'à présent, j'utilisais OpenCV 2.1 pour accéder à ces images, mais cela ne fonctionnait que trame par image (seulement en recherche directe). Plus tard, lorsque j'ai installé OpenCV 2.3.1, cette possibilité a été perdue, c'est-à-dire limitée à AVI. De toute façon, j'aimerais le faire sans OpenCV. J'ai réussi à chercher des images-clés (je suppose) ou à tous les trames (par exemple toutes les 12 images). Maintenant, en regardant VirtualDub cadre recherche précise est possible. Il dit: '' analyser le fichier MPEG-2 entrelacé ''. Qu'est-ce que cela signifie exactement et où devrais-je commencer à faire de même? Est-ce légal même, je me souviens avoir lu quelque chose à ce sujet quelque part, je ne m'en souviens pas vraiment. Je programme en C++ en utilisant DirectShow. Autant que je sache, DirectShow ne le fera pas. Ensuite, je regardais CBaseFilter, la méthode streamtime, etc. Mais avant de plonger dans ce sujet complexe, j'aimerais savoir si c'est la bonne façon de procéder. Dans l'attente de vos réponses, merci!MPEG-2 cherchant par où commencer?
@ Geraint: extrait de code de filtre graphique:
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder);
CoCreateInstance(CLSID_MPEG2Demultiplexer,NULL,CLSCTX_INPROC,IID_IBaseFilter,(LPVOID *)&pib);
CoCreateInstance(CLSID_CMPEG2VidDecoderDS,NULL,CLSCTX_INPROC,IID_IBaseFilter,(LPVOID *)&pib2);
pGraphBuilder->AddFilter(pib,L"Sample Splitter");
pGraphBuilder->AddFilter(pib2,L"Sample Decoder");
ZeroMemory(&am_media_type, sizeof(am_media_type));
am_media_type.majortype = MEDIATYPE_Video;
am_media_type.subtype = MEDIASUBTYPE_MPEG2_VIDEO;
am_media_type.formattype = FORMAT_MPEG2Video;
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl);
pGraphBuilder->QueryInterface(IID_IMediaSeeking, (void**)(&pMediaSeeking));
pGraphBuilder->QueryInterface(__uuidof(IVideoFrameStep), (PVOID *)&fst);
pGraphBuilder->QueryInterface(IID_IMediaEvent, (void **)&imev);
pGraphBuilder->QueryInterface(IID_IBasicVideo,(LPVOID *)&ibv);
pGraphBuilder->RenderFile(FILENAME,0);
puis-je utiliser IMediaSeeking de rechercher la vid. J'ai aussi essayé le pas de cadre (d'où les références ci-dessus).
Vous dites que vous voulez rechercher une image arbitraire. Mais que veux-tu faire après avoir cherché? Est-ce que ce cadre devrait par exemple être affiché sur votre écran? Fondamentalement, j'aime savoir que vous voulez chercher dans le train de bits mpeg compressé, ou voulez-vous chercher à l'intérieur des images vidéo décodées? – wimh
bien, j'ai mentionné OpenCV (Computer '' Vision ''), donc vous pouvez imaginer que je veux chercher les cadres décodés :-) – user1331044