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

Posted

技术标签:

【中文标题】如何确定媒体文件的持续时间?【英文标题】:How can I determine the duration of media files? 【发布时间】:2013-03-02 02:15:41 【问题描述】:

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

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

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

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

【问题讨论】:

看一下ffmpeg 大声笑,版主删除胆量 = 你手上有太多时间 【参考方案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;

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

“就 Windows API 而言,它们似乎来来去去” - 我不知道曾经有一个 单个 Windows API离开。你想到了哪一个?

以上是关于如何确定媒体文件的持续时间?的主要内容,如果未能解决你的问题,请参考以下文章

您如何确定 NAudio 1.7 中的 midi 文件持续时间(以条为单位)?

如何使用 mediainfo 以秒或其他格式查找视频文件的持续时间?

从 MemoryStream 打开音频 (wav) 文件以确定持续时间

如何播放具有确定持续时间的 MIDI 音符

如何写入/读取“设置”文本文件

如何获取音频文件的持续时间?