2015-11-23 4 views
0

Je dois écrire un programme qui peut lire le fichier .ogg Vorbis à l'aide de IGraphBuilder ou de toute autre API Windows directement (en C++/Win32 API)?Comment lire les fichiers ogg Vorbis en utilisant IGraphBuilder

J'ai essayé avec IGraphBuilder mais cela ne fonctionne pas pour moi. Exemple de code:

IMediaControl *pControl = NULL; 
IGraphBuilder *pGraph= NULL; 
IMediaEventEx *pEvent= NULL; 
IMediaPosition *pMediaPosition= NULL; 

hr = ::CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
         IID_IGraphBuilder, (void **)&pGraph); 
if (FAILED(hr)) { 
    return false; 
} 

hr = pGraph->AddFilter(pFilter, L"Out"); 
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); 
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); 
hr = pGraph->QueryInterface(IID_IMediaPosition, (void**)&pMediaPosition); 

// Build the graph. 
hr = pGraph->RenderFile(mFilePath.c_str()/*"C:\\sample.ogg file"*/, NULL); 

/* here hr = 0x80040265 so SUCCEEDED(hr) didnt allow it to enter in if condition*/ 
if (SUCCEEDED(hr)) { 
    // Run the graph. 
    hr = pControl->Run(); 
    if (SUCCEEDED(hr)) { 
     // Wait for completion. 
     long evCode; 
     pEvent->WaitForCompletion(INFINITE, &evCode); 
    } 
} 

// Clean up in reverse order. 
SAFE_RELEASE(pEvent); 
SAFE_RELEASE(pControl); 
SAFE_RELEASE(pGraph); 
pGraph = NULL; 

::CoUninitialize(); 

NOTE: déclaration ci-dessus hr = pGraph->RenderFile() retourné les hr = 0x80040265 et l'état if (SUCCEEDED(hr)) ne marche permettent de jouer.

Si je n'utilise pas cette condition, alors pControl->Run() est exécuté avec le retour ID_OK. Mais rien n'a joué avec le haut-parleur. Veuillez suggérer la solution/méthode.

+1

Que signifie "ça ne marche pas pour moi"? Les erreurs? Des licornes dansent? Autre chose? –

+0

Merci pour la réponse. La fonction RenderFile() a renvoyé hr = 0x80040265. J'ai ajouté la question pour plus de clarté. – KrishPS

+1

Dans le cas de 'IGraphBuilder :: RenderFile()', ce HRESULT correspond à 'VFW_E_UNSUPPORTED_STREAM', ce qui signifie que votre configuration ne supporte pas la lecture de fichiers Ogg Vorbis. Vous devrez installer un filtre qui permet à DirectShow de lire les fichiers Ogg Vorbis, tels que [celui officiel de Xiph] (https://xiph.org/dshow/). – andlabs

Répondre

2

Faites attention aux codes d'erreur HRESULT; ils signifient quelque chose. MSDN est souvent utile avec des codes d'erreur spécifiques à la fonction comme celui que vous avez. (Avec suffisamment de programmation COM, vous serez en mesure de reconnaître les plus communs comme E_INVALIDARG de vue.) Sinon, vous pouvez utiliser vos fichiers d'en-tête pour localiser les codes d'erreur potentiels. HRESULT s ont un format spécifique; apprend le!

Dans le cas de IGraphBuilder::RenderFile(), HRESULT correspond à VFW_E_UNSUPPORTED_STREAM, ce qui signifie que votre configuration ne prend pas en charge la lecture de fichiers Ogg Vorbis. Vous devrez installer un filtre permettant à DirectShow de lire les fichiers Ogg Vorbis, tels que the official one from Xiph.Org.