2010-01-22 6 views
3

Je sais qu'il ya une question similaire à la mienne: Extract wav file from video fileExtrait audio de la vidéo en wav

Je suis nouveau à C++ et comprendre au sujet de la bibliothèque COM + directX est nécessaire pour la vidéo et l'audio. Je cherchais du tutoriel et du code d'échantillons mais peu de succès.

Ma question est de savoir comment coder l'application pour prendre un fichier vidéo (tout type) et enregistré l'audio extrait comme .wav dans mon application plutôt que d'utiliser d'autres applications telles que graphedit ou virtualdub? Vous ne pouvez pas utiliser quelque chose comme ffmpeg, ou l'une des bibliothèques qu'il utilise?

Répondre

4

Je vais appuyer le mouvement pour utiliser simplement une version de ffmpeg pour effectuer l'extraction audio. Cela peut être fait en une seule commande facile, par opposition à la plupart des centaines de lignes de code (si vous allez vérifier tous les problèmes possibles qui pourraient survenir avec différents formats vidéo et codecs).

ffmpeg -i video.avi -vn soundfile.wav 

Vous pouvez utiliser libavformat et libavformat (bibliothèques derrière ffmpeg) pour faire la même chose, mais à moins que vous devez faire un peu de traitement sur l'audio brut avant la sortie en wav, il n'y aurait rien à gagner à l'exception des connaissances . Ffmpeg est sympa car l'exécutable contient tous les décodeurs audio et vidéo dont vous aurez probablement besoin, donc la solution est très portable. Vous ne l'avez pas installer des codecs ou quoi que ce soit. Le fichier vidéo d'entrée peut être dans n'importe quel format ou codec pris en charge par ffmpeg et vous n'avez pas à vous soucier de les traiter différemment dans votre code. A partir de C++, vous pouvez appeler ffmpeg en construisant la chaîne de la ligne de commande dans votre code et en lançant le processus depuis votre code (étant nouveau le C++, vous aurez probablement besoin de chercher comment faire cela, mais c'est assez facile) .

+0

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? –

+0

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. –

5

Ou peut-être mencoder, qui peut faire la même chose. Les deux ont une interface de ligne de commande pour autant que je sache, et ils peuvent aussi avoir une API ...

1

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.

  1. AVI Multiplexeur: CLSID_AviDest
  2. fichier Writer: CLSID_FileWriter.
  3. 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.

Questions connexes