2013-03-02 82 views
0

是否可以確定媒體文件的持續時間?如何確定媒體文件的持續時間?

當我說媒體(視頻)文件時,我指的是以下類型的文件:.wmv,.avi。 .mp4,.flv,.mkv。當我說持續時間時,我的意思是確定視頻文件在幾分鐘和幾秒內的時間。

我知道每個文件的編碼/打包方式不同,但也許每個文件都將其持續時間存儲在標題中?是否有原生的WinAPI函數,可能允許我將這些文件讀入內存或至少檢查頭文件?我知道原生WinAPI不提供任何用於.png的API函數,所以對於電影文件也是一個很好的選擇,但你永遠不知道。

如果本機WinAPI沒有任何功能可以做到這一點,你會推薦一個C++視頻API /庫,或者你會打開文件並手動搜索標題的持續時間(即使用fopen())?

+3

在FFmpeg的 – BrokenGlass 2013-03-02 02:20:13

+0

笑,主持人在你的手中 – 2013-03-02 02:25:02

回答

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

視頻有許多不同的API。它已經有一段時間了,因爲我已經看過它,但我發現這從谷歌搜索「開源C++視頻庫」link

至於一個Windows API他們似乎來來去去,所以我個人wouldn'不依賴於他們。他們也不太可能是便攜式的。如果你一定要看看Direct 3D 11之類的東西。我知道一個流行的遊戲選項是Bink

任何這些庫都應提供所需的信息,因爲許多格式在某種類型的標頭中包含此信息。

+0

*去除氣魄=太多時間來看看「至於在Windows API他們似乎來來去去」 * - 我不會知道一個**單一的Windows API已經消失。你有哪一個想法? – IInspectable 2017-04-10 21:13:54

相關問題