Vous pouvez utiliser les filtres Directshow pour construire un graphique qui sauvegardera l'audio en tant que .wav.
Les interfaces que vous devez utiliser sont: (Note: Cette solution va extraire l'audio à partir de fichiers AVI)
IGraphBuilder: Il sera utilisé pour construire le graphique.
IBaseFilter: Ce sera les filtres que vous initialisez pour faire partie du graphique
Pour initialiser le graphique que vous faites:
IGraphBuilder *pGraph = NULL;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph)
CLSID_FilterGraph est défini dans uuids.h qui fait partie de PaltformSDK. Une fois le graphique initialisé, vous devrez initialiser 3 filtres qui seront ajoutés dans le graphique.
Une fois le graphique initialisé, vous devrez initialiser 3 filtres qui seront ajoutés dans le graphique.
- AVI Multiplexeur: CLSID_AviDest
- fichier Writer: CLSID_FileWriter.
- Null renderer: CLSID_NullRenderer
Vous pouvez initialiser les filtres par:
IBaseFilter *pF = NULL;
CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pF);
clsid = clsid of the filter
Et ajouter le filtre graphique à l'aide:
pGraph->AddFilter(pF, name)
name = name of the filter. Can be 'AVI Mux' etc
Une fois que vous initialisez 'écrivain fichier' Filtrerez devra définir le chemin où vous souhaitez écrire le fichier. Vous pouvez le faire:
IFileSinkFilter* pFileSink=NULL;
fileWriterFilter->QueryInterface(IID_IFileSinkFilter, (void**)&pFileSink);
pFileSink->SetFileName(filepath, NULL);
Here: fileWriter = file writer filter instance.
Assurez-vous que l'extension du nom de fichier est .wav
Une fois que vous avez ajouté les filtres dans le graphique, vous aurez besoin de rendre le fichier vidéo comme:
pGraph->RenderFile(sourcePath, NULL);
Une fois rendu, vous devrez maintenant exécuter ce graphique.Vous pouvez le faire en questionnant deux interfaces du graphique:
IMediaControl Utilisé pour exécuter le filtre
et IMediaEvent Utilisé pour obtenir des événements de graphique.
Rechercher l'interface:
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
and pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
Exécuter le graphique:
pControl->Run();
et attendez que le rendu d'exécution:
pEvent->WaitForCompletion(INFINITE, &evCode);
Une fois fait, vous trouverez un fichier ayant audio au format .wav.
J'ai testé cela par graphedit et cela fonctionne. J'espère que cela aidera.
Merci pour la réponse et une explication claire. J'ai téléchargé ffmpeg mais j'ai trouvé que le wiki sur le site pour construire ffmpeg est déroutant et pas mis à jour. Vous ne savez pas quel type de bibliothèque construire (statique ou dll) mais je suppose que ce sera statique si je vais inclure la bibliothèque dans mon application pour la rendre disponible à d'autres personnes? –
Vous pouvez obtenir des binaires win32 pour ffmpeg ici: http://ffmpeg.arrozcru.org/builds/ afin que vous n'ayez pas à le construire vous-même. Il suffit de télécharger le dernier paquet binaire win32 (ffmpeg-r16537-gpl-static-win32.tar.bz2) et il contiendra "ffmpeg.exe" dans le répertoire bin. Comme il s'agit d'une construction statique, tout ce dont vous avez besoin est le fichier exe. La construction de ffmpeg sur un système li/unix est un jeu d'enfant, mais sous Windows, c'est plus difficile car vous ne pouvez pas le compiler avec le compilateur de Visual Studio, donc vous devez utiliser mingw. Je voudrais juste aller avec le binaire pré-construit. –