2013-03-02 4 views
0

Est-il possible de déterminer la durée d'un fichier multimédia? Quand je dis fichier multimédia (vidéo), je veux dire les fichiers des types suivants: .wmv, .avi. .mp4, .flv, .mkv. Et quand je dis durée je veux dire déterminer combien de temps en minutes et secondes un fichier vidéo est.Comment puis-je déterminer la durée des fichiers multimédias?

Je comprends que chaque fichier est encodé/emballé différemment, mais peut-être que chaque fichier stocke leur durée dans l'en-tête? Y at-il des fonctions WinAPI natives qui peuvent me permettre de lire un de ces fichiers en mémoire ou au moins d'inspecter l'en-tête? Je sais que WinAPI natif ne fournit aucune fonction d'API pour .png, donc c'est un peu long pour les fichiers vidéo, mais on ne sait jamais. Si le WinAPI natif n'a aucune fonction capable de le faire, recommanderiez-vous une API/bibliothèque vidéo C++ ou ouvrirez-vous simplement le fichier et fouillerez-vous l'en-tête pour la durée manuellement (en utilisant fopen())?

+3

un coup d'oeil à ffmpeg – BrokenGlass

+0

lol, les modérateurs enlever l'audace = trop de temps sur vos mains –

Répondre

1

Si vous voulez le faire en utilisant pure API Windows (comme le fait le navigateur Windows), vous devriez le faire avec l'aide de la propsys.dll.

Cela peut également être fait avec DirectShow. Comme ceci:

REFERENCE_TIME GetMediaDuration(CString filePath) 
{ 
    CComPtr<IGraphBuilder> graphBuilder; 
    if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, 
           IID_IGraphBuilder, reinterpret_cast<void**>(&graphBuilder)))) 
    { 
      CComPtr<IBaseFilter> pSource; 
      HRESULT hr = graphBuilder->AddSourceFilter(filePath, L"Source", &pSource);  

      CComPtr<IPin> pPin; 
      pSource->FindPin(L"Output", &pPin); 

      if (SUCCEEDED(graphBuilder->Render(pPin))) 
      { 
      CComPtr<IMediaSeeking> mediaSeeking; 
      hr = graphBuilder->QueryInterface(IID_IMediaSeeking, reinterpret_cast<void**>(&mediaSeeking)); 

      REFERENCE_TIME rtDur = 100; 
      if (SUCCEEDED(mediaSeeking->GetDuration(&rtDur))) 
      return rtDur; 
      } 
     } 
     return 100; 
} 
1

Il existe de nombreuses API différentes pour la vidéo. Cela fait un moment que je l'ai examiné, mais j'ai trouvé ce link à partir d'une recherche google de «bibliothèques vidéo C++ open source»

En ce qui concerne une API Windows, ils semblent aller et venir, donc je ne voudrais pas personnellement Je compte sur eux. Ils ont également très peu de chances d'être portables. Si vous devez vous pouvez jeter un oeil à quelque chose comme Direct 3D 11. Je sais qu'une option populaire pour les jeux est Bink.

N'importe laquelle de ces bibliothèques doit fournir les informations dont vous avez besoin, car de nombreux formats contiennent ces informations dans un en-tête quelconque.

+0

* « En ce qui concerne une API windows ils semblent aller et venir » * - Je ne voudrais pas connaître une API Windows ** unique ** qui a jamais disparu. Lequel avez-vous en tête? – IInspectable

Questions connexes