如何确定媒体文件的持续时间?

时间:2013-03-02 02:15:41

标签: c++ winapi video

是否可以确定媒体文件的持续时间?

当我说媒体(视频)文件时,我指的是以下类型的文件:.wmv,.avi。 .mp4,.flv,.mkv。当我说持续时间时,我的意思是确定视频文件的分钟数和秒数。

我理解每个文件的编码/打包方式不同,但是每个文件可能会在标题中存储它们的持续时间吗?是否有本机WinAPI函数可以允许我将任何这些文件读入内存或至少检查标题?我知道原生WinAPI没有为.png提供任何API函数,因此它也是电影文件的长镜头,但你永远不会知道。

如果原生WinAPI没有能够执行此操作的任何功能,您是否会推荐C ++视频API /库,或者您是否只需打开该文件并手动搜索标题(即使用{{1} })?

2 个答案:

答案 0 :(得分:1)

视频中有许多不同的API。我已经研究了一段时间,但是我从谷歌搜索“开源C ++视频库”中找到了这个link

就Windows API而言,它们似乎来去匆匆,所以我个人不会依赖它们。它们也不太可能是便携式的。如果你必须,你可以看看Direct 3D 11之类的东西。我知道游戏的热门选项是Bink

这些库中的任何一个都应提供您需要的信息,因为许多格式都会在某种标题中包含此信息。

答案 1 :(得分:1)

如果你想使用纯Windows API(比如windows浏览器),你应该在propsys.dll的帮助下完成它。

也可以使用DirectShow完成。 像这样:

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;
}