0

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

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

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

如果本机 WinAPI 没有任何功能能够做到这一点,你会推荐一个 C++ 视频 API/库,还是你只是打开文件并手动搜索标题的持续时间(即,使用fopen())?

4

2 回答 2

1

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

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

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

于 2013-03-02T02:35:30.387 回答
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;
}
于 2013-08-30T15:34:44.460 回答